Bilibili Messager | B站私信助手

Polar Sponsor
爱发电 赞助
.NET 9.0

通过浏览器自动化发送B站私信、回复消息、读取聊天记录

Bilibili Messager | B站私信助手

功能概述

Bilibili Messager | B站私信助手是一项面向实际任务的技能,主要用于⚠️ 安全声明;本技能通过已登录的 Bilibili 浏览器会话读写私信;

核心要点

  • 只使用独立的 openclaw profile(不混用其他账号);
  • 发送前必须两步验证确认目标账号和消息内容;
  • 读取模式仅用于你愿意暴露给 agent 的会话内容;

使用与执行

不要用于读取高度敏感或非自愿的私人对话;前置要求 | Prerequisites;Browser prof。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

结果检查与注意事项

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。

Bilibili Messager | B站私信助手

⚠️ 安全声明

本技能通过已登录的 Bilibili 浏览器会话读写私信。

限制:

  • 只使用独立的 openclaw profile(不混用其他账号)
  • 发送前必须两步验证确认目标账号和消息内容
  • 读取模式仅用于你愿意暴露给 agent 的会话内容
  • 不要用于读取高度敏感或非自愿的私人对话

前置要求 | Prerequisites

条件 说明
Browser profile 必须使用 openclaw profile(已通过 browser 工具启动并登录 Bilibili)
登录状态 Bilibili 账号已在 openclaw profile 中保持登录态
账号确认 发送操作前,技能会要求用户明确确认目标账号和消息内容

为什么需要 openclaw profile?

本技能通过在 Bilibili 私信页面执行 DOM JavaScript(querySelector、innerText、click 等)实现消息读取和发送。这些操作需要浏览器环境持有有效的 Bilibili 登录会话。

  • openclaw profile 由 OpenClaw 启动和管理,独立于 Morois 的日常浏览器 profile
  • 技能仅在 Bilibili 私信页(message.bilibili.com)域内执行 DOM 操作,无法访问其他网站
  • 任何对外发送操作均需用户明确确认,不会自动发送

模式 | Mode

读取本 SKILL.md 后,先确认当前任务属于哪种模式,再跳转对应章节执行。

模式 说明
send 发送新私信(必须两步验证)
reply 回复现有会话中的消息(必须两步验证)
read 读取聊天记录(只读,不写入任何内容)

通用原则 | General Principles

  1. Browser profile:使用 openclaw profile(已登录 Bilibili)
  2. 两步验证:发送类操作(send / reply)必须两步验证,不可跳过
  3. 只读优先:读取聊天记录使用 read 模式,不执行任何写入操作
  4. 发送前确认:执行任何对外发送前,必须先向用户确认目标账号和消息内容

发送私信 | Mode: Send

步骤 1:打开私信页并确认登录

browser action=open targetUrl=https://message.bilibili.com/#/whisper

检查页面是否跳转到登录页。若跳转到登录页,停下来让用户完成登录。

步骤 2:找到目标会话

在左侧会话列表中找到目标联系人。可以通过文字搜索或滚动列表。

  • 使用 browser action=act evaluate 配合 DOM 查询找到目标会话
  • 找到后点击进入会话

步骤 3:两步验证(强制,必须执行)

第一步(AI 内部执行,不输出给用户)

  • 确认已正确进入目标会话(检查 URL 包含 mid 参数或页面标题显示对方名字)
  • 确认消息内容已准备完毕
  • 检查消息长度(不超过 500 字)

第二步(输出给用户,等待明确确认)

向用户汇报以下全部内容,确认前不得写入或发送:

汇报项 内容
目标账号 会话对方的名字
消息内容 将要发送的完整内容
字数 是否在 500 字以内

确认标志:用户明确回复「好」「确认」「发」「发吧」「发送」等。

步骤 4:写入消息

使用 innerText 方式写入(经验证有效):

() => {
  var editor = document.querySelector('.content-input, [contenteditable="true"]');
  if (!editor) return 'editor not found';
  editor.focus();
  editor.innerText = '消息内容';
  editor.dispatchEvent(new Event('input', {bubbles: true}));
  return 'typed';
}

步骤 5:点击发送按钮

() => {
  var btns = document.querySelectorAll('button, [class*="btn"]');
  for (var btn of btns) {
    if ((btn.textContent || '').includes('发送')) {
      btn.click();
      return 'sent';
    }
  }
  return 'send button not found';
}

注意:

  • ❌ navigator.clipboard.writeText() + execCommand('paste') — 对B站无效
  • ❌ Enter 键发送 — 对B站无效
  • ✅ 直接设置 innerText + 触发 input 事件 — 成功

步骤 6:验证发送结果

  • 发送成功后,消息会出现在聊天窗口中
  • 侧边栏会话列表的预览也会更新

回复消息 | Mode: Reply

回复与发送流程基本相同,区别在于:

  1. 先用 read 模式确认要回复的消息内容
  2. 在对应会话中打开对话
  3. 后续步骤同发送流程(步骤 3 两步验证 → 步骤 4 写入 → 步骤 5 发送)

读取聊天记录 | Mode: Read

步骤 1:打开私信页

browser action=open targetUrl=https://message.bilibili.com/#/whisper

步骤 2:找到并打开目标会话

在左侧会话列表中找到目标联系人,点击进入。

步骤 3:提取聊天记录

⚠️ 核心原则:判断发送方归属,100% 依赖 DOM class 名称,不靠语义内容猜测。

发送方归属规则(重要,必读)

B站消息 DOM 结构说明

B站私信页面上,每条消息是一个 HTML 元素,该元素的 class 属性包含判断归属的关键信息。

class 名称的格式一(我发的消息):

class="_Msg_o7f0t_1 _MsgIsMe_o7f0t_9"
  • _Msg_o7f0t_1:消息容器(固定前缀 _Msg_ + 会话ID o7f0t + 数字 1)
  • _MsgIsMe_o7f0t_9:附加标记,表示"这条消息是当前登录用户发的"

class 名称的格式二(对方发的消息):

class="_Msg_o7f0t_1"
  • 只有 _Msg_ 开头的容器 class,没有 _MsgIsMe_ 标记
  • 表示这条消息是对方发的

关于会话ID(上面例子里的 o7f0t):

  • 会话ID是B站为每个私信会话分配的随机字符串,不同会话ID不同
  • 代码中用 [a-z0-9]+ 匹配(ID只包含小写字母和数字)
判断规则(4步)
  1. 找到所有顶级消息容器:

    • 用 CSS 选择器 [class*="_Msg_"] 找到所有包含 _Msg_ 的元素
    • 再用正则 _Msg_[a-z0-9]+_d+ 过滤,只保留顶级容器
      • 匹配成功举例:_Msg_o7f0t_1、_Msg_abc123_42、_Msg_x_99
  2. 判断发送方归属:

    • 如果该元素的 class 里包含 _MsgIsMe_,则这是一条我发的消息(Morois / 当前登录用户)
    • 如果该元素的 class 里不包含 _MsgIsMe_,则这是一条对方发的消息
  3. ❌ 禁止用左右位置判断:

    • B站的消息布局可能产生误导——例如对方发的消息有时也会渲染在右侧
    • 永远不要用"左侧/右侧"或"left/right"作为判断依据
    • 只用 _MsgIsMe_ 有没有出现来判断
具体 class 名称示例
class 名称 含义
_Msg_o7f0t_1 消息容器,会话ID是 o7f0t,序号1
_Msg_o7f0t_1 _MsgIsMe_o7f0t_9 我发的消息(morois发的),有 _MsgIsMe_ 标记
_Msg_abc123_42 消息容器,会话ID是 abc123,序号42,对方发的
_Msg_x_7 消息容器,会话ID是 x,序号7,对方发的
_MsgIsMe_x_15 我发的消息(morois发的),会话ID是 x,序号15
提取脚本(完整示例)
() => {
  const containers = Array.from(document.querySelectorAll('[class*="_Msg_"]'))
    .filter(el => el.className.match(/_Msg_[a-z0-9]+_d+ /));

  const results = [];
  for (const el of containers) {
    const cls = el.className + '';

    // 关键判断:有 _MsgIsMe_ → 我发的;没有 → 对方发的
    const isMe = cls.includes('_MsgIsMe_');
    const sender = isMe ? '【我方/Morois】' : '【对方】';

    // 提取时间
    const timeEl = el.querySelector('[class*="_Msg__Time_"]');
    const time = timeEl ? timeEl.textContent.trim() : '';

    // 提取消息内容(可能有多个 Content class,取非重复内容)
    const contentEls = el.querySelectorAll('[class*="_Msg__Content_"]');
    const texts = [];
    for (const c of contentEls) {
      const t = (c.textContent || '').trim().replace(/s+/g, ' ');
      // 排除时间格式的内容(如"2026年3月28日 18:00")
      if (t && !t.match(/^d{4}年/)) texts.push(t.slice(0, 200));
    }
    const uniqueTexts = [...new Set(texts)];
    const text = uniqueTexts.join(' | ');

    if (text) results.push({ sender, time, text });
  }
  return results;
}
注意事项
  • 保留所有消息类型:文本、视频分享、图片、卡片等,不要因为不是纯文本就丢弃
  • 结合时间戳重建时间线
  • DOM 结构变化时,参考常见问题 → 页面布局变了

常见问题

找不到编辑器

B站私信页面的编辑器可能出现在不同位置。尝试:

() => {
  const selectors = [
    '.content-input',
    '[contenteditable="true"]',
    '[class*="editor"]',
    '[class*="input"]'
  ];
  for (const sel of selectors) {
    const el = document.querySelector(sel);
    if (el) return sel + ' found: ' + el.className;
  }
  return 'no editor found';
}

找不到发送按钮

发送按钮可能没有稳定的 class 或 ref。查找包含"发送"文字的按钮:

() => {
  const btns = document.querySelectorAll('button, [class*="btn"], [class*="send"]');
  for (const btn of btns) {
    if ((btn.textContent || '').includes('发送')) {
      return 'found: ' + btn.className;
    }
  }
  return 'send button not found';
}

页面布局变了(DOM 结构诊断)

如果脚本返回空结果或找不到元素,按以下顺序诊断:

  1. 先快照:用 browser action=snapshot 获取当前页面完整 DOM
  2. 找消息容器:在快照中搜索 _Msg_ 或 message
  3. 找编辑器:搜索 contenteditable、input、editor
  4. 找发送按钮:搜索 发送 文字或 button
  5. 根据诊断结果:用实际找到的 class/name 重写选择器

诊断脚本:

() => {
  return {
    msgs: Array.from(document.querySelectorAll('[class*="Msg"]')).slice(0,3).map(el=>el.className),
    editor: document.querySelector('[contenteditable="true"]') ? 'found' : 'not found',
    btns: Array.from(document.querySelectorAll('button')).map(b=>b.textContent.trim()).filter(t=>t)
  };
}

安全与隐私 | Security & Privacy

浏览器会话凭据声明

本技能依赖已登录的 Bilibili 浏览器会话作为账户凭据。使用前请确认:

  1. 确认登录账户:发送操作前,先确认当前登录的是正确的 Bilibili 账户
  2. 使用专用 profile:必须使用独立的 openclaw profile,不与日常浏览器混用
  3. 用完后清理:
    • 关闭 openclaw profile 的浏览器标签页即可
    • 不再使用时,可清除该 profile 的 Bilibili 登录态

数据披露

  • 读取聊天记录会将私信内容暴露到 agent 上下文,仅读取你愿意分享的内容
  • 浏览器自动化操作仅在 Bilibili 域(message.bilibili.com)内执行,不访问其他网站
  • 不要用于读取高度敏感或非自愿的私人对话

限制与注意事项

  • 消息长度限制 500 字,超长需分段发送
  • 避免高频发送
  • 读取记录时优先保证归属和类型正确,再追求历史深度
  • 发送前必须用户明确确认目标账号和消息内容

相关专题

更多
b站看视频入口合集
b站看视频入口合集

本专题整合了b站哔哩哔哩相关入口合集,阅读下面的文章查看更多入口。

2025.12.26

29445

14

b站调整视频清晰度
b站调整视频清晰度

网页端需将鼠标移至播放器右下角,点击“清晰度”按钮并选择所需画质;手机App则在视频播放页面点击右上角“三横线”菜单或双击屏幕调出控制栏,进入“清晰度”选项进行切换。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.11.28

2633

8

b站在线人数怎么查看 b站在线人数在哪里看
b站在线人数怎么查看 b站在线人数在哪里看

查看方式:1、进入任意一个视频播放页面;2、将视频全屏后,在线观看人数会显示在视频标题下方。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.10.13

9008

6

b站一起看功能位置
b站一起看功能位置

b站一起看位置: 打开B站App,进入想看的视频播放页。 点击右上角 「…」 或 「三个点」。 选择 「一起看」,创建房间或邀请好友加入。

2025.04.24

7755

19

b站入口直接进入
b站入口直接进入

b站入口直接进入设置方法:1. 电脑端浏览器:添加书签或设置浏览器首页为B站网址;2. 手机端APP:开启自动登录或将B站应用添加到手机桌面。想了解更多相关内容,请阅读专题下面的文章。

2025.04.24

82759

9

b站影视入口
b站影视入口

本专题整合了b站影视的相关内容,请阅读专题下面的文章。

2025.03.26

45848

24

b站怎么看直播回放
b站怎么看直播回放

观看直播回放方法:1. 访问 b 站,点击 "直播" 选项卡;2. 在搜索栏中输入直播名称或主播用户名;3. 点击 "回放" 或 "录播" 按钮;4. (可选) 调整播放设置;5. 享受回放。想了解更多b站的相关内容,可以阅读本专题下面的文章。

2024.08.06

17962

26

b站在线观看人数在哪
b站在线观看人数在哪

b站在线观看人数可在视频播放页面的“观看”按钮旁查看,该数字实时更新,仅统计播放页面观看者。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.05.07

3714

7

B站自动续费怎么取消
B站自动续费怎么取消

取消B站自动续费的步骤先登录B站账号、进入个人中心、进入账户设置、找到会员相关设置、取消自动续费、确认取消和完成取消。本专题为大家提供b站相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.11

1057

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程