Lanerc Desktop 片源接入 API 文档 版本:v1.0 · 更新日期:2026-11-15 适用程序:Lanerc Desktop(Python + PyQt6 桌面客户端)
⚠️ 重要声明:本文档及配套代码仅供学习、交流、技术研究使用。
本项目不提供、不存储、不传播任何影视资源,仅演示客户端如何解析第三方公开采集接口。
文档中出现的接口均为第三方站点公开提供的采集接口,其内容版权归原权利人所有。
严禁将本文档或相关代码用于商业用途、付费分发、盗链、批量抓取或任何侵犯版权的行为。
请在下载/测试后 24 小时内删除相关数据与代码,遵守所在地法律法规及目标站点的服务条款。
使用本项目造成的任何法律、账号或数据风险,由使用者自行承担。
1. 架构总览 客户端把「数据源」抽象成统一接口,同一套 UI 可以切换不同片源:
数据源类型
source_type
客户端类
说明
在线片源(苹果CMS)
cms
CmsClient
默认模式,对接公开的苹果CMS v10 采集接口
Lanerc 官方接口
lanerc
ApiClient
需自行填写 Base URL 与签名,官方域名目前不可达
离线演示
demo
MockClient
内置原创假数据,完全离线,用于 UI 开发调试
统一接口契约(三种客户端均实现):
1 2 3 4 5 6 7 8 9 10 11 12 config() -> dict home() -> {"banners" : [Vod], "sections" : [(title, [Vod])], "total" : int } search(keyword, page=1 ) -> {"items" : [Vod], "has_more" : bool , "total" : int } filter_vods(type_name="" , page=1 ) -> {"items" : [Vod], "has_more" : bool } rank(page=1 ) -> {"items" : [Vod], "has_more" : bool } week() -> {"days" : {day: [Vod]}, "order" : [day]} detail(vod_id) -> Vod play(vod_id, video_id) -> {"url" , "play_url" , "video_id" , "line" , "source" , "player" , "err" } comments(video_id, page=1 ) -> [{"user" , "text" , "time" , "likes" }] login(account, password) -> dict logout() -> None user_info() -> dict
归一化模型:
模型
字段
说明
Vod
vod_id
片源内唯一 ID(字符串)
name
番剧名
pic
封面图 URL,可为空
remarks
更新状态,如「更新至第 7 集」
year / area / class_name
年份 / 地区 / 分类
score
评分为字符串,空串表示无评分
blurb
简介(已去除 HTML 标签)
episodes
list[Episode]
Episode
video_id
剧集标识;CMS 模式下即播放直链
name
剧集名,如「第 01 集」
url
播放地址
2. 苹果CMS(MacCMS v10)采集接口 这是当前默认且实测可用的数据源。
2.1 请求约定
请求方法:GET
接口地址:{base}/api.php/provide/vod/(部分站点为 /provide/vod/)
返回格式:application/json(个别站点 content-type 标成 text/html,但正文仍是 JSON)
建议请求头:
1 2 User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...Accept : application/json, text/plain, */*
2.2 通用查询参数
参数
必填
说明
ac
是
操作类型:list(分类/轻量列表)、detail(详情/完整列表),老接口用 videolist
pg
否
页码,从 1 开始
wd
否
搜索关键词,支持剧名
t
否
分类 ID,来自分类接口的 type_id
ids
否
指定剧集 ID,多个用逗号分隔;ac=detail&ids=123 用于取单条详情
by
否
排序字段,如 score、hits、time
order
否
排序方向:asc / desc
2.3 响应包络 1 2 3 4 5 6 7 8 9 { "code" : 1 , "msg" : "数据列表" , "page" : 1 , "pagecount" : 8197 , "limit" : "20" , "total" : 163936 , "list" : [ ] }
字段
类型
说明
code
int
1 表示成功;0 或其他值表示失败,原因见 msg
msg
string
提示信息
page
int
当前页
pagecount
int
总页数,用于判断 has_more
limit
string/int
每页条数
total
int
总记录数
list
array
数据数组,元素结构见 2.4
2.4 剧集字段(list 元素)
字段
类型
客户端用途
vod_id
int
唯一 ID
vod_name
string
番剧名
vod_pic
string
封面;可能为空或以 // 开头
vod_remarks
string
更新状态
vod_year
string
年份;可能为空,回退取 vod_pubdate 前 4 位
vod_area
string
地区
vod_class / type_name
string
分类名
vod_score
string
评分,0 / 0.0 视为无评分
vod_content
string
简介(含 HTML,客户端会清洗)
vod_play_from
string
线路名,多线路用 $$$ 分隔
vod_play_url
string
播放地址串,格式见 2.7
vod_time
string
更新时间,用于「时间表」分组
vod_pubdate
string
上映日期,可能带 (日本) 等后缀
vod_weekday
string
更新星期(1–7,部分站点为空)
vod_hits
int
播放量,可作为热度排序依据
2.5 分类列表
响应额外包含 class 数组:
1 2 3 4 5 6 7 8 9 { "code" : 1 , "class" : [ { "type_id" : 39 , "type_pid" : 0 , "type_name" : "动漫片" } , { "type_id" : 41 , "type_pid" : 39 , "type_name" : "日韩动漫" } , { "type_id" : 40 , "type_pid" : 39 , "type_name" : "国产动漫" } , { "type_id" : 42 , "type_pid" : 39 , "type_name" : "欧美动漫" } ] }
客户端会缓存分类,并按以下优先级挑选动漫分类作为首页/榜单/时间表的默认范围:
1 日韩动漫 → 国产动漫 → 欧美动漫 → 港台动漫 → 海外动漫 → 动画片 → 动漫
若站点没有动漫分类,则自动回退到全站最新数据。
2.6 列表、搜索、分页 1 2 3 4 5 6 7 8 # 最新番剧(指定动漫分类) GET {base}?ac=detail&pg=1&t=41 # 关键词搜索 GET {base}?ac=detail&pg=1&wd=火影 # 按评分/热度 GET {base}?ac=detail&pg=1&t=41&by=hits&order=desc
判定是否还有下一页:
1 has_more = page < pagecount
2.7 详情与播放地址格式 1 GET {base}?ac=detail&ids=165238
vod_play_url 是紧凑编码的剧集列表:
1 第01集$https://cdn.example.com/a/0001/index.m3u8#第02集$https://cdn.example.com/a/0002/index.m3u8
规则:
分隔符
含义
$$$
分隔不同播放线路,与 vod_play_from 一一对应
#
分隔同一线路的多集
$
分隔「集名」与「播放地址」,只按第一个 $ 切分
解析伪代码:
1 2 3 4 for group in vod_play_url.split("$$$" ): for part in group.split("#" ): name, url = part.split("$" , 1 ) episodes.append(Episode(video_id=url, name=name, url=url))
优先选择线路名包含 m3u8 的线路;
无集名时自动补「第 N 集」;
非 http(s) 开头的条目会被丢弃;
vod_play_url 为空时,详情页仍可浏览,但「选集」为空,播放会提示无可用剧集。
2.8 播放地址解析 play() 会按顺序尝试把剧集地址变为可直连的视频流:
地址包含 .m3u8 或 .mp4 → 直接返回;
地址的 query 中有 url= / src= / play= / m3u8= 参数 → 解码后若是媒体直链则返回;
地址是播放网页 → 拉取 HTML,正则匹配第一个 https?://...m3u8...;
全部失败 → 抛出「该剧集的地址不是可直连的视频流,无法内置播放」。
实测:多数采集接口直接提供 m3u8,无需第 3 步;若目标站点启用了防盗链、IP 限制或签名过期,播放会失败,属于源站行为,与本客户端无关。
2.9 客户端页面映射
页面
数据来源
说明
首页 Banner
ac=detail&pg=1&t=动漫分类 前 6 条有封面的记录
右侧展示真实封面
本季新番
上面前 18 条
按站点更新时间倒序
最新更新
同分类 pg=2 前 18 条
国产动漫
第二动漫分类 pg=1 前 18 条
分类名直接作为分区标题
搜索
ac=detail&wd=关键词
支持分页加载
排行榜
ac=detail&t=动漫分类&by=hits&order=desc
客户端再按评分/播放量排序,取前 30
时间表
动漫分类 pg=1..3
按 vod_time 的星期分组,今天排在最前
详情
ac=detail&ids=ID
无评论接口,详情页隐藏评论区
2.10 已适配的公开片源 以下地址在 2026-11-15 实测可返回 JSON,且首个剧集的 m3u8 可下载到分片:
名称
API 地址
暴风资源(默认)
https://bfzyapi.com/api.php/provide/vod/
魔都资源
https://www.mdzyapi.com/api.php/provide/vod/
荣耀资源
https://cj.rycjapi.com/api.php/provide/vod/
极速资源
https://jszyapi.com/api.php/provide/vod/
光速资源
https://api.guangsuapi.com/api.php/provide/vod/
这些是第三方站点,可用性、内容与合规性均不受本项目控制。接口随时可能失效、更换域名或开启鉴权。
2.11 curl 示例 1 2 3 4 5 6 7 8 9 10 11 curl "https://bfzyapi.com/api.php/provide/vod/?ac=list&pg=1" curl "https://bfzyapi.com/api.php/provide/vod/?ac=detail&pg=1&t=41" curl "https://bfzyapi.com/api.php/provide/vod/?ac=detail&wd=火影&pg=1" curl "https://bfzyapi.com/api.php/provide/vod/?ac=detail&ids=165238"
3. Lanerc 官方接口(可选数据源)
状态:域名引导已下线,当前 api.lanerc.app 等地址均返回 404,以下内容仅来自静态逆向资料,不可直接用于生产 。仅作为协议结构参考。
3.1 公共请求头
Header
示例
说明
Content-Type
application/json
lang
zh-CN
语言
deviceId
32 位十六进制
客户端生成的设备 ID
device
Windows-AMD64
设备描述
deviceType
windows
设备类型
platform
windows
平台
version
1.0.8
客户端版本
current_timestamp
1730000000000
毫秒时间戳
sign
64 位十六进制
签名,算法未公开
Authorization
Bearer <token>
登录后携带
3.2 签名(占位实现) 1 2 raw = f"{path}|{timestamp}|{device_id}" sign = HMAC-SHA256(secret, raw).hexdigest()
真实算法未确认,客户端把 secret 做成可配置项;确认后只需替换 _make_sign。
3.3 端点一览(客户端已实现)
方法
路径
参数 / Body
说明
GET
app/config
deviceId, version
启动配置、公告
POST
app/user/login
{account, password, grant_type:"password"}
登录,返回 access_token / refresh_token / expires_in
POST
app/user/refresh
{refresh_token}
刷新令牌(路径可被响应中的 refreshUrl 覆盖)
GET
app/user/info
—
用户信息
GET
app/home
—
首页 Banner 与分区(recommend_list / hot_list / new_list / end_list)
GET
app/vod/search
keyword, page, limit
搜索
GET
app/vod/filter
page, limit, type
分类筛选
GET
app/rank
page
排行榜
GET
app/week
—
时间表
GET
app/v2/vod/{vod_id}
—
详情(含播放列表)
POST
app/v2/play
{vodID, video_id}
获取播放地址
POST
app/v2/guest/play
{vodID, video_id}
游客播放
GET
app/chat/comment
vid, page
评论
3.4 响应约定 1 { "code" : 0 , "success" : true , "message" : "ok" , "data" : { } }
客户端逻辑:
success === false 或 code 不在 0 / 200 / None / "" 中 → 视为业务错误;
优先取 data,其次 result;
401 且存在 refresh_token 时自动刷新一次后重试。
4. 错误处理
场景
客户端提示
未配置片源地址
尚未配置片源接口,请到「设置」填写 CMS API 地址
网络/DNS/TLS 失败
片源接口连接失败:ConnectionError 等
HTTP ≥ 400
片源接口返回 HTTP xxx
返回非 JSON
片源接口返回的不是 JSON,请确认地址是苹果CMS 采集接口
code != 1
片源接口报错:{msg}
详情为空
片源里没有找到这部剧集
无播放地址
该剧集没有可用的播放地址
非直链
该剧集的地址不是可直连的视频流,无法内置播放
5. 数据、缓存与隐私
数据目录按优先级选择:LANERC_DATA_DIR 环境变量 → E:/LanercPC → D:/LanercPC → F:/LanercPC → 程序目录 data;
配置、历史、收藏均为本地 JSON,不上传任何服务器;
封面图片缓存在 {数据目录}/cache/images;
图片请求的 Referer 自动设为图片所在域名,以兼容常见防盗链;
客户端不采集、不上报任何用户行为数据。
6. 合规使用建议
仅用于本地技术验证,不要公开部署或分发;
不要绕过付费、登录、地区限制等访问控制;
不要对第三方接口进行高频轮询或批量抓取;
若你拥有相关内容的版权或授权,请优先使用官方渠道;
如相关权利人提出异议,请立即停止使用并删除所有副本。
再次声明:本文档仅供学习、交流、研究使用,禁止任何形式的商业使用与资源传播。 文档中涉及的第三方接口、商标、影视内容版权均归其各自权利人所有。