如何修复Telethon检测手机号时的Cannot find any entity错误?
Telegram手机号注册检测工具异常问题修复
你的代码核心问题在于异常捕获范围不全,导致第二个及以后的号码检测出错时直接终止流程:
- 未注册的手机号不会抛出
PhoneNumberInvalidError,而是抛出ValueError(即你看到的Cannot find any entity corresponding to "XXXXXXXXXXX"错误) - 内层
try-except只捕获了PhoneNumberInvalidError,未处理ValueError,错误会触发外层的Exception捕获,进而执行finally中的断开连接,循环直接终止,后续号码无法继续检测。
修复后的代码
from telethon import TelegramClient from telethon.errors.rpcerrorlist import PhoneNumberInvalidError from telethon.tl.functions.contacts import ResolvePhoneRequest # 更精准的手机号检测API api_id = 12345678 api_hash = '1234567890qwertyuiop' client = TelegramClient('session_name', api_id, api_hash) input_file_path = 'input_numbers.txt' registered_numbers_file_path = 'registered_numbers.txt' non_registered_numbers_file_path = 'non_registered_numbers.txt' async def check_phone_numbers(): try: await client.connect() if not await client.is_user_authorized(): await client.send_code_request('+XXXXXXXXXX') code = input('Enter the code: ') await client.sign_in('+XXXXXXXXXX', code) # 用追加模式避免中途出错丢失已写入数据,同时处理空行 with open(input_file_path, 'r') as input_file, \ open(registered_numbers_file_path, 'a', encoding='utf-8') as registered_numbers_file, \ open(non_registered_numbers_file_path, 'a', encoding='utf-8') as non_registered_numbers_file: for line in input_file: phone_number = line.strip() if not phone_number: continue try: # 调用专门的手机号解析接口,比get_entity更精准 await client(ResolvePhoneRequest(phone_number)) print(f'{phone_number} 已注册') registered_numbers_file.write(f'{phone_number}\n') except (PhoneNumberInvalidError, ValueError): print(f'{phone_number} 未注册') non_registered_numbers_file.write(f'{phone_number}\n') except Exception as e: # 单独处理单个号码的意外错误,不中断整体流程 print(f'{phone_number} 检测失败: {e}') except Exception as e: print(f'全局错误: {e}') finally: await client.disconnect() if __name__ == '__main__': client.loop.run_until_complete(check_phone_numbers())
关键修改说明
- 完善异常捕获:内层
try-except同时捕获PhoneNumberInvalidError和ValueError,确保未注册号码的错误不会终止整个检测流程 - 改用精准API:使用
ResolvePhoneRequest直接调用Telegram官方的手机号解析接口,专门用于验证手机号是否对应有效账号,比get_entity更可靠 - 优化文件操作:将写入模式从
w(清空覆盖)改为a(追加),避免中途出错丢失已检测的结果;添加空行跳过逻辑,处理输入文件中的无效空行 - 容错机制增强:单独捕获单个号码的意外错误,避免因API限制、网络波动等问题中断整体检测
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

