Вот моя ситуация: один и тот же код 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 минут между попытками получить код из локального машина и сервер, так что это абсолютно не проблема тайм-аута. И более того: даже при запросе кода из локальной системы через полминуты после неудачной попытки на стороне сервера: код приходит почти сразу.