Skip to content

Repository files navigation

Yunzai Video Plugin

✨ 面向 Miao-Yunzai / TRSS-Yunzai 的链接分享自动解析插件 ✨

Node.js JavaScript Miao-Yunzai TRSS-Yunzai GitHub Stars GitHub Issues License

项目主页 · 问题反馈 · 安装 · 配置 · 开发

Important

严禁将本项目用于任何非法用途。请遵守所在地法律法规、内容平台服务协议和著作权规则,并仅处理你有权下载、保存或传播的内容。

因使用不当造成的一切责任由使用者承担,本项目维护者不承担相关责任。本项目与下列平台不存在隶属、授权或合作关系。

这是一个纯 JavaScript 的 Yunzai 插件,不需要 Python 或 NoneBot。安装后直接向机器人发送受支持的链接或 QQ 分享卡片,插件会解析信息并下载、发送其中的媒体;“懒下载”是可选模式,默认关闭。

📉 支持的平台

平台 图文 评论 视频 Live Photo 音频 / 音乐
B站
抖音
快手
微博
小红书 / RedNote
X / Twitter
AcFun
百度贴吧
知乎
堆糖
小黑盒
LOFTER
网易 BUFF
酷安
虎扑
米游社
豆瓣
5EPlay
豆包
ILLU
Linux Do
完美世界电竞
壁吧专楼吧
TapTap
网易大神
NGA
YouTube
TikTok
网易云音乐
酷狗音乐
汽水音乐
酷我音乐

标识说明

  • ✓:支持解析该类内容;具体可见内容仍受原平台权限、风控、Cookie 和分享页面限制。
  • —:该平台通常没有此内容形态,或插件未请求该模块。
  • “图文”包括动态、帖子、问答、文章、相册、链接卡、引用、投票和其他有序富文本。
  • twitter / xiaohongshu 是稳定的平台标识;配置中也接受 x / rednote5eplay 会映射为 fiveeplay

📦 安装

环境要求

项目 要求 用途
Yunzai Miao-Yunzai 或 TRSS-Yunzai 插件运行环境
Node.js >= 16.14 JavaScript 运行环境
pnpm 跟随 Yunzai 环境 安装依赖
Chrome / Chromium + Puppeteer 可选 仅用于 common / htmlrender 富文本信息卡
FFmpeg 推荐,并加入 PATH 音视频合并、转码、Live Photo
yt-dlp YouTube / TikTok / ym 需要 获取海外平台音视频

在 Yunzai 根目录执行:

git clone --depth=1 https://github.com/help660vip/Yunzai-video-plugin.git ./plugins/yunzai-video-plugin
pnpm --dir ./plugins/yunzai-video-plugin install

然后重启 Yunzai。可用下面的命令检查可选程序是否已加入运行 Yunzai 的用户环境:

ffmpeg -version
yt-dlp --version

更新插件:

git -C ./plugins/yunzai-video-plugin pull
pnpm --dir ./plugins/yunzai-video-plugin install

🎁 特性

  • 发链接即用:自动从普通文本、引用消息和 QQ JSON 分享卡片中提取链接,默认解析后立即下载并发送媒体。
  • 32 个平台:统一处理短链、图文、视频、音乐、评论与楼中楼、贴纸、Live Photo、引用、投票、AI 摘要和链接卡。
  • 有序富文本:文本、图片、视频、贴纸、链接与引用保持原有顺序,支持九宫格和长文本转发。
  • 稳定下载:动态媒体 URL 使用稳定缓存键并按文件特征识别真实格式;支持 identity 编码、严格断点续传、多 CDN 轮换、音频格式自动修正、流式大小限制、重试、FFmpeg 合并和失败降级。
  • 丰富渲染:浅色 / 深色主题、统计、评论、投票、二维码和音乐卡;浏览器不可用时自动回退到纯文本。
  • 可选懒下载:开启后先发送解析结果,只有用户发送配置的下载命令时才下载媒体,可设置提示和超时。
  • 权限控制:群黑 / 白名单、用户黑名单、平台禁用列表,以及群管理员开启 / 关闭解析命令。
  • 轻量启动:平台注册保持固定以支持锅巴热更新,解析器实例只在首次命中时初始化;解析和下载不依赖 Python、NoneBot 或浏览器。
  • 兼容扩展:保留旧版公共 API 和配置语义,并提供统一 DownloadFunc 协议,其他 Yunzai 插件可继续注册自己的解析器。

v3.2.0 原生移植更新

本版按 nonebot-plugin-parser-lite 当前 HEAD 22f6360 完整同步,包含 1.3.5 标签之后的修复,不需要 Python 或 NoneBot:

  • X / Twitter:完整解析 Article 的 Draft.js 有序正文、内嵌图片和视频;UTF-16 实体偏移在 emoji 前后仍保持正确,文章封面使用纵向富内容展示。
  • 米游社:新增 UGC 社区关卡链接解析,支持开发者、图文、视频、热度 / 好评率、评论和楼中楼;官方表情资源映射由 3070 项更新为 3154 项。
  • B站:保留替换后的地区 / 自定义 CDN 与平台返回的全部非 PCDN 原始地址;403、404、408、425、429 和 5xx 会自动轮换线路重试,普通视频和 bm 音频命令均生效。
  • 下载器:文件请求强制 Accept-Encoding: identity,严格验证 206 / 416 与完整 Content-Range,压缩响应不再错误比较传输长度;失败续传会按是否可恢复决定保留或回收临时文件。
  • 渲染与 FFmpeg:子进程支持二进制 stdin / stdout,卡片截图优先转为 JPEG 减少体积;FFmpeg 不可用时安全保留 PNG,不影响发送。
  • 贴吧表情切换为百度官方 CDN,链接卡、帖子视频和评论原始顺序同步上游;抖音视频优先使用原比例封面。

v3.1.0 原生移植更新

  • 抖音:重构 Web 作品解析,新增直播、评论、Live Photo 循环、嵌入播放链接,并避免把作品原声重复当作独立音乐发送。
  • X / Twitter:新增评论与楼中楼、链接卡片、长文 / 文章、文章封面,以及引用和转发内容递归解析。
  • 快手新增评论与子回复;小黑盒新增 Live Photo;米游社完整迁入 3070 条官方表情资源映射。
  • 百度贴吧、Linux Do、米游社和壁吧专楼吧继续支持引用、链接卡和投票;BUFF 话题参数、酷我音乐解析及网易云音质重试已同步修正。
  • 下载器新增查询参数感知的稳定缓存、真实媒体格式识别、续传大小容差和音频格式转换;懒下载与平台凭据请求继续使用并发合并。
  • 渲染器不再预先创建封面路径,链接预览图按原比例展示;浏览器只作为可选的信息卡渲染器,不参与平台解析。
渲染效果

固定测试夹具生成的实际渲染截图:

浅色主题 深色主题
浅色主题渲染截图 深色主题渲染截图

parser_render_type: default 使用纯文本;commonhtmlrender 使用 Puppeteer 信息卡;htmlkit 保留旧配置语义并在不可用时回退。Puppeteer 或浏览器启动失败时也会自动降级,不影响媒体发送。

🔞 海外平台 R18 拦截

R18 拦截默认开启,但只检查配置列表内的海外平台twitteryoutubetiktok。国内平台默认完全绕过 R18 和关键词判断,不会因为正文包含同类词语而被插件拦截。

  • X / Twitter:命中 possibly_sensitive、成人警告或高置信 R18 标签时拦截。
  • YouTube / TikTok:命中 age_limit >= 18、明确年龄限制或高置信 R18 / NSFW 标签时拦截。
  • 引用和转发内容会递归检查,任意一层命中都会停止整条解析。
  • 检查发生在封面、头像和媒体下载之前;命中后只回复:检测到受限内容,已停止解析。
  • 拦截缓存是匿名标记,不会发送标题、封面、来源链接或具体命中原因。

Warning

该功能依赖平台返回的元数据和文本标志,不调用外部图片审核服务。若平台未标记内容,且风险信息只存在于图片或视频画面中,仍可能漏判。它是降低误解析风险的安全门,不是内容审核服务。

要增减受检查的海外平台,请修改 parser_r18_platforms;不要把国内平台加入列表,除非你明确需要改变上述默认边界。

⚙️ 配置

配置文件位于 config/config.yaml。手动编辑文件后需重启 Yunzai;通过锅巴网页保存则会立即热更新,无需重启。下方仅概览常用分组;完整字段、默认值和注释请展开或直接查看配置文件。

锅巴网页配置

安装并启动 Guoba-Plugin 后,后台会自动发现 Yunzai Video Plugin。页面可调整全部解析配置,包括平台启停、Cookie、下载、缓存、去重、渲染及海外 R18 策略。

  • 保存成功后配置立即生效,平台和懒下载命令不需要重启。
  • Cookie 与带认证信息的代理只显示遮罩;不重新填写就不会覆盖原值,清空输入则删除该配置。
  • 已知的其他机器人账号可以加入 parser_blacklist_users,避免机器人之间互相解析链接。
完整配置说明
分组 配置项 说明
凭据 parser_bili_ckparser_ytb_ckparser_xhs_ckparser_zhihu_ckparser_linuxdo_ck 对应平台 Cookie,可留空
网络 parser_proxyparser_max_retriesparser_max_sizeparser_duration_maximum 代理、重试及下载限制
发送 parser_need_upload*parser_use_base64parser_need_forward_contents 上传与消息发送方式
展示 parser_render_typeparser_day_range、字体、Emoji、URL、二维码 信息卡和附加内容
下载 parser_lazy_download*parser_download_commandparser_live_photo 懒下载及 Live Photo
过滤 parser_disabled_platformsparser_blacklist_users、群名单、R18 配置 解析范围和安全门
缓存 parser_cache_retention_hoursparser_cache_max_mb 默认保留 24 小时,最大 1 GiB
去重 parser_dedup_enabledparser_dedup_window_seconds 同机器人、同群默认 30 秒静默去重
平台 B站画质 / 编码 / CDN 等 平台专用选项

默认是“直接解析并下载”:

parser_lazy_download: false

如需先看解析卡、再由发送链接的用户决定是否下载:

parser_lazy_download: true
parser_lazy_download_tip: true
parser_lazy_download_timeout: 30
parser_download_command:
  - xz
  - 下载

parser_need_upload 是兼容旧版的音视频总开关。配置文件中显式设置 parser_need_upload_audioparser_need_upload_video 时,独立开关优先。

Cookie 与数据安全

Warning

Cookie 具有账号权限,配置文件以明文存储。请勿截图分享、提交到 GitHub 或发送给不可信第三方;反馈问题前务必脱敏。

  • blogin 获取的 B站凭据保存在 data/bilibili_cookies.json
  • YouTube Cookie 会转换到 config/ytb_cookies.txtyt-dlp 使用。
  • 群开关、媒体缓存和渲染缓存位于 data/。插件启动、每天 01:00 及解析期间都会检查缓存;默认删除超过 24 小时的文件,并在超过 1 GiB 时优先清理最旧文件。
  • data/ 被 Git 忽略,但 config/config.yaml 会被版本控制追踪,不要写入准备公开的真实凭据。

🎉 使用

默认无需命令:直接发送链接或分享卡片,插件会发送信息卡并下载媒体。

命令 参数 权限 / 场景 说明
@机器人 开启解析 主人 / 群主 / 管理员,群聊 在当前群名单模式下开启解析
@机器人 关闭解析 主人 / 群主 / 管理员,群聊 在当前群名单模式下关闭解析
bm BV号 [分P] BV 号,可选分P序号 全部用户 提取 B站音频并发送语音
ym YouTube链接 YouTube 链接 全部用户,需 yt-dlp 提取 YouTube 音频并发送语音
blogin 仅主人私聊 扫码获取并保存 B站凭据
xz / 下载 开启懒下载后、原请求用户 下载最近一次等待中的解析媒体

群名单逻辑:

  • parser_group_blacklist_enabled: true:群黑名单模式,默认所有群开启,名单内关闭。
  • parser_group_blacklist_enabled: false:群白名单模式,默认所有群关闭,名单内开启。
  • 用户黑名单 parser_blacklist_users 优先于群名单。
  • 同一机器人账号在同一群内,30 秒内解析到相同平台内容 ID 时只发送一次;短链和原始链接也会归并。不同群和不同私聊用户互不影响。
  • 本插件只能阻止自身重复响应,无法控制其他独立机器人是否同时回复原消息;请把已知机器人账号加入用户黑名单。

🧩 自定义解析器

其他 Yunzai 插件可以从 lib/public.js 导入公共模型、CreatorDownloadFuncBaseParser 和注册器。旧版 ParseResultPathTaskcontentstextgraphics 调用方式继续有效;新解析器可使用有序 content、评论、统计、投票、贴纸和 Live Photo,并通过可选 contentId 提供稳定的内容去重标识。自定义下载函数可用 DownloadFunc(factory, { url, extHeaders, cacheKey }) 暴露原始 URL、请求头和稳定缓存键。

import { BaseParser, registerParser } from "../yunzai-video-plugin/lib/public.js"

class ExampleParser extends BaseParser {
  static platform = { name: "example", displayName: "示例" }
  static handlers = [{
    keyword: "example.com",
    pattern: /example\.com\/video\/(?<id>\w+)/,
    method: "parse",
  }]

  async parse(match) {
    return this.result({
      contentId: match.groups.id,
      title: match.groups.id,
      author: this.createAuthor("示例作者"),
      content: [this.createVideo("https://example.com/video.mp4")],
    })
  }
}

registerParser(ExampleParser)

🛠 开发

pnpm install
pnpm run check
pnpm test
git diff --check

主要目录:

.
├─ index.js          # Yunzai 插件入口、命令与定时任务
├─ config/           # 用户配置
├─ lib/core/         # 模型、注册、下载、缓存、安全与消息适配
├─ lib/parsers/      # 32 个平台解析器
├─ lib/render/       # 纯文本与 Puppeteer 信息卡渲染
├─ resources/        # 字体、图标和兜底资源
├─ scripts/          # 开发检查脚本
└─ tests/            # 固定夹具与自动化测试

提交问题时,请提供 Yunzai / Node.js / FFmpeg / yt-dlp 版本、链接类型和已脱敏的完整日志。请勿公开 Cookie、Token、QQ 号或其他敏感信息。

🎊 致谢

本项目以 MIT License 发布。欢迎提交 Issue、Pull Request,或在 GitHub 点一个 Star。

About

面向 Miao-Yunzai 与 TRSS-Yunzai 的多平台链接解析插件,支持 B站、抖音、快手、微博、小红书、YouTube 等平台,可自动识别链接与分享卡片,发送视频、音频和图文内容,并提供信息卡渲染、群聊开关及缓存清理功能。

Topics

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages