upbit / pixivpy

Pixiv API for Python
https://pypi.org/project/PixivPy3/#files
The Unlicense
1.79k stars 149 forks source link

尝试登陆时返回10054错误码 #138

Closed Max-Learning closed 4 years ago

Max-Learning commented 4 years ago

尝试使用example_bypass_sni.py中的代码登陆时在login函数处报错: pixivpy3.utils.PixivError: requests POST https://app-api.pixiv.net.cdn.cloudflare.net./auth/token error: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了 一个现有的连接。', None, 10054, None))。 尝试使用测试账号和自己的账号登陆,都出现了同样的错误。 这个错误出现在两天前,此前它表现良好。 我使用的是中国的教育网,请问这是否是问题所在?

另外,api.hosts的值是app-api.pixiv.net.cdn.cloudflare.net.,尝试用curl -p访问这个网址时返回了1001的错误码。 尝试使用dns-query的其他返回值(ip地址)替换api.hosts,返回了错误 pixivpy3.utils.PixivError: requests POST https://104.18.30.199/auth/token error: HTTPSConnectionPool(host='104.18.30.199', port=443): Max retries exceeded with url: /auth/token (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1045)')))

upbit commented 4 years ago

看提示应该是解析到的IP不可访问 Connection aborted

  1. 从域名推测P站加了 cloudflare.net 防水墙,对于没验证的流量估计绕不过;
  2. 如果还有以前的IP(比如解析app的host),可以尝试ip固定访问P站来绕开
upbit commented 4 years ago

@Notsfsssf 有见过类似的情况吗?

dylech30th commented 4 years ago

直接上IP就行了,这是目前唯一的解决办法

Max-Learning commented 4 years ago

看提示应该是解析到的IP不可访问 Connection aborted

  1. 从域名推测P站加了 cloudflare.net 防水墙,对于没验证的流量估计绕不过;
  2. 如果还有以前的IP(比如解析app的host),可以尝试ip固定访问P站来绕开

直接上IP就行了,这是目前唯一的解决办法

有效,使用app-api.pixiv.net的ip地址,即加上api.hosts='https://210.140.131.208'后可以正常连接。 然而这个ip地址不是一直对应的(例如2018年的地址是210.129.120.44),因此这个方法并不是稳定的,可能需要定时修改。

upbit commented 4 years ago

看提示应该是解析到的IP不可访问 Connection aborted

  1. 从域名推测P站加了 cloudflare.net 防水墙,对于没验证的流量估计绕不过;
  2. 如果还有以前的IP(比如解析app的host),可以尝试ip固定访问P站来绕开

直接上IP就行了,这是目前唯一的解决办法

有效,使用app-api.pixiv.net的ip地址,即加上api.hosts='https://210.140.131.208'后可以正常连接。 然而这个ip地址不是一直对应的(例如2018年的地址是210.129.120.44),因此这个方法并不是稳定的,可能需要定时修改。

那问题应该就是,如何通过DNS over HTTPS解析到app-api.pixiv.net真实IP了。看之前用的是cloudflare的,因此可能返回不正确。感觉可以尝试换成其他服务商的: https://github.com/upbit/pixivpy/blob/master/pixivpy3/bapi.py#L22

看目前返回的IP确实都指向它自己服务器了。。。https://cloudflare-dns.com/dns-query?name=app-api.pixiv.net&type=A&ct=application/dns-json

Notsfsssf commented 4 years ago

@Notsfsssf 有见过类似的情况吗?

我完全使用硬编码了,既然使用Dns over Https获得真实ip的方式依然不稳定,不如直接放弃这个特性,只是跟进的时候需要勤快一些

upbit commented 4 years ago

觉得你之前提供的这个bypass方法思路蛮好的,直接Set HOST对普通用户要求有点高(很少人知道如何获取真实host) 我再找找比较稳定的提供方(至少目前Google,CloudFlare都得放弃了)

upbit commented 4 years ago

觉得你之前提供的这个bypass方法思路蛮好的,直接Set HOST对普通用户要求有点高(很少人知道如何获取真实host) 我再找找比较稳定的提供方(至少目前Google,CloudFlare都得放弃了)

https://dns.quad9.net:5053/dns-query?name=app-api.pixiv.net

这个思路可能不奏效,应该是P站这个域名,整个都指向了:app-api.pixiv.net.cdn.cloudflare.net. 用quad9解析也是这个

upbit commented 4 years ago

一个变通的解决方法,使用未指向cloudflare的host解析实际IP:

    api = ByPassSniApi()  # Same as AppPixivAPI, but bypass the GFW
    api.require_appapi_hosts(hostname="public-api.secure.pixiv.net")

原理:

cloudflare还是比较贵的,一些二级域名一般不会用这个保护。我们可以通过解析二级域名得到P站的真实IP

方法:

  1. 查询P站的子域名:https://securitytrails.com/list/apex_domain/pixiv.net
  2. 使用quad9验证解析是否指向cloudflare: https://dns.quad9.net:5053/dns-query?name=public-api.secure.pixiv.net
  3. 看到真实IP后就可以把这个域名,传递给hostname参数了
Notsfsssf commented 4 years ago

一个变通的解决方法,使用未指向cloudflare的host解析实际IP:

    api = ByPassSniApi()  # Same as AppPixivAPI, but bypass the GFW
    api.require_appapi_hosts(hostname="public-api.secure.pixiv.net")

原理:

cloudflare还是比较贵的,一些二级域名一般不会用这个保护。我们可以通过解析二级域名得到P站的真实IP

方法:

  1. 查询P站的子域名:https://securitytrails.com/list/apex_domain/pixiv.net
  2. 使用quad9验证解析是否指向cloudflare: https://dns.quad9.net:5053/dns-query?name=public-api.secure.pixiv.net
  3. 看到真实IP后就可以把这个域名,传递给hostname参数了

确实能奏效👌,只是需要过两家服务提供商

upbit commented 4 years ago

短时间 hostname="public-api.secure.pixiv.net" 应该都是可以用的(这个是以前PAPI的子域名,估计他们都快忘了),也不需要重新找子域名

我更新下example

luckyray-fan commented 4 years ago

绕过去的这个方法太赞了!!!!!!