lumina37 / aiotieba

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

[WARN] [get_bawu_postlogs] 'NoneType' object has no attribute 'find_all'. args=('贴吧名',) kwargs={'search_value': '用户名', 'search_type': 0, 'pn': 1} #194

Closed Voevodsky closed 6 months ago

Voevodsky commented 6 months ago

get_bawu_postlogs在当search_type设置为0(搜索发帖人)的时候似乎有点问题,每次都提示NoneType。(我在网页吧务后台搜索能正常返回结果,所以肯定不是None)

不过当我尝试将search_type设置为1(搜索操作人)的时候却能正常返回结果了。

而且我观察了一下get_bawu_postlogs返回的postlog信息,似乎并不包含”发帖人“的数据,个人感觉搜索发帖人无法得到结果的原因可能和这个有关。

lumina37 commented 6 months ago

我这边一切正常,你要不抓个包看看返回的内容里有没有包含tbody这个html节点

Voevodsky commented 6 months ago

嗯嗯,我仔细看了一下代码执行过程,感觉这个可能是url编码的问题,因为我如果搜索纯英文数字的用户id,就能顺利返回结果,搜索中文的话就不行了。

比如说,搜索用户名”萌客天行“,吧务后台的正确链接里的svalue=%25E8%2590%258C%25E5%25AE%25A2%25E5%25A4%25A9%25E8%25A1%258C,这似乎是一段两次url编码的字符串。 然而,如果我将get_bawu_postlogs的search_value直接设置为”萌客天行“,我观察了一下访问的url,svalue=%E8%90%8C%E5%AE%A2%E5%A4%A9%E8%A1%8C,这是一次编码的结果。且这个svalue无法返回结果。

于是我尝试在代码中添加了: query_string = '萌客天行' result = parse.quote(query_string) 再让search_value=result bawu_info = await client.get_bawu_postlogs("贴吧名", search_value=result , search_type=0, pn=1)

这里result = %E8%90%8C%E5%AE%A2%E5%A4%A9%E8%A1%8C(一次编码),然后result进入get_bawu_postlogs函数后会再次编码,url的svalue = %25E8%2590%258C%25E5%25AE%25A2%25E5%25A4%25A9%25E8%25A1%258C,这里svalue就和我从吧务后台看到的链接一样了。

果然,这样就能顺利返回结果了。

Voevodsky commented 6 months ago

这个函数访问的url根据search_type不同,分别是这两种格式: https://tieba.baidu.com/bawu2/platform/listPostLog?word="XXX"&pn=1&ie=utf-8&svalue=XXX&stype=op_uname (search_type = 1)

https://tieba.baidu.com/bawu2/platform/listPostLog?word="XXX"&pn=1&ie=utf-8&svalue=xxx&stype=post_uname (search_type = 0)

当搜索中文名时,我分别手动在网页上粘贴这两个url,很奇怪的是,前面这个链接是能顺利返回结果的,后者则不能,我猜测这就是我search_type = 0时无法返回结果的原因

n0099 commented 6 months ago

这似乎是一段两次url编码的字符串

经典一大堆%25重复escape了%本质倾斜牙签综合征 https://en.wikipedia.org/wiki/Leaning_toothpick_syndrome 堪比许多老接口不指定querystring之ie=utf-8就会将urldecode为gb2312/gbk而非utf8

lumina37 commented 6 months ago

应该修好了,面向诗山编程之 f51e1bd1b95ed64c9de7aad20db08bed80c327f7