Как можно указать конкретный локальный хост и порт для исходящих запросов к Telegram API при использовании библиотеки aiogram?

На сервере, где я работаю, исходящие запросы могут выполняться только с конкретного локального хоста и порта. Я попытался переопределить стандартный метод класса AiohttpSession следующим образом: <br/> 
<pre><code class="python">from aiogram.client.session.aiohttp import AiohttpSession
from aiohttp import ClientSession
from aiohttp.hdrs import USER_AGENT
from aiohttp.http import SERVER_SOFTWARE

from aiogram.__meta__ import __version__

class CustomSession(AiohttpSession):
    def __init__(self, local_ip: str, local_port: int, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.local_ip = local_ip
        self.local_port = local_port

    async def create_session(self) -&gt; ClientSession:
        if self._should_reset_connector:
            await self.close()

        if self._session is None or self._session.closed:
            self._connector_init.update({
                'local_addr': (self.local_ip, self.local_port)
            })
            self._session = ClientSession(
                connector=self._connector_type(**self._connector_init),
                headers={
                    USER_AGENT: f"{SERVER_SOFTWARE} aiogram/{__version__}",
                },
            )
            self._should_reset_connector = False

        return self._session</code></pre>
<br/> Затем я создаю бота следующим образом: <br/> 
<pre><code class="python">bot = Bot(token=item['token'],
                session=CustomSession(local_ip=TG_HOST, local_port=TG_PORT),
                default=DefaultBotProperties(parse_mode=ParseMode.HTML))</code></pre> 
<br/> Однако я всё равно получаю ошибку: <br/> 
<pre><code>Traceback (most recent call last):
  File "/Users/macbook/Dev/merchant/venv/l</code></pre> 

Как можно выяснить, что именно вызывает эту ошибку и как её исправить?
  • 27 сентября 2024 г. 13:43
Ответы на вопрос 2
Чтобы помочь вам выяснить, что вызывает ошибку, вы можете предпринять несколько шагов. Прежде всего, важно убедиться, что ваша кастомная сессия `CustomSession` корректно интегрирована в `aiogram`, и проверить все параметры, которые вы передаете.

### Шаги для устранения проблемы:

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

2. **Логирование:** Добавьте отладочные сообщения в ваш код, чтобы отслеживать выполнение. Вы можете добавить несколько принтов, чтобы проверить, что именно происходит в вашей кастомной сессии.

   ```python
   class CustomSession(AiohttpSession):
       def __init__(self, local_ip: str, local_port: int, *args, **kwargs):
           super().__init__(*args, **kwargs)
           self.local_ip = local_ip
           self.local_port = local_port
           print(f"CustomSession initialized with local_ip={local_ip}, local_port={local_port}")

       async def create_session(self) -> ClientSession:
           print("Creating session...")
           if self._should_reset_connector:
               await self.close()

           if self._session is None or self._session.closed:
               print("Session is None or closed. Initializing new session...")
               self._connector_init.update({
                   'local_addr': (self.local_ip, self.local_port)
               })
               self._session = ClientSession(
                   connector=self._connector_type(**self._connector_init),
                   headers={
                       USER_AGENT: f"{SERVER_SOFTWARE} aiogram/{__version__}",
                   },
               )
               self._should_reset_connector = False

           return self._session
   ```

3. **Проверка IP и порта:** Убедитесь, что значения `local_ip` и `local_port`, которые вы передаете в `CustomSession`, действительно действительны и доступны для используемого сетевого интерфейса. Попробуйте использовать IP-адрес `127.0.0.1` и обычный порт (например, `8080`), чтобы исключить возможные сетевые проблемы.

4. **Проверка зависимости от aiohttp:** Убедитесь, что у вас установлена последняя версия библиотеки `aiohttp`, так как изменения в API могут вызвать неожиданные проблемы. Убедитесь, что версия `aiogram` совместима с `aiohttp`:

   ```bash
   pip install -U aiohttp aiogram
   ```

5. **Попробуйте минимальный пример:** Создайте минимальный пример (без дополнительных настроек), чтобы увидеть, работает ли он с вашим `CustomSession`. Это может помочь до некоторой степени изолировать проблему.

6. **Обратите внимание на другие настройки bota:** Проверьте, все ли остальные параметры, такие как токен и режим парсинга, указаны корректно.

7. **Обновите aiogram:** Посмотрите, нет ли на текущий момент актуальных версий библиотеки `aiogram`, которые могли бы решить вашу проблему. 

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