pixivpy icon indicating copy to clipboard operation
pixivpy copied to clipboard

登陆的时候,出现CAPTCHA验证

Open kanren3 opened this issue 3 years ago • 9 comments

image

kanren3 avatar Jan 15 '21 02:01 kanren3

CAPTCHA是绕不过的,加的功能也只能一定程度上避免 尝试更换代理,或者账号试试

upbit avatar Jan 15 '21 03:01 upbit

如果是出现其他错误码,比如10054,可以参考这个解决: https://github.com/upbit/pixivpy/issues/138

upbit avatar Jan 15 '21 03:01 upbit

好吧。。。值得一提的是,我使用apipost软件进行访问的时候,它可以绕过这个,不太清楚怎么弄得 image

kanren3 avatar Jan 15 '21 03:01 kanren3

如果登录时能用上pixiv的cookie中的PHPSESSID话,就不会有这种情况。 同样是Python写的pixivutil就是用这种方法解决的

NaughtDZ avatar Jan 28 '21 13:01 NaughtDZ

PHPSESSID绕过具体是用的什么原理?

upbit avatar Jan 29 '21 01:01 upbit

PHPSESSID绕过具体是用的什么原理?

当你在浏览器登陆成功时,P站在经过一些认证或者其他处理后,会返回一个名为PHPSESSID的cookie作为你的一个登陆凭证,如果你已经有这个cookie的话,服务器端就不会再做其他奇奇怪怪的验证(就好比公交车月票卡,你办的时候要经过一堆手续,但是用的时候只要有月票就行) PixivUtil2这个项目也是开源的python程序 https://github.com/Nandaka/PixivUtil2 具体可以参照看看它是怎么做的 有关语句: ` def _loadCookie(self, cookie_value, domain): """ Load cookie to the Browser instance """ ck = None

    if "pixiv.net" in domain:
        ck = http.cookiejar.Cookie(version=0, name='PHPSESSID', value=cookie_value, port=None,
                                   port_specified=False, domain='pixiv.net', domain_specified=False,
                                   domain_initial_dot=False, path='/', path_specified=True,
                                   secure=False, expires=None, discard=True, comment=None,
                                   comment_url=None, rest={'HttpOnly': None}, rfc2109=False)
    elif "fanbox.cc" in domain:
        ck = http.cookiejar.Cookie(version=0, name='FANBOXSESSID', value=cookie_value, port=None,
                                   port_specified=False, domain='fanbox.cc', domain_specified=False,
                                   domain_initial_dot=False, path='/', path_specified=True,
                                   secure=False, expires=None, discard=True, comment=None,
                                   comment_url=None, rest={'HttpOnly': None}, rfc2109=False)
    if ck is not None:
        self.addCookie(ck)

`

NaughtDZ avatar Jan 29 '21 01:01 NaughtDZ

PHPSESSID绕过具体是用的什么原理?

当你在浏览器登陆成功时,P站在经过一些认证或者其他处理后,会返回一个名为PHPSESSID的cookie作为你的一个登陆凭证,如果你已经有这个cookie的话,服务器端就不会再做其他奇奇怪怪的验证(就好比公交车月票卡,你办的时候要经过一堆手续,但是用的时候只要有月票就行) PixivUtil2这个项目也是开源的python程序 https://github.com/Nandaka/PixivUtil2 具体可以参照看看它是怎么做的 有关语句: ` def _loadCookie(self, cookie_value, domain): """ Load cookie to the Browser instance """ ck = None

    if "pixiv.net" in domain:
        ck = http.cookiejar.Cookie(version=0, name='PHPSESSID', value=cookie_value, port=None,
                                   port_specified=False, domain='pixiv.net', domain_specified=False,
                                   domain_initial_dot=False, path='/', path_specified=True,
                                   secure=False, expires=None, discard=True, comment=None,
                                   comment_url=None, rest={'HttpOnly': None}, rfc2109=False)
    elif "fanbox.cc" in domain:
        ck = http.cookiejar.Cookie(version=0, name='FANBOXSESSID', value=cookie_value, port=None,
                                   port_specified=False, domain='fanbox.cc', domain_specified=False,
                                   domain_initial_dot=False, path='/', path_specified=True,
                                   secure=False, expires=None, discard=True, comment=None,
                                   comment_url=None, rest={'HttpOnly': None}, rfc2109=False)
    if ck is not None:
        self.addCookie(ck)

`

遇到了同样的问题,尝试了加 cookies,虽然最后 pixivpy 没更新可能才是根本原因...

cookies 可以通过 AppPixivAPI 传进去: api = AppPixivAPI(cookies={"PHPSESSID": "..."})

Pixiv OAuth Flow 浏览器登录的话,可以在请求详情找到 PHPSESSID

liuzikai avatar Aug 20 '21 16:08 liuzikai

PHPSESSID 应该是会过期的,而refreshToken不会(或者过期远比PHPSESSID长)。 通过cookies传递倒是个好方法,和上面loadCookie()异曲同工,其实都依赖于之前OAuth时返回的cookie;不过有些场景是直接通过refreshToken重新登录的(比如demo里的方法)

可以看看如果生成假的PHPSESSID能不能绕过 CAPTCHA,如果可以倒是可以mock一个

upbit avatar Aug 22 '21 10:08 upbit

最近我“幸运“地在本地复现了这个问题,经过试验有以下发现:

  • 用Postman默认的UA,正常
  • 不发送UA,正常
  • 用Pixivpy默认的UA(PixivAndroidApp/5.0.115 (Android 6.0; PixivBot)),被挡
  • 把默认的UA稍作改动,改成PixivAndroidApp/5.0.115,正常
  • 用浏览器UA(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36),被挡(?)
  • 把浏览器UA稍作改动,改成AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36,正常(?)
  • 用Pixivpy默认的UA配合PHPSESSID,被挡

这样看来应该是CloudFlare也会根据UA评估风险,如果某个UA操作过于异常就容易触发检查,当然也跟IP有关,不过目前看起来通过改UA是可以绕过一部分检查的,只是稳定性恐怕无法保证。

y-young avatar Sep 11 '22 14:09 y-young