PySocks代理功能是否可以与praw API配合使用?

时间:2019-06-12 09:05:29

标签: python networking reddit socks praw

所以我使用了我想通过代理运行的praw API的一些代码。我在this question下找到了以下代码,它对我有用。


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 Network?我开始研究praw代码,试图稍微了解它的工作原理,但对我来说太复杂了,我无法决定它是否会工作。 你们中的任何人是否有足够的经验告诉我它的网络是如何工作的,或者袜子代理是如何工作的,或者可以告诉我我如何才能知道?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这可以实现吗?

是的。 Python使用Requests库发出HTTP(S)请求。根据{{​​3}}和this answerrequests>=2.10.0通过PySocks支持SOCKS代理。


版本兼容性

截至该答案,prawcorepraw所依赖)需要Requests documentation。您可能已经安装了至少requests的某个版本的2.10.0,但是您可以通过以下方法进行检查:

$ 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使用的requests >=2.6.0, <3.0。我们使用Session实例化它:

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

proxies argument

  

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

这是我们将自定义Session传递给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解析

请注意PRAW documentation mentions how to use a custom Session关于DNS解析的SOCKS代理的看法:

  

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