Работает ли прокси-функция PySocks с API praw? - PullRequest
1 голос
/ 12 июня 2019

Итак, у меня есть некоторый код, использующий API praw, который я хотел бы запустить через прокси.Я нашел следующий код под этот вопрос , и он работает для меня.


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 работает в сети или как работает прокси-сервер socks, или может просто рассказать, как я мог это выяснить?

Большое спасибо за помощь.

1 Ответ

0 голосов
/ 13 июня 2019

Это достижимо?

Да. Python использует библиотеку запросов для выполнения запросов HTTP (S). Согласно этот ответ и запрашивает документацию , requests>=2.10.0 поддерживает прокси SOCKS через PySocks.


Совместимость версий

Начиная с этого ответа, prawcore (от которого зависит praw) требуется requests >=2.6.0, <3.0. Вероятно, у вас установлена ​​какая-то версия 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'}

Затем мы должны передать это Session, которое использует PRAW. Мы создаем его с помощью аргумента proxies :

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

В документации PRAW упоминается, как использовать пользовательский Session:

requestor_class и requestor_kwargs позволяют настраивать запросчик Reddit. Это позволяет, например, легко добавить поведение в запросчик или обернуть его Session в слой кэширования.

Вот как мы передаем в PRAW наш пользовательский Session:

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, когда дело касается разрешения DNS:

Использование схемы socks5 вызывает разрешение DNS на клиенте, а не на прокси-сервере. Это соответствует curl, который использует схему, чтобы решить, делать ли DNS-разрешение на клиенте или прокси. Если вы хотите разрешить домены на прокси-сервере, используйте socks5h в качестве схемы.

...