Почему не работает асинхронный код python под прокси?

Ссылка скопирована
1 ответ

Настроил проксифаер на python.exe в виртуальном окружении моего небольшого скрипта. Использую SOCKS5 (пробовал и HTTP) прокси, тестировал их, все работает. До асинхронной части кода все работает нормально. Но как только дело доходит до асинхронной части, его работа прекращается, просто бесконечное ожидание без исключений. Без проксифаера все работает как надо.
Второй момент. Под проксифаером, при попытке запустить код в режиме отладки в pycharm срабатывает это исключение ConnectionRefusedError: [WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение

Дополнительно:

Показывайте код.

  • from telethon import TelegramClient import socks import json import asyncio  proxy = {     'proxy_type': socks.HTTP,     'addr': 'addr',     'port': port,     'username': 'username',     'password': 'password' }  with open('file.json', 'r') as file:     client_data = json.load(file)  channel = 'https://t.me/channel'   async def main():     # на этом конец     async with TelegramClient(client_data['session_file'],                               api_id=client_data['app_id'],                               api_hash=client_data['app_hash'],                               app_version=client_data['app_version'],                               device_model=client_data['device'],                               system_version=client_data['sdk'],                               proxy=proxy) as client:         me = await client.get_me()         print(me.stringify())  asyncio.run(main())

    from telethon import TelegramClient import socks import json import asyncio proxy = { 'proxy_type': socks.HTTP, 'addr': 'addr', 'port': port, 'username': 'username', 'password': 'password' } with open('file.json', 'r') as file: client_data = json.load(file) channel = 'https://t.me/channel' async def main(): # на этом конец async with TelegramClient(client_data['session_file'], api_id=client_data['app_id'], api_hash=client_data['app_hash'], app_version=client_data['app_version'], device_model=client_data['device'], system_version=client_data['sdk'], proxy=proxy) as client: me = await client.get_me() print(me.stringify()) asyncio.run(main())

    Не важно что в функции Main, пробовал разное, ничего не меняется

  • Что такое проксификсер? Proxyfier?
  • Vindicar, Да
  • ReDissKa, тогда я не очень понял, зачем у тебя в коде обращение к прокси. Проксифаер перехватывает сетевые вызовы целевого процесса, передавая весь его трафик через указанный прокси. Вся его фишка в том, что целевой процесс про прокси не знает и работать с ним не умеет.
  • Vindicar, Обращение к прокси в самом коде и не обязательно, проблема настигла еще не дойди выполнение до части кода с TelegramClient. Как я и говорил, в async main можно разместить что угодно, сути не поменяет. В командной строке будет пустота, а в логах проксифаера появится ошибка
  • ReDissKa, лог с ошибкой в студию.
  • Ответы:

    Посмотрите этот код, может, поможет:
    import asyncio
    import os
    import time
    import random
    from time import perf_counter
    import aiohttp
    import aiofiles

    SITE = 'https://thispersondoesnotexist.com/'
    IMAGE_COUNT = 50
    PROXY = ''

    def generate_filename(file_extension):
    temp = str(int(time.time()))
    for _ in range(5):
    temp += chr(random.randint(65, 75))
    return f'{temp}.{file_extension}'

    async def download_image(image_num):
    async with aiohttp.ClientSession() as session:
    async with session.get(SITE, proxy=f'http://{PROXY}') as response:
    extension = response.headers['content-type'].split('/')[-1]
    filename = os.path.join('Images_async', generate_filename(extension))

    async with aiofiles.open(filename, mode='wb') as file:
    async for chunk in response.content.iter_chunked(64 * 1024):
    await file.write(chunk)
    print(f'image {image_num + 1} finished...')

    async def main():
    image_tasks = []
    for image_num in range(IMAGE_COUNT):
    image_tasks.append(asyncio.create_task(download_image(image_num)))
    await asyncio.gather(*image_tasks)

    if __name__ == '__main__':
    start = perf_counter()
    asyncio.run(main())
    print(f'time: {(perf_counter() - start):.02f}')

    Я этот код увидел в процессе обучения. Он работает.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Андрей PHP Ответ

    Для того чтобы понять, почему асинхронный код на Python может не работать под прокси, нужно учитывать несколько возможных причин.

    1. Прокси-сервер блокирует асинхронные запросы: Некоторые прокси-серверы могут блокировать асинхронные запросы из-за своих настроек безопасности. В этом случае вам нужно проверить настройки прокси-сервера и возможно изменить их для поддержки асинхронного кода.

    2. Проблемы с подключением к прокси: Иногда возникают проблемы с подключением к прокси-серверу из-за неправильных настроек или недоступности сервера. Убедитесь, что вы правильно сконфигурировали ваш код для работы с прокси и что прокси-сервер доступен.

    3. Неправильная обработка исключений: Ваш асинхронный код может не обрабатывать исключения, возникающие при работе через прокси. Убедитесь, что ваш код содержит соответствующие обработчики исключений для работы с прокси.

    Приведу пример кода на Python, который может помочь вам работать с асинхронными запросами через прокси:

    import aiohttp
    import asyncio
     
    async def fetch(url, proxy):
        async with aiohttp.ClientSession() as session:
            async with session.get(url, proxy=proxy) as response:
                return await response.text()
     
    async def main():
        url = 'https://example.com'
        proxy = 'http://yourproxy.com:8080'
        html = await fetch(url, proxy)
        print(html)
     
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

    import aiohttp import asyncio async def fetch(url, proxy): async with aiohttp.ClientSession() as session: async with session.get(url, proxy=proxy) as response: return await response.text() async def main(): url = 'https://example.com' proxy = 'http://yourproxy.com:8080' html = await fetch(url, proxy) print(html) loop = asyncio.get_event_loop() loop.run_until_complete(main())

    Убедитесь, что вы правильно сконфигурировали параметры прокси (в данном случае proxy) и обработали возможные исключения для успешной работы вашего асинхронного кода под прокси.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно