近期发现百度更新了 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的方法,百度但凡更新一次页面框架什么的,破坏了原来的规则,就得重新适配。虽然简单易行但是有不少缺点。
在这里详细解释一下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 的问题
感谢您提供的解决方案。
登录 后才可以发表评论