头条后台12个接口零签名:我把每篇文章的数据接进了自己的系统"

admin 2026-10-17 23:47:07 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

头条后台 12 个接口零签名:我把每篇文章的数据接进了自己的系统

原创

野生码农
野生码农

野生码农 AI 实战

2026年8月31日 13:15
浙江

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读


头条后台 12 个接口零签名:我把每篇文章的数据接进了自己的系统

2026 年 8 月 31 日早上 07:10,我的采集链照常跑完,7 个平台的数据全进了库,只有头条的单篇数据还是空的。

当天我把头条创作后台的接口族拆了出来:12 个接口、零签名、全部打通,当天固化进采集链,6 篇图文全量入库。

一、起因:我的数据看板缺了头条这一块

我自己折腾了一套数据采集链,覆盖 7 个平台,每天早上 07:10 自动跑:采集、收链接、灌库、对账,全自动,像个不用催的伙计。

唯独头条是个黑洞。创作后台只能看汇总数字,每篇文章的展现、阅读、点赞、评论、完读率,一概拿不到。我的看板上,头条那一栏一直空着。

解密这个系列,前两篇拆的是微信、钉钉的本地加密库,这次换个打法:拆网页后台的接口。

先把边界说死:全程只采我自己账号登录后可见的数据,用的是自己浏览器登录态的 Cookie,数据本地落盘,不碰别人的数据,也不碰平台服务器。

二、第一战:urllib 被 argus 当场拦下

侦查对象是创作后台的「单篇分析」页,地址是 mp.toutiao.com/profile_v4/analysis/works-single/article,背后接口基座是 https://mp.toutiao.com/mp/agw/statistic/v2/item/。

第一发请求我用的是最朴素的 urllib,结果当场被拦,页面返回的是 argus 挑战。argus 是头条挡在接口前面的风控层,也就是在 TLS 和 JS 层面验指纹:不像浏览器,一切免谈。

2026 年 8 月 9 日我留过一个旧结论:\"mp.toutiao.com 对非浏览器一律回 argus 挑战。\"

这次实测,我亲手把它收窄了:argus 只拦 urllib 这种裸指纹,不是非浏览器全杀。这句定性很重要,\"平台有反爬\"说明不了问题,得写清哪一层拦、哪一层放。

三、换枪:curl\_cffi 伪装 Chrome 指纹

换的枪是 curl\_cffi,一个能伪装浏览器 TLS 指纹的 HTTP 库,impersonate=\"chrome\" 一开,请求在指纹层看起来就是一台 Chrome。

实测放行。页面 HTML 63428 字节直连拿到,4 个接口全部 HTTP 200。

我本以为难点在接口层的签名计算,都做好了跟加密参数死磕的准备。结果把 bundle 扒开一看,整个 statistic v2 接口族全是 GET 请求,参数全走 query string,无签名参数、无 token 计算。防护完全前置在指纹层,接口层是敞开的,认证就是登录 Cookie 请求头。

页面本身也有意思。63428 字节的 HTML 里,入口脚本只有 393 字节,是个加载器;真身是 @mp/analysis 子应用,版本 1.0.0.923,跑在 Garfish 微前端架上,主 bundle 230798 字节,带 9 个 chunk,全部落盘。微前端这种架构,就是把大页面拆成独立子应用,用哪块加载哪块。

然后是正则扫 chunk,定位接口族:

```python for m in re.finditer(r'/mp/agw/statistic/v2/item/[a-z\_]+', t):

命中集中在 chunk\_358.js,12 个端点:

list info next traffic\_analyse interaction\_analyse traffic\_source

income\_analyse income\_source fans\_trends freestyle\_analyse user\_property

```

命中集中在 chunk\358.js,18793 字节,扫出 item 维度 12 个端点,外加 export\\* 导出变体,对应页面上那个\"导出 Excel\"按钮。

反混淆后的请求层更直接,这是 traffic\_analyse 的原样:

js GetItemTrafficAnalyse: function(t, e) { var r = (0, i.OW)(t); // 查询串序列化器 var n = \"\".concat(this.uriPrefix, \"/mp/agw/statistic/v2/item/traffic_analyse\").concat(r); return (0, a.ferryFetch)(n, {method: i.EJ, headers: i.b3}, e); // i.EJ = \"GET\";无签名头、无请求体 }

第一枪打 item/list 第 1 页:200,6407 字节,code:0,total_count=6。我账号就 6 篇图文,字段全量返回,不是空壳。第 2 页也打了:200,62 字节,空数组,超页就返回空。多页翻页测不了,账号篇数不够,这是结构性限制,挂起,不写成已验证。

四、补刀与降级:猜参数是全程最贵的弯路

这里得认个账。按我自己的作战手册,这一阶段本该先用浏览器抓包补数据点。我看 bundle 落盘完整,心想直接扒 chunk 更快,跳过去了。

我以为跳过抓包是捷径,结果它成了全程最贵的一段弯路。接口实参,参数名叫什么、取什么值,浏览器抓包 5 分钟就能看到;我纯逆向 chunk 猜参数,花了多得多的时间。

症状是这样的:趋势接口缺日期参数,试打返回 code:1105,缺必要参数。我以为缺的是 dimension,whole、detail、readDetail 三个值全试了,全被排除。

谜底藏在 chunk\_372.js 的调用现场:

js getTrafficData({item_id: a, type: t, from: y, to: h, platform: n, location: i[0]}, d.N.detail)

缺的参数叫 from 和 to,是日期。dimension 那三个值白试了。手册里已经添了一条:bundle 用来定位接口族和字段名,实参一律以抓包为准,调用现场怎么传就怎么传。

日期格式又试了 5 个候选:时间戳秒、毫秒、YYYY-MM-DD、YYYY/MM/DD、ISO,只有 YYYY-MM-DD 返回 code:0 出数。

补刀三个接口,每个结论都脱离浏览器重放验证过:

item/info:200,1392 字节。同一篇文章的展现数,两次请求之间从 11737 变成 11739,缓存快照给不出这种变化,接口返回的是实时计数。

traffic_analyse:200,7834 字节,daily_stats 给了 23 条日序列。interaction_analyse:200,3056 字节,daily_interactions 23 条。

降级逻辑也试出来了。一篇 2024 年 5 月发布的老文重打,返回 code:1200;我把查询窗收缩到近 30 天,还是 1200。窗口按作品发布日判,绕不过去:流量趋势只留 8 个月,互动趋势留 1 年,过了窗口的老文,趋势数据就是流失了。

单篇字段结构也理清了,item_stat 下三层:consume_data 管展现、进详情、粉丝展现;consume_detail 管点击率、完读率、阅读时长;interaction_data 管赞、评、分享、收藏。

五、收尾:接口进了采集链,台账先行

落地的函数叫 fetch_toutiao_works_single():接口优先,xlsx 导出、插件代抓、urllib 依次兜底,请求间 sleep(1) 保守节流,每天 07:10 跟着采集链自动覆盖。

当天实跑:6 篇图文全量入库,趋势 traffic 通 4 篇、interaction 通 4 篇、超窗降级 4 次。老文按 1200 降级,记录在案,不静默吞掉。

拿我自己的「梅园的荷花开了」当样本:展现 11739,阅读 1015,赞 14,评 2,分享 9,收藏 9,点击率 8.65%,完读率 56.04%,平均阅读时长 22 秒,粉丝展现 14。完读率、平均阅读时长这种颗粒度的数据,以前我在后台汇总页永远看不到。

台账记到 2026 年 8 月 31 日,状态如下:

端点 状态 实测证据
item/list 已通 第 1 页 6407 字节,code:0,total\_count=6
item/info 已通 展现数两次请求 11737→11739,实时计数
traffic\_analyse 已通 7834 字节,23 条日序列,窗口 8 个月
interaction\_analyse 已通 3056 字节,23 条,窗口 1 年
多页翻页 未实测 账号仅 6 篇,结构性测不了
fans\_trends 未实测 端点已扫到,尚未重打

那条旧结论也在台账里改掉了:原来写的\"对非浏览器一律回 argus 挑战\",现在收窄成三层——argus 拦 urllib 级裸指纹,放 Chrome TLS 指纹,接口层零签名。从这天起,每天 07:10,头条 6 篇图文的展现、阅读、完读率跟着采集链自动进库,看板上空了很久的那一栏,有数了。

FAQ

Q:这个思路能用来抓别人账号的文章数据吗?

不能,也不该。我全程只用自己账号登录后可见的数据和自己的 Cookie,这是整件事的底线,也是接口重放能成立的前提。思路可以复用,对象只能是你自己的号。想看别人账号的公开数据,平台官方渠道之外的路子我不碰,也不建议碰。

Q:为什么不直接用后台的\"导出 Excel\"?

导出端点我扫到了,但导出要人工点,接不进每天 07:10 的自动链。接口重放才能全自动。手动导出没扔,留在链里当兜底方案。

Q:多页翻页和 fans\_trends 什么时候补测?

翻页得等我账号篇数够了才测得了;fans\_trends 端点已经在台账上。补测结果会在解密系列后续篇里如实更新,测不出来也会照实写。


我是野生码农,AI 实战派。自研知识库、数字员工、软考备考、量化交易四个系统,全程公开复盘。

本文所有内容均为本人 AI 实战的过程和结果,经 AI 整理后发布,无任何瞎编虚构内容。

这篇来自《AI解密攻防》系列。下一篇换个战场:量化证伪日记,60 只股票×18 个月的实测证伪。

关注我,看真的。

野生码农AI实战 · 全网同名


    那个不填充的函数" 网络安全文章

    那个不填充的函数"

    本文通过作者亲身经历,揭示国密标准GM/T0018中SDF\\_Encrypt函数不做数据填充的特性。该函数是纯分组运算引擎,要求明文长度必须为16字节整数倍,填充责任在调用者。作者详细演示了PKCS#7填充实现方法,强调填充值等于补位个数,即使数据长度恰好为16的整数倍也需补一整块16字节,解密后需按约定去除填充。文章提醒开发者勿默认其行为与OpenSSL等库一致,具有很强实践指导价值。
    流量红利退潮,快手想用AI和老友们破局" 网络安全文章

    流量红利退潮,快手想用AI和老友们破局"

    快手在流量红利趋缓背景下,转向存量用户价值经营,通过多元圈层、短直一体、创作者扶持计划及AI工具提升内容与交易效率。二季度营收355亿元同比增1.4%,直播收入下降13.5%,可灵AI收入超8.5亿元增200%。平台强调长期创作者沉淀与私域变现,但面临利润承压与转化效率挑战。
    评论:0   参与:  0