文章总结: 作者逆向分析头条创作后台12个接口,用curl_cffi伪装Chrome指纹绕过argus风控,发现接口层零签名全为GET请求。通过逆向JS定位参数,实测6篇图文全量入库,趋势数据有8个月窗口限制。文章强调参数应以抓包为准,并提供了完整的技术方案与降级策略。 综合评分: 75 文章分类: 实战经验,爬虫,安全工具
头条后台 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实战 · 全网同名
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:野生码农 AI 实战 野生码农 野生码农《头条后台 12 个接口零签名:我把每篇文章的数据接进了自己的系统》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论