запросы /aiohttp с помощью SOCKS5. 0x05: Соединение отклонено
У меня есть две версии программы:
- Синхронно, с использованием
библиотека; - Асинхронный, с использованием
библиотека.
Необходимо отправлять запросы к сайту через SOCKS5-прокси. После установки необходимых библиотек для работы с SOCKS5-прокси я попробовал делать запросы к нескольким сайтам. Все работало нормально со всеми сайтами, кроме нужного. При отправке на него запроса появилась ошибка:
0x05: Соединение отклонено
1 ответ
Решение для библиотеки я нашел за пару минут. Но я не нашел решения для , поэтому мне потребовалось несколько часов, чтобы найти решение самостоятельно.
Наконец-то я нашел решение, поэтому собираюсь опубликовать решения для каждой из библиотек ниже, чтобы помочь другим разработчикам сэкономить время при решении той же проблемы.
Чтобы сделать успешный запрос к такому сайту, попробуйте включить обратный DNS (rDNS). Я опишу, как это сделать дляrequests
иaiohttp
библиотеки.
Запросы
Чтобы включить rDNS, вам необходимо использоватьsocks5h://...
вместоsocks5://...
в URL-адресе прокси.
требования.txt
PySocks==1.7.1
requests==2.31.0
main.py
import requests
def main():
proxy = 'socks5://username:password@0.0.0.0:1111'
proxy = proxy.replace('socks5://', 'socks5h://')
# or just
# proxy = 'socks5h://username:password@0.0.0.0:1111'
response = requests.get(url='https://www.example.com/', proxies={'http': proxy, 'https': proxy})
print(response.text)
if __name__ == '__main__':
main()
айоhttp
Чтобы включить rDNS, вам необходимо передатьrdns=True
параметр во время инициализацииProxyConnector
.
требования.txt
aiohttp==3.8.4
aiohttp-socks==0.8.0
PySocks==1.7.1
main.py
import asyncio
import aiohttp
from aiohttp_socks import ProxyConnector
async def main():
proxy = 'socks5://username:password@0.0.0.0:1111'
connector = ProxyConnector.from_url(url=proxy, rdns=True)
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get(url='https://www.example.com/') as response:
print(await response.text())
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())