SendCodeRequest не доставляет код без ошибок, и это происходит только на стороне сервера с Heroku - PullRequest
1 голос
/ 18 апреля 2020

Вот моя ситуация: один и тот же код Telethon используется на моей локальной машине и на сервере. Запрос кода авторизации с локальной машины работает нормально. Запрос кода с сервера не вызывает ошибок, и код не отправляется. Иногда это работает даже с сервера без каких-либо изменений в коде.

Я предполагаю, что могут быть некоторые блоки ip или что-то, связанное с ip, потому что это единственное, что может отличаться на стороне сервера: Heroku назначает ip-адреса динамически, поэтому некоторые подсети могут заблокирован Telegram API по какой-то причине. Но ошибки нет, и это действительно странно. Существует слишком много IP-адресов, чтобы опровергнуть гипотезу. Мне нужно поймать хотя бы один IP-адрес, который дает мне противоположные результаты: один раз код получен, а другой нет. Поэтому я застрял в этой ситуации и понятия не имею, как это можно исправить или уточнить.

global t
t = None


async def ssssendCode(phone):
    global t
    try:
        if os.path.isfile(phone+'.session'):
            logger.debug('client file exists')
        else:
            logger.debug('client file does not exist')
        if t is None:
            t = TelegramClient(phone, settings['telegramClientAPIId'], settings['telegramClientAPIHash'])
        t.phone = phone
        #t.phone_code_hash = None
        await t.connect()
        #response = await t.send_code_request(phone=phone,force_sms=True)
        s3_session.resource('s3').Bucket('telethon').upload_file(str(phone)+".session", str(phone)+".session")
        logger.debug(str(requests.get('https://httpbin.org/ip').text))
        response = await t.send_code_request(phone=phone)
        logger.debug(str(t.is_connected()))
    except Exception as e:
        response = str(e)

    return str(response)

пример ответа на запрос локальной машины

SentCode(type=SentCodeTypeSms(length=5), phone_code_hash='b5b069a2a4122040f1', next_type=CodeTypeCall(), timeout=120)

пример ответа на запрос на стороне сервера

SentCode(type=SentCodeTypeSms(length=5), phone_code_hash='0e89db0324c1af0149', next_type=CodeTypeCall(), timeout=120)

send_code_request от Telethon без изменений

async def send_code_request(
            self: 'TelegramClient',
            phone: str,
            *,
            force_sms: bool = False) -> 'types.auth.SentCode':
        """
        Sends the Telegram code needed to login to the given phone number.

        Arguments
            phone (`str` | `int`):
                The phone to which the code will be sent.

            force_sms (`bool`, optional):
                Whether to force sending as SMS.

        Returns
            An instance of :tl:`SentCode`.

        Example
            .. code-block:: python

                phone = '+34 123 123 123'
                sent = await client.send_code_request(phone)
                print(sent)
        """
        result = None
        phone = utils.parse_phone(phone) or self._phone
        phone_hash = self._phone_code_hash.get(phone)

        if not phone_hash:
            try:
                result = await self(functions.auth.SendCodeRequest(
                    phone, self.api_id, self.api_hash, types.CodeSettings()))
            except errors.AuthRestartError:
                return await self.send_code_request(phone, force_sms=force_sms)

            # If we already sent a SMS, do not resend the code (hash may be empty)
            if isinstance(result.type, types.auth.SentCodeTypeSms):
                force_sms = False

            # phone_code_hash may be empty, if it is, do not save it (#1283)
            if result.phone_code_hash:
                self._phone_code_hash[phone] = phone_hash = result.phone_code_hash
        else:
            force_sms = True

        self._phone = phone

        if force_sms:
            result = await self(
                functions.auth.ResendCodeRequest(phone, phone_hash))

            self._phone_code_hash[phone] = result.phone_code_hash

        return result

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

...