запросы /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())

Другие вопросы по тегам