warning 免责声明
《中国计算机信息网络国际联网管理规定》 计算机信息网络直接进行国际联网,必须使用邮电部国家公用电信网提供的国际出入口信道。任何单位和个人不得自行建立或者使用其他信道进行国际联网。如果您位于中国,那么请遵守以上规定。本站对您的行为不负任何责任。
如果你身处中国大陆,并且曾经设法注册了一个 Telegram 账号的话,你大概已经知道了一个遗憾的事实:中国运营商屏蔽了 Telegram 的短信验证码。这意味着,如果你仅有一台设备登录的话,一旦退出登录,那么将无法再次登录 Telegram ——直到你离开中国大陆的移动信号服务区。
要解决这个烦人的问题,我们先要搞清楚,运营商是怎么屏蔽短信的?在此之前,还需要搞清楚,一条国际短信是如何送到你的手机上的?
问题分析
现代移动通讯的技术基础是GSM(Global System for Mobile Communications),又称全球通讯系统,在中国俗称为2G网络。
2G网络可以为用户提供基础的打电话,发短信功能,而上网速度则非常缓慢,只有15-20K/s。通俗地说,假设一个国外的用户向国内的用户发送了一条短信,这条短信将会通过电缆或无线电基站等各种方式抵达国内的某处机房,在这里进行关键词检测,如果没问题,那么机房会通过基站把短信发给最终用户。
换SIM卡的方法是基本无效的,因为无论是国内的SIM卡还是国外的SIM卡,最终都得经过机房的检测,区别只是运营商不同而已。
我们需要找到一种真正的解决方案。
准备工作
在开始之前,你需要…..
- 一个 「至少已经登陆在一台设备上」 的 Telegram 账号
- Python运行环境,推荐3.10+
- 学习一些基本的信息知识,例如Linux命令行,Python pip等等(本文非小白向)
Step 1. 申请一个 Telegram 开发者 API ID
前往 my.telegram.org ,在登陆框里输入你的手机号(即使收不到验证码),检查你的 Telegram 服务通知,复制验证码填到浏览器里并点击下一步。
登录后,你会看到两个功能,一个是销户,一个是申请API ID。
选择“API development tools”,接着网页会让你填写一些基本信息,可以随便填。
一切结束后,你会看到API ID和API Hash
注意,你的API Hash和API ID必须严格保密,否则别人可以冒用你的身份来写第三方 Telegram 客户端
Step 2. 配置Python环境
Python如何安装这种问题我就不赘述了,网上教程一大把
接下来的代码要用到telethon,安装telethon需要在命令行执行:
pip install telethon
Step 3. 获取一个 Telegram Session
Session 意为“会话”,你每一次登录 Telegram,都会创建一个新Session
我们的目的是在新设备上重新登陆一次 Telegram,拿到一个新的Session字符串。
你可以使用这个链接 (记得一开始选Telethon):Link
获取Session相当于登录 Telegram,因此你需要输入自己账户的手机号,然后再次在 Telegram 服务通知里查阅验证码。
如果你开了二步验证,你还需要额外输入你的二步验证密码。
我不保证这个链接是安全的,但是我本人通过这个链接获取的Session,至今无事。如果你实在担心安全性,可以把脚本下载到本地运行。
请将你获取的Session字符串严格保密,任何人拿到你的Session都可以直接获取你 Telegram 账号的完整访问权限。
Step 4. 写代码
接下来,理论上你就要开始写Python脚本了,但是你不用写,这里已经帮你准备好了模板:
from telethon import TelegramClient, events
import logging
from telethon.sessions import StringSession
from telethon.tl.types import InputMediaPhoto,InputMediaPhotoExternal
logging.basicConfig(format='[%(levelname) 5s/%(asctime)s] %(name)s: %(message)s', level=logging.WARNING)
APP_ID = <你的APP ID>
API_HASH = <你的APP HASH>
SESSION = <你的SESSION>
client = TelegramClient(StringSession(SESSION), APP_ID, API_HASH)
#client = TelegramClient(StringSession(SESSION), APP_ID, API_HASH,proxy=("socks5", '127.0.0.1', 10808))
#如果你需要使用代理,那么请去掉上面那一行的注释,并注释掉上上行。代理配置请自行修改,本文不再赘述。
async def main():
entity = await client.get_entity(777000)
async for message in client.iter_messages(entity,1):
print(message.raw_text)
with client:
client.loop.run_until_complete(main())
将上述脚本的对应内容换成你的API ID, API HASH 和 SESSION,别忘了给后两个加上双引号。
下面是一个伪示例:
APP_ID = 12345678
API_HASH = "d84caca3caca4835abece79d4d16c57d"
SESSION = "XXXXXXXXXXXXXXXXX"
Step 5. 运行脚本
运行你的脚本,脚本应该会输出你 Telegram 服务通知的最后一条消息。
你可以对比一下输出的结果和 Telegram 服务消息,看看是否匹配。脚本的目的是通过一个额外的Session获取 Telegram 服务验证码,这样可以绕过SMS验证。
尾声: 拓展与提示
Session有有效期,最长是一年。
如果你想要保险一些的措施,可以租赁一台云服务器,然后利用定时任务来循环执行脚本。
每一次执行都会刷新这个Session的上线时间,这样你的Session只要不手动在 设置->隐私->设备 里注销,将会一直保持可用。
更高级的玩法是把脚本配合PHP和服务器使用,这样你就可以在没有任何其他设备(电脑)的情况下,通过浏览器快速地随时随地查阅验证码了。
下次如果你不小心手滑退出了 Telegram 账号,别再慌了!
from telethon.sync import TelegramClient
from telethon.sessions import StringSession
from termcolor import colored, cprint
import socks
import os
import logging
import json
host = “192.168.18.22”
port = 6153
proxy = (socks.SOCKS5, host, port)
api_id = ‘api_id’
api_hash = ‘api_hash’
def main():
while True:
with TelegramClient(StringSession(), api_id, api_hash) as client:
session_str = client.session.save()
user_name = “me” if not client.is_bot() else input(colored(“Enter the username: “, “green”))
client.send_message(user_name, session_str)
cprint(“please check your Telegram Saved Messages/User’s PM for the StringSession “, “yellow”)
break
if __name__ == “__main__”:
main()
新代码获取session
@Benjp: 报错telethon.errors.rpcerrorlist.FloodWaitError: A wait of 71995 seconds is required (caused by SendCodeRequest)
Step 3. 获取一个 Telegram Session是怎么实现的?我点开链接后是一个main.py文件,保存到本地运行后,提示ModuleNotFoundError: No module named ‘pyrogram’。
另外,这个网站也能生成session,但是我输入信息后报错 406: UPDATE_APP_TO_LOGIN (caused by auth.SendCode)
那个链接无法运行 会报错 是要在本地运行吗?
@blair: 那个链接的telethon版本不一定够了,你最好本地Python环境里装个telethon库,然后按照telethon官方文档里面的教程在本地登录。我过段时间会更新这部分内容。
@SheepChef: 辛苦大佬了
尝试了这个方案,能正常使用。
感谢佬提供的解决方案,使用接码平台注册的telegram,一旦登录的设备退出了重新登录就要重新接验证码但是又接不到,这个方案就可以解决这个问题
💯这个保险不错,改天就加上。