You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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())

关键修改说明

  1. 完善异常捕获:内层try-except同时捕获PhoneNumberInvalidError和ValueError,确保未注册号码的错误不会终止整个检测流程
  2. 改用精准API:使用ResolvePhoneRequest直接调用Telegram官方的手机号解析接口,专门用于验证手机号是否对应有效账号,比get_entity更可靠
  3. 优化文件操作:将写入模式从w(清空覆盖)改为a(追加),避免中途出错丢失已检测的结果;添加空行跳过逻辑,处理输入文件中的无效空行
  4. 容错机制增强:单独捕获单个号码的意外错误,避免因API限制、网络波动等问题中断整体检测

内容的提问来源于stack exchange,提问作者Nik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:29:59