提问者:小点点

PySocks代理函数是否适用于Praw API?


所以我已经得到了一些代码,使用了我想通过代理运行的Praw API。我在这个问题下找到了以下代码,它适用于我。


import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
import urllib2

print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

我的问题是,它是否也会通过代理来连接praw网络?我开始研究praw代码,试图了解它是如何工作的,但它对我来说太复杂了,我无法决定它是否会工作。你们中有没有人有足够的经验告诉我praw是如何建立网络的,或者socks代理是如何工作的,或者可以告诉我如何找到答案?

非常感谢你帮助我。


共1个答案

匿名用户

对Python使用请求库发出HTTP(S)请求。根据此回答和请求文档,请求

从这个答案开始,Prawcore(其Praw依赖)需要请求

$ python3 -c 'import requests; print(requests.__version__)'

如果您安装的版本低于2.10。0,升级时使用:

$ python3 -m pip install 'requests >=2.10.0, <3.0'

根据链接的答案,我们为我们的代理设置了一个dict(使用'https'代替'http',因为PRAW的所有请求都是通过https进行的):

proxies = {'https': 'socks5://127.0.0.1:9050'}

然后我们必须将其传递给PRAW使用的会话。我们使用代理参数实例化它:

import requests
socks_session = requests.Session(proxies=proxies)

PRAW留档提到如何使用自定义会话

requestor_classrequestor_kwargs允许自定义请求者Reddit将使用的。这允许,例如,轻松地向请求者添加行为或将其会话包装在缓存层中。

下面是我们如何将自定义会话传递给PRAW:

reddit = praw.Reddit(client_id='XX',
                     client_secret='XX',
                     user_agent='my_bot by pythoniac',
                     # ... more kwargs ...
                     requestor_kwargs={'session': socks_session})

PRAW通过请求发出的任何请求都将通过SOCKS代理。

当涉及到DNS解析时,请注意请求留档对SOCKS代理的说明:

使用schemesocks5会导致DNS解析发生在客户端,而不是代理服务器上。这与curl一致,curl使用该方案来决定是在客户端还是在代理服务器上进行DNS解析。如果要解析代理服务器上的域,请使用socks5h作为方案。