1. XBPQ 是什么 ①、属于 TVBox 家族里的「csp_XBPQ」引擎,纯字符串规则写法,无需 Python/JS 基础。 ②、同一条规则既能让点播 App(TVBox、影视仓、Pluto)直接刮削网页,也能让直播源自动分组、嗅探。 ③、与 drpy、py 相比:学习成本最低,调试最快;与 JSON 直连相比:可逆向无接口站点。 2. 核心语法一张图 ① 截取 : 起点&&终点 ② 二次截取 : 起点&&终点||新起点&&新终点 ③ 拼接 : '+' 前后可混写字符串 / 变量 ④ 分类指定 : 默认–a&&b||电影–c&&d||电视剧–e&&f ⑤ JSON : data.list[1].name 下标从 1 开始 ⑥ 转义 : 保留字 $ # & * [ ] 前加 \\ ⑦ 变量 : {cateId} {catePg} {area} {year} {class} {by} {act} {wd} ⑧ 筛选 : 类型$类型值#剧情$剧情值 … ⑨ 嗅探词 : 多个用 # 分隔,如 m3u8#mp4#flv ⑩ 链接前缀/后缀: 自动补全相对路径 3. 字段清单(ext 内全部) | 字段 | 说明 | 示例 | | | | ------------- | -------- | -------------------------------------------------------------------------- | - | ----------------- | | 主页url | 入口 | `https://www.xxx.com` | | | | 分类url | 列表页 | `https://www.xxx.com/vodshow/{cateId}--{area}------{catePg}---{year}.html` | | | | 分类 | 自建频道 | `电影$1#电视剧$2#综艺$3#动漫$4` | | | | 筛选 | 可留空,自动识别 | `外部json 或 直接写{}` | | | | 数组 | 列表循环体 | `
&&
` | | | | 标题 | 片名 | `title="&&"` | | | | 图片 | 封面 | `data-original="&&"` | | | | 链接 | 详情页 | `href="&&"` | | | | 副标题 | 更新集数 | `&&` | | | | 嗅探词 | 正片格式 | `m3u8#mp4#flv#akamaized.net` | | | | 播放数组 | 播放线路块 | `class="stui-content__playlist clearfix">&&` | | | | 播放列表 | 单集 | `` | | | | 播放标题 | 线路名 | `h3&&/h3` | | | | 播放链接 | 真实地址 | `href="&&"` | | | | 直接播放 | 直播开关 | `1` 开启,`0` 关闭 | | | | 链接前缀/后缀 | 补全 | `http://cdn.xxx.com` / `.m3u8` | | | | 搜索url | 搜索入口 | `https://www.xxx.com/search.php?wd={wd}` | | | | 搜索数组/标题/图片/链接 | 同上逻辑 | … | | | | 二次截取 | 不同页面不同规则 | \`电影– | | 电视剧–
    &&
\` | 4. 极速模板(直接改 3 处即可上线) { "key": "极速演示", "name": "极速┃BPQ", "type": 3, "api": "csp_XBPQ", "searchable": 1, "quickSearch": 1, "filterable": 1, "ext": { "主页url": "https://www.你的目标站.com", "分类url": "https://www.你的目标站.com/vodshow/{cateId}--------{catePg}---.html", "分类": "电影$1#电视剧$2#综艺$3#动漫$4", "数组": "
&&
", "标题": "title=\"&&\"", "图片": "data-original=\"&&\"", "链接": "href=\"&&\"", "副标题": "&&", "播放数组": "class=\"stui-content__playlist clearfix\">&&", "播放列表": "", "播放链接": "href=\"&&\"", "嗅探词": "m3u8#mp4#flv" } } 分类url 就是: “告诉 TVBox,点左边哪个频道,就去加载哪一页列表”的那串网址模板。 写法只有 3 步 5 个符号,真的傻子也能会。 一、先背模板(一共 5 个符号) https://域名/目录/{cateId}--------{catePg}---.html 符号解释(按出现顺序): | 符号 | 叫法 | 作用 | | ---------- | --- | --------------------------- | | `{}` | 大括号 | **占位符**,TVBox 会自动把里面文字换成真实值 | | `cateId` | 频道号 | 对应你写的“分类”里 `$` 后面的数字 | | `catePg` | 页码号 | 翻页时 TVBox 自动 +1 | | `-` 或 `--` | 分隔线 | 照抄网站格式,几个横线就写几个 | | `.html` | 后缀 | 网站是啥就写啥,也有 `.asp` 或 `/` | 二、3 步填空白(拿真实站点练手) 1、打开网站列表页,随便点“电影”→ 第 2 页,地址栏得到: https://www.80kv.com/vodshow/1--------2---.html 2、把会变动的数字换成占位符: 原:/vodshow/1--------2---.html 模板:/vodshow/{cateId}--------{catePg}---.html 类型{cateid},剧情{calss},地区{area},年份{year},排序{by},{letter}字母,语言{lang},翻页{catepg} 3、把域名补全,放进规则: "分类url": "https://www.80kv.com/vodshow/{cateId}--------{catePg}---.html" 三、对应“分类”写法(必须配对) "分类": "电影$1#电视剧$2#综艺$3#动漫$4" 用英文 # 分隔,千万别用中文“#”,写死法(基础) 一、先搞懂“数组”到底截什么 1、打开列表页源码,找到“每一部影片”的最外层盒子。 目标:让 XBPQ 知道“从哪开始循环”。 2、写“数组”字段 原则:把“循环头”和“循环尾”分别粘进去,中间内容任意,XBPQ 会自动把两段之间的所有片段当成一条记录。 "数组": "
&&
" 二、再截“播放数据”——两大步 播放数据 = 播放数组(线路块) + 播放列表(单集) + 播放链接(真实地址) 下面用“详情页”真实源码演示:

线路①

线路②

1、先框住“线路块”——播放数组 特征:每个线路最外层相同的 " 2、再框住“单集”——播放列表 特征:每集都是 集名,用 最稳。 "播放列表": "" 3、最后拿“真实地址”——播放链接 特征:href="地址",把引号里的内容截出来。 "播放链接": "href=\"&&\"" 4、(如果地址是相对路径,别忘了加前缀) "链接前缀": "https://www.demo.com" 记住口诀: “先圈大盒子(数组),再圈小盒子(播放数组),最后拿链接(播放链接)” 下面把「写错一个字段」对应「TVBox 会怎么崩」全部列出来 | # | 写错字段 | 典型错误写法举例 | TVBox 表现 / 报错特征 | 快速验证方法 | | | | -- | ------- | --------------------------------- | --------------------------- | ----------------------------------- | - | ------- | | 1 | 主页url | 漏写 `https://` 或末尾多一个 `/` | 首次加载就提示“获取主页失败” | 电脑直接访问该地址看是否 200 | | | | 2 | 分类url | 占位符写错,如 `{catePg}` 写成 `{page}` | 点分类一直显示第 1 页,翻页不动 | 把 `{catePg}` 换成 2,手动拼 URL 看能否出第 2 页 | | | | 3 | 分类 | 用了中文符号 `电影$1;电视剧$2` | 左侧频道列表直接空白 | 确认用英文 `#` 分隔 | | | | 4 | 数组 | 前后特征串写反 / 中间缺 `&&` | 列表整页空白,日志提示“0 条数据” | 把源码粘到 Notepad++ 搜索特征串是否存在 | | | | 5 | 标题 | 把 `title="&&"` 写成 `title=&&`(漏引号) | 所有片名显示 `undefined` 或整条 HTML | 看源码里引号到底包不包 | | | | 6 | 图片 | 截到相对路径却忘记 `图片前缀` | 封面全部裂图 | 浏览器 F12 看图片地址是否完整 | | | | 7 | 链接 | 详情页相对路径没加 `链接前缀` | 点片名直接 404 | 复制 TVBox 日志里的详情地址到浏览器 | | | | 8 | 副标题 | 特征串换行符不同(Win vs Unix) | 更新集数那一行全空白 | 打开源码显示换行符,统一复制 | | | | 9 | 搜索url | 用了 `{wd}` 却大小写写错 `{WD}` | 搜索任何关键词都“无结果” | 手动 `search.php?wd=长风渡` 看能否出结果 | | | | 10 | 搜索数组 | 与主列表数组特征不同却直接复用 | 搜索页空白,日志显示“0 条” | 单独抓 `/search.php` 的 HTML 再写一套搜索特征 | | | | 11 | 播放数组 | 把 `

` 一起圈进来当尾点 | 详情页只出现 1 条线路(实际多线路) | 看源码只数 `
    ` 尾巴,别用 `

` | | | | 12 | 播放列表 | 用 `` 结果把 `` 也截入 | 每集标题出现两次“第01集第01集” | 改成 `&&` 或 `>&&<` | | | | 13 | 播放链接 | 继续用相对路径却忘 `链接前缀` | 点击播放 404,日志地址缺域名 | 复制播放页源码里的 `href` 看是否完整 | | | | 14 | 嗅探词 | 漏写 `m3u8` 只写 `mp4` | 能嗅到地址但无法播放(被 302 广告) | 在电脑抓包看实际返回是不是 `.m3u8` | | | | 15 | 链接前缀 | 末尾多写 `/` 导致 `//play` | 播放 404,地址出现双斜杠 | 统一让前缀 **无末尾斜杠**,后缀自己补 `/` | | | | 16 | 直接播放 | 直播源写成 `0` | 直播频道点进去却跳 WebView 解析 | 直播源必须 `1` | | | | 17 | 筛选 | 把 `类型$动作片` 写成 `类型=动作片` | 筛选面板空白或无法勾选 | 确认用 `$` 分隔键值,用 `#` 分隔多选项 | | | | 18 | JSON 数组 | 下标从 0 开始写 `data.list[0].name` | 片名全错位或 undefined | XBPQ 规定下标从 **1** 开始 | | | | 19 | 二次截取 | 漏写“默认–”直接写 `电影–xxx` | 非电影分类全部空白 | 第一段必须写 \`默认–规则 | | 电影–规则\` | | 20 | 转义 | 源码里已有 `"` 却忘了前加 `\` | JSON 校验直接失败,TVBox 无法导入 | 用在线 JSON 校验器先过一遍格式 | | | 嗅探词: 10 秒「浏览器抓包」自己扩 电脑 Chrome 打开影片播放页 → F12 → Network → 筛选框输入 m3u8 点播放,抓到第一条 Name 列出现 xxxx.m3u8(或 .mp4/.ts) 把 网址最后一段 复制出来,例如 https://cdn.xxx.com/202502/3f6e9.m3u8?authkey=1200 只要域名后面 第一个“?”前的后缀 → .m3u8 继续换不同站点抓 3-5 次,把新后缀累加进嗅探词,用 # 隔开即可。 实测 90% 站点 5 个词以内就能命中。实测 ≤10 个几乎无感;超过 20 个才可能在低端盒子出现 1-2 秒延迟 自己抓“当天”广告域名 电脑 Chrome 打开影片页 → F12 → Network → 点播放。 筛选框输入 m3u8 前先输入 ad(或 doubleclick、googlesyndication 等广告关键字)。 找到返回 302/200 且最前面带广告关键词的域名,例如 https://ad.mgdmt.com/xxxx 把 ad.mgdmt.com 复制下来。 直接扔进 ads 数组最前面,立即生效,不用重启盒子。 一、什么场景“必须”二次截取? 同一页里,不同分类的 HTML 结构完全不同 例:电影模块每部片在
  电视剧模块却用
如果只写一条“数组”,必定有一类空白 → 要用二次截取给每类单独指定特征串。 同一页里,置顶/推荐位结构跟普通列表不同 例:前面 6 条是“大图”,后面是普通小图;大图多一层
一次截取会把两种盒子混到一起 → 标题/图片字段错位 → 二次截取先砍掉“大图”区,再截普通区。 详情页多线路区域结构不同 例:线路①用
      线路②用
    播放数组一次只能圈一种尾巴 → 必须二次截取按线路名分别给规则。 二、语法格式(死记 5 秒) "字段名": "默认–起点&&终点||分类A–起点&&终点||分类B–起点&&终点" 每一段用 两个减号 -- 把“分类名”和“规则”分开 段与段之间用 两个竖线 || 分隔 第一段必须写 默认–(否则“其他”情况会空白) 三、完整实战:列表页“电影 vs 电视剧”结构不同 源码简化示意: 1、分类字段(先给 ID 对应关系) "分类": "电影$1#电视剧$2" 2、数组字段 —— 一次截取肯定不行,必须二次截取 "数组": "默认–
    &&
    ||电视剧–
    &&
    " 解释: 当 TVBox 请求 cateId=1(电影)时,用第一段
    &&
    当 cateId=2(电视剧)时,自动切换到第二段
    &&
    如果以后新增“综艺”区,只要继续在后面 ||综艺–新起点&&新终点 即可 四、播放页实战:多线路结构不同

    线路①

    线路②

    二次截取写法: "播放数组": "默认–
      &&
    ||线路②–
    &&
    " 标题同样可二次截取: "播放列表": "默认–
  • &&
  • ||线路②–&&" 记住核心:搜索数组 = “先圈每一块结果,再拿标题/图片/链接” 的圈地运动。 一、搜索数组到底截什么? 打开站点搜索页,随便搜“成龙”,F12 看见的结构一定是: 搜索数组就是告诉 TVBox: “把每一块
    先整体切下来,再逐条解析” 二、写搜索数组的 3 步(照抄即可) 1、圈整块(搜索数组) "搜索数组": "
    &&
    " 2、再圈 4 个常用字段(都在同一块里) "搜索标题": "title=\"&&\"", "搜索图片": "data-original=\"&&\"", "搜索链接": "href=\"&&\"", "搜索副标题": "&&" 3、补前缀(相对路径时) "搜索链接前缀": "https://www.demo.com" 一句话背下来 “先圈块(搜索数组),再圈字(标题/图片/链接),相对路径加前缀。” “免嗅探”= TVBox 不再自己去找真实播放地址,而是直接拿你“划红线”那段当最终地址。 只有网页源码里一眼就能看见 .m3u8 / .mp4 绝对路径时才用;如果地址被 JS 加密、跳转、拼接,就绝对不能开,否则播放 404。 正常嗅探(不开免嗅探) 播放链接截到: /play.php?url=aHR0cHM6Ly9jZG4uY29tL2EubTN1OA== TVBox 会继续访问 /play.php... → 再 302 跳转 → 才拿到真实 .m3u8 (需要耗时 1-3 秒,可能跳到广告) 免嗅探(开免嗅探,且写 ;;m) 播放链接截到: https://cdn.xxx.com/2025/06/a.m3u8;;m TVBox 看见 ;;m 立刻停止,直接把前面当最终地址播放 (0 秒启动,无广告) 三、什么时候可以写 ;;m(划红线为明文) ✅ 能用的场景 网页源码里直接出现: 播放 或者视频标签里: ❌ 不能用的场景 截出来是 相对路径 /play/123-1-1.html → 还要后端 302 跳转 截出来是 加密串 aHR0cHM6Ly9jZG4uY29tL2EubTN1OA== → 还要 base64 解码 截出来是 参数 /play.php?sign=xxx → 还要后端验签 截出来是 只有一段 token var url = '/2025/a.m3u8'; → 还要 JS 拼接 四、XBPQ 里具体怎么写 先确认是明文 浏览器 F12 → Elements 搜 .m3u8 或 .mp4,如果看见完整 https://... 就继续。 写播放链接,尾巴加 ;;m "播放链接": "href=\"&&\";;m" 打开 TVBox 全局开关 设置 → 播放器 → 免嗅探 打勾 (不开勾,写 ;;m 也无效) "播放链接": "