Это достижимо?
Да. 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
в качестве схемы.