当前仓库属于暂停状态,部分功能使用受限,详情请查阅 仓库状态说明
167 Star 533 Fork 165

Kenvix / Tieba-Cloud-Sign
暂停

 / 详情

BDUSS检测异常问题复现,重新适配解决方案

待办的
创建于  
2021-05-03 11:03

原问题的第一个解决方案

近期发现百度更新了 http://i.baidu.com/ 页面,导致在 sfc.functions.php 中getBaiduId方法失效,且使得上个解决方案失效了,从而导致问题复现,即使BDUSS输入无问题,也无法正常绑定。

原先的函数如下:

function getBaiduId($bduss){
	$c = new wcurl('http://wapp.baidu.com/');
    $c->addCookie(array('BDUSS' => $bduss,'BAIDUID' => strtoupper(md5(time()))));
	$data = $c->get();
	$c->close();
	return urldecode(textMiddle($data,'i?un=','">'));
}

百度更新了页面框架,使得在上个解决方案中用来筛选百度ID的规则( main?un= 和 &fr=ibaidu&ie=utf-8 之间的字符)失效。
本人再次适配了一下过滤规则,仍然使用 http://i.baidu.com/ 作为获取源。
修改后的代码:

function getBaiduId($bduss){
	$c = new wcurl('http://i.baidu.com/');
    $c->addCookie(array('BDUSS' => $bduss,'BAIDUID' => strtoupper(md5(time()))));
	$data = $c->get();
	$c->close();
	return urldecode(textMiddle($data,'"username":"','","iconUrl"'));
}

实测可用。
PS:按照这个取middleText的方法,百度但凡更新一次页面框架什么的,破坏了原来的规则,就得重新适配。虽然简单易行但是有不少缺点。

评论 (6)

无语羊 创建了任务
无语羊 关联仓库设置为Kenvix/Tieba-Cloud-Sign
无语羊 任务状态待办的 修改为进行中
无语羊 任务状态进行中 修改为待办的
展开全部操作日志

在这里详细解释一下BDUSS验证的逻辑

主要是携带设置的BDUSS信息,访问百度的特定页面。
一般来说,附带了正确BDUSS的话,百度会返回一个带个人信息的HTML页面。
然后通过匹配两个文本之间的文本(middleText方法)截取HTML中的个人信息(username)。
如果成功匹配到了文本那么说明BDUSS是正确的,反之是错误的。

这个方法理论是可行的,但是也有不足。
百度经常改动HTML的结构,这会导致匹配不到文本,从而导致BDUSS验证一定会报错。
百度的页面很多,上面显示你用户名的页面也很多,但是但凡更新了页面,就必须跟进更新匹配规则。

因此,这就需要人持续维护。
就本项目的情况来看,维护已经停止很长时间了。
未来随着百度的更新,失效的功能会越来越多。

与其不断研究如何适应网页,不如找一个能稳定使用的接口,比如https://tieba.baidu.com/mg/o/profile?format=json,然后使用json_decode()处理
以及GitHub那边更新还是挺活跃的

原作者已经迁移了项目,现在维护是哪个地址呢

github 那边是 MoeNetwork/Tieba-Cloud-Sign ,最新版本 4.94,已经解决了目前 issue 的问题

感谢您提供的解决方案。 :+1:

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
684690 kdwnil 1578930755
PHP
1
https://gitee.com/kenvix/Tieba-Cloud-Sign.git
git@gitee.com:kenvix/Tieba-Cloud-Sign.git
kenvix
Tieba-Cloud-Sign
Tieba-Cloud-Sign

搜索帮助