Telethon调用Telegram API无法获取SMS验证码的问题求助
如何强制Telegram通过SMS发送验证码?
我用Telethon编写了如下代码调用Telegram API:
from telethon import TelegramClient, events, sync from telethon.tl.functions.users import GetFullUserRequest from telethon.tl.functions.messages import CheckChatInviteRequest from telethon.tl.functions.channels import GetFullChannelRequest import time import asyncio import socks import random import requests import json import os api_id = 'MY API ID HERE' api_hash = 'MY ID HASH HERE' names = [] surnames = [] f = open('surnames.txt') for line in f: surnames.append(line) f.close() f = open('names.txt') for line in f: names.append(line) f.close() first_name = random.choice(names)[:-1] last_name = random.choice(surnames)[:-1] print(f"{first_name} {last_name}") phone_number = '+916387698598' client = TelegramClient(phone_number, api_id, api_hash) client.connect() #code_request = client.send_code_request(phone_number, force_sms=True) #if i use force_sms=True it returns error telethon.errors.rpcerrorlist.SendCodeUnavailableError: (caused by ResendCodeRequest) code_request = client.send_code_request(phone_number) #when i use it without forcing SMS it send code to telegram #code stuck here because it is unused nuber and it is obviously that i cant get code in telegram app that is why i need sms client.sign_up(input('Enter code: '), first_name=first_name, last_name=last_name, phone=phone_number, phone_code_hash=code_request) client.start()
调用client.send_code_request()返回对象SentCode(type=SentCodeTypeApp(length=5), phone_code_hash='7b858e791fadefae8b', next_type=None, timeout=None),可见Telegram没有提供将验证码类型从SentCodeTypeApp切换为SentCodeTypeSMS的超时设置,且next_type字段为空。
当尝试设置force_sms=True时,Telethon调用API的auth.resendCode方法,返回SEND_CODE_UNAVAILABLE错误。
我已经排查过Telethon源码,确认问题出在Telegram API端;尝试修改device_model、自定义认证码设置均无效。现在想知道如何强制Telegram通过SMS发送验证码?
解决思路
- 换用真实在用号码:你使用的是未注册过Telegram的新号码,Telegram对这类号码的SMS验证限制极严,尤其是虚拟运营商号码。换一个已经在实体设备上使用过的真实手机号测试,大概率能触发SMS验证选项。
- 延迟调用重发接口:不要一开始就用
force_sms=True,先调用send_code_request()触发APP验证,等待60秒左右(Telegram的冷却时间),再调用client.resend_code(phone_number, code_request.phone_code_hash),部分场景下此时Telegram会开放SMS通道。 - 切换到测试环境:Telegram测试环境(Test DC)的验证策略更宽松,创建客户端时指定测试环境地址:
client = TelegramClient(phone_number, api_id, api_hash, base_url='https://test.telegram.org') - 规避区域IP限制:你的号码是印度地区(+91),该区域的SMS验证可能有特殊限制。尝试使用其他地区的代理IP发送请求,避免IP段被Telegram限制。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

