ly0 / baidupcsapi

百度网盘api
MIT License
1.21k stars 234 forks source link

目前所有的接口都报错-6 #69

Open MasterColor opened 6 years ago

MasterColor commented 6 years ago

登陆完成之后 无论是list(pan.baidu.com) 还是download(pcs.baidu.com) 都会报错-6 有办法解决吗

ly0 commented 6 years ago

测试了一下正常,清理一下PWD下的 .百度账号.cookies 的cookies文件重新登陆一下试试?

MasterColor commented 6 years ago

不行 会因为errno = -6 抛出user unsigned 异常 报错-6是因为cookie 过期了吗

ly0 commented 6 years ago

有可能,不大清楚百度抛出-6到底有多少含义

MasterColor commented 6 years ago

找到原因了,获取bdstoken的时候,cookie里面需要有BAIDUID 和 OSUPPORT这两个字段; 没有的话,获取token 的接口就会返回 the first 什么什么的, 获取token失败之后 再调用一次就好了, -6的问题就是因为 token 无效。 我在浏览器里面还测试了 在百度网盘的cookie里面修改 BDUSS,发现 百度网盘对bdstoken 和BDUSS应该有一个类似绑定关系的校验; 浏览器1获取到的bdstoken ,浏览器2获取到的BDUSS,拼在一起是不能访问百度网盘的,但是可以访问百度其他产品,且访问了其他百度产品之后就又可以访问百度网盘了

ly0 commented 6 years ago

昂? 有点没看懂……可以提个PR嘛

MasterColor commented 6 years ago

是这样的: 在你的python代码中,_initiate这个函数在执行_get_token这个方法时候,我断点调试发现这个值是一个错误提示(the fisrt two args should be string type:0,1!),并不是一个正确的,形如7ef98cc9fbbb5c1da63914d4a496da50 的token;

MasterColor commented 6 years ago

在上述场景下,token 等于“the fisrt two args should be string type:0,1!”的时候, 登陆鉴权依然可以正常操作获取到BDUSS,但是再进一步操作调用百度网盘的接口的时候 就会报错-6;

MasterColor commented 6 years ago

我按照 #43 的代码,修改了一下 发现,确实可行;然后我又在浏览器测试了一下发现,当cookie 为空时(也就是第一次调用getToken接口时)返回结果也是”the fisrt two args should be string type:0,1!“,此时服务器会返回两个cookie:BAIDUID,OSUPPORT有了这两个cookie之后,再次调用该接口就能正常获取token了

MasterColor commented 6 years ago

按上述操作拿到的token,拿去登陆之后,再调用百度网盘接口 就是可行的了,就不会报错-6了

MasterColor commented 6 years ago

在测试上述内容期间,我还测试了一下手动修改浏览器cookie里面的的BDUSS字段(修改后的是在python代码中获取到的BDUSS),发现修改之后,直接在浏览器访问BDUSS时也会报错-6,但是如果另开一个页面进入一下百度首页的话,就可以正常访问百度网盘了; 所以我怀疑百度网盘对BDUSS和bdstoken有一个类似于一对多的绑定关系,登陆百度网盘的时候服务端会对这个关系进行校验,也就是说在哪里访问百度网盘,就必须在哪里登陆百度 比如,即使是同一台PC上的 IE、Chrome、python环境、java环境等等 都是属于不同的地方(获取到的bdstoken是不一样的)

ly0 commented 6 years ago

大致上看懂了,但是我这里没法复现问题,能否提交一个Pull Request?感激不尽