lumina37 / aiotieba

贴吧接口合集✨可用于工具箱/吧务管理/数据采集
https://aiotieba.cc
The Unlicense
399 stars 69 forks source link

近期贴吧后端将曾于2019年3月b吧事件时缩小的`吧首页主题帖列表`接口所能通过`pn`参数翻到的`最多x条主题帖限制`从10k加到了100k #124

Closed n0099 closed 1 year ago

n0099 commented 1 year ago

rt 当时是缩小到了20k主题帖 image 好像是几个月后又进一步缩小到了10k https://github.com/n0099/TiebaMonitor/blob/981fc6d3d077f3ba6a79f27e1b2e245f46492335/c%23/crawler/src/Worker/ArchiveCrawlWorker.cs#L10-L12

// as of March 2019, tieba had restrict the max accepted value for page param of forum's threads api
// any request with page offset that larger than 10k threads will be respond with results from the first page
private const int MaxCrawlablePage = 334; // 10k threads / 30 per request (from Rn param) = 333.3...

这个限制在当时是应用于所有能显示吧首页的接口,包括网页端 客户端c/f/frs/page wap网页端https://community.wvbtech.com/d/1805移动端网页端 如果对这些接口请求的 $pn>limit$ (对于客户端接口是 $pn>limit*rn\text{(每页数量参数)}$ 因为只有客户端接口pn参数是真的指页数,也就是 $客户端pn=rn*网页端pn$ 而网页端pn实际上是指SQL OFFSET),那么贴吧服务端只会返回pn=1的主题帖


而刚才我又试了下发现不知何时起他们又改成了100k条主题帖(网页端参数rn=50&pn=100000) 以有着共有主题数14534787个,贴子数 993077918篇 众人皆帝数33828556的李毅吧为例:

而客户端(基于 https://github.com/n0099/TiebaMonitor/blob/e7d7240aebeee74d04f7b5d4748af69dff3ed5b0/client_tester.php#L30 )不是简单的增加到100k,而是客户端接口特色之根据提供参数和client_version取值排列组合而不同: 对于有些(知名贴吧?(已经死了的)核心区?热门分区排序?)贴吧,client_version>=8.0.0(.0)时限制是12k条,而client_version<8.0.0(.0)或其他普通的贴吧(即便有着大量历史主题帖)时没有限制 已经试过用于避免热门分区sort=5但没有效果

$ php-cgi client_tester_2.php client_version=8.0.0 type=posts forum=东方 rn=10 pn=1200 | sed -n '3,$p' | jq '.page'
{
  "cur_good_id": 0,
  "page_size": 10,
  "offset": 11990,
  "current_page": 1200,
  "total_count": 12000,
  "total_page": 1200,
  "has_more": 0,
  "has_prev": 1
}
$ php-cgi client_tester_2.php client_version=7.0.0 type=posts forum=东方 rn=10 pn=240 | sed -n '3,$p' | jq '.page'
{
  "has_more": 1,
  "has_prev": 1,
  "cur_good_id": 0,
  "page_size": 10,
  "offset": 2390,
  "current_page": 240,
  "total_count": 306968,
  "total_page": 30697
}
$ php-cgi client_tester_2.php client_version=7.9.9.9 type=posts forum=东方 rn=10 pn=240 | sed -n '3,$p' | jq '.page'
{
  "total_count": 306968,
  "total_page": 30697,
  "has_more": 1,
  "has_prev": 1,
  "cur_good_id": 0,
  "page_size": 10,
  "offset": 2390,
  "current_page": 240
}
$ php-cgi client_tester_2.php client_version=12.40.1.1 type=posts forum=东方 rn=10 pn=240 | sed -n '3,$p' | jq '.page'
{
  "current_page": 240,
  "total_count": 12000,
  "total_page": 1200,
  "has_more": 1,
  "has_prev": 1,
  "cur_good_id": 0,
  "page_size": 10,
  "offset": 2390
}
$ php-cgi client_tester_2.php client_version=12.40.1.1 type=posts forum=minecraft rn=10 pn=240 | sed -n '3,$p' | jq '.page'
{
  "has_more": 1,
  "has_prev": 1,
  "cur_good_id": 0,
  "page_size": 10,
  "offset": 2390,
  "current_page": 240,
  "total_count": 12000,
  "total_page": 1200
}
$ php-cgi client_tester_2.php client_version=12.40.1.1 type=posts forum=模拟城市 rn=10 pn=240 | sed -n '3,$p' | jq '.page'
{
  "offset": 2390,
  "current_page": 240,
  "total_count": 46852,
  "total_page": 4686,
  "has_more": 1,
  "has_prev": 1,
  "cur_good_id": 0,
  "page_size": 10
}
$ php-cgi client_tester_2.php client_version=12.40.1.1 type=posts forum=v rn=10 pn=240 | sed -n '3,$p' | jq '.page'
{
  "page_size": 10,
  "offset": 2390,
  "current_page": 240,
  "total_count": 12000,
  "total_page": 1200,
  "has_more": 1,
  "has_prev": 1,
  "cur_good_id": 0
}

还注意到只有客户端接口的返回的主题帖列表跟其他3个网页端接口不同(但发帖时间都是2021-05-12),这说明3个网页端接口后端至少在分页逻辑上是一致的,而客户端接口后端做了额外的分页前prefilter(比如前几年搞的客户端投票贴在网页端不显示,遗留的基于flash的网页端投票贴在客户端不显示)

$ php-cgi client_tester_2.php client_version=6.0.2 type=posts forum=李毅 rn=50 pn=2000 | sed -n '3,$p' | jq '.thread_list[].title'
"昨天朋友介绍了个相亲对象,听说家庭条件挺好。对方父亲开公司,"
"求这个头像是情头吗,我感觉我有点颜色了"
"假装小白,直播培训机构如何忽悠小白报名培训班的。"
"各位大佬,帅哥美女们,阿姨阿姨父们,累的深俺的接头们,捧个场"
"#512# 什么样的分手应该挽回?_济南泉思情感咨询"
"今天听到警报声"
"从来不看电视剧的我竟然看完了"
"我发表了一篇视频贴,大伙来看看吧~"
"汶川地震十三周年#汶川地震#"
"五月的青海湖,太美了"
"在北京注册一家保安公司"
"大红孩儿"
"到底是你借我还是我借你"
"过去了13年一看到还是泪目了"
"有没睡的吗 进来唠唠"
"贴吧又抽了"
"祝贺《药问3收棺之战》圆满成功"
"妈妈说:“别再情绪上头的那一刻忘记了对方所有的好,满身是刺的"
"现在人真可怕"
"求本小说,哪位大神知道叫什么名字!!!"
"进来唠唠"
"14,已然不是那个14了"
"这样农村姑娘值得娶吗?"
"🐂"
"我们小区里面买不到馒头,没有卖馒头,害"
"哪位老兄有那张说了一大堆,其实以上都是我编的那张图?"
"【求一张婴儿小jj的图片,】"
"图文店周年庆:黑白打印0.1元,彩色打印0.3元 胶装3元"
"贴吧五虎上将后继有人了"
"谁有这种图,感谢"
"一只烧鸡只剩这些了……"
"再来重温帝吧当年的内涵文章"
"专家一天是什么都能一本正经的胡说八道!"
"女孩一直想去城里打工,原来城里的活也不容易。两袋水泥二百斤,"
"戒烟斑马线"
"你见过最土的网名是什么?"

以于2004年建吧有着46852条主题帖(因此可以翻到最后的937页之rn=50&pn=46800)的模拟城市吧为例: 网页端的第937页: image 客户端的第937页(可见甚至没有返回够50条主题帖,说明除了prefilter还存在着应用于分页后的postfilter):

$ php-cgi client_tester_2.php client_version=6.0.2 type=posts forum=模拟城市 rn=50 pn=937 | sed -n '3,$p' | jq '.thread_list[].title'
"[公告撤消Tobynickness的吧主权限"
"你们输入城市名字的时候,有没有遇到我这样的问题"
"完全免费的单机游戏下载"
"模拟城市4有没有发财致富秘诀???"
"求助!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"求求大家了帮帮我好吗?怎么用金山游侠修改尖峰时刻的钱啊?"
"公墓和市政厅有何用?"
"大家都用什么方法赚钱的???"
"这个贴吧,我喜欢!!!"
"若有东方式的建筑该多好!!"
"玩多么大的地图最合适啊?小地图还是大地图?"
"模拟城市4问题请教??"
"事业"
n0099 commented 1 year ago

TL;DR: 这对于以r/datahoarder为代表的 https://archiveteam.org 人们是重大利好,现在又可以回到19年3月b吧事件之前那样递归备份总主题帖量<100k的特定贴吧中的绝大多数主题帖回复贴楼中楼了 但出于 https://en.wikipedia.org/wiki/Digital_preservation 目的为了避免客户端接口特有pre/postfilter策略的影响,应该使用3大网页端接口之一再爬一遍前100k条主题帖的tid,然后再用客户端接口主题帖回复贴列表回复贴楼中楼列表

而对于总主题帖量>100k的吧,在找到任何其他能够绕过针对吧首页主题帖列表的主题帖数量限制的获取吧内tid接口前,我能想到的只有使用1k个国外代理ip按照10rps限速使用主题帖回复贴列表客户端接口rn=2(不能通过rn=1只获取1L,因为[1] [2])从tid1(百度员工yujiemp3吧:1)一直爬到目前的tid83.5亿左右,从而获取百度贴吧所有主题帖的元数据,其自然也就包括了fid-tidpair,这可谓是典型的 https://en.wikipedia.org/wiki/German_tank_problem https://www.reddit.com/r/DataHoarder/comments/oomv6u/comment/h6079pv/ https://wiki.archiveteam.org/index.php/imgur#How_to_help_if_you_have_lists_of_URLs https://wiki.archiveteam.org/index.php/URLs

而这正如同2020年1~3月间我和 @BANKA2017 合作通过「当时我google检索tieba域时偶然发现的移动端网页端遗留举报回复贴接口 https://tieba.baidu.com/mo/q/postreport?pid=1 可以绕过任何对pid软删除(比如吧务删帖 系统吞贴,但作者被系统永封没试过)的检测,从而形成404空洞极少的连续pid分布」,基于当时tbm数据集中所得出的爬到的04\~19年每天的最小(第一条)pid和最大(最后一条)pid,使用带标准差偏移的正态分布曲线试图拟合出每日贴吧发贴量波峰波谷(晚上=中午>下午>凌晨),从每日pid空间中使用该分布随机选取20000个pid进行爬取,最终获得的110m个pid-吧名-作者百度用户名pair数据集:https://n0099-my.sharepoint.cn/:f:/g/personal/n_n0099_partner_onmschina_cn/EtP8LpKT869LnK409s9xMdQBeJgxKk93sM-hWUvMQIZLKA

lumina37 commented 1 year ago

很有意思,但我也得过一会才能研究

lumina37 commented 1 year ago

可追溯的历史帖数量确实大大增加了,不过貌似对我没什么影响

n0099 commented 1 year ago

可得starry神不在乎简中互联网有没有记忆