☰
用Telegram机器人自动提取验证码,轻松搞定教育权益申请
2026/9/25 4:24:34 网站建设 项目流程

“教育权益”这四个字,说穿了就是平台给在校学生留的一扇后门,但偏偏这扇门需要你自己拿着学校邮箱去敲。以 Spotify 学生优惠为例,是不是校园邮箱 + SheerID 验证一过,月费直接砍半;Gemini 和 ChatGPT 相关的 AI 订阅权益,也往往挂在 Google Workspace for Education 或学校授权计划下面。问题在于,验证流程里最容易出事的就是邮件环节:验证码迟到、被扔进垃圾箱、链接过期,等你想起来的时候,优惠申请已经卡在“pending”状态好几天了。我后来搭了一个 Telegram 机器人,把“收邮件→提取验证码→推送到手机”这条链路完全托管,申请提交后只需要在手机上点一下打开链接,剩下的事交给机器人盯梢。这篇文章就把这套流程完整拆开,从机器人申请、邮箱接入到验证码自动提取逐一讲透,适合有真实学生身份、但不想每天刷邮箱的读者。

1. 项目概述:教育权益背后的验证机制

1.1 三大平台权益到底能省多少

先说我自己算过的一笔账。Spotify Premium Student 在大部分地区是普通 Premium 的一半左右,一年下来省下的订阅费足够吃好几顿火锅。Gemini 相关教育权益需要学校管理员开通 Workspace for Education 后,师生账号内才能解锁增强版模型能力,这部分虽然不像Spotify那样直接减免账单,但免费额度比个人版更宽裕,对经常拿 AI 写代码、整理笔记的人来说,省下的是实打实的会员月费。ChatGPT 侧的情况稍特殊,不少学校不是直接发 ChatGPT 账号,而是通过 GitHub Student Developer Pack、Microsoft 教育计划等平台,把 AI 算力额度以福利包的形式发给你,本质还是“教育身份验证 → 领取/解锁权益”。

所以这三家表面上是不同服务,底层逻辑几乎一样:你先证明自己是学生,平台再给你优惠价或额外额度。谁验证得又快又稳,谁就能赶上周期性的福利活动,比如 Spotify 偶尔对学生用户送三个月的免费试用。

1.2 验证流程的共性套路

无论哪个平台,教育验证都逃不开这四步:

  1. 你提交学校邮箱或学生证件;
  2. 平台向你的邮箱发一封带验证链接/验证码的邮件;
  3. 你打开邮件,点击链接或回填验证码;
  4. 平台确认你的身份,正式把账号标记为“教育权益用户”。

看起来不复杂,但实际卡点特别多。校园邮箱本身可能开启了外域邮件过滤,平台邮件很容易被拦在垃圾箱;验证链接有时长限制,你下课回宿舍一看,已经过期;还有的学校邮箱需要二次验证才能登录网页版,IMAP 授权码没设置好,程序根本连不上。我搭 TG 机器人解决的不只是“收不到邮件”,而是把整个确认环节压到最短,让验证码在你手机弹出来时就处于新鲜状态。

1.3 用TG机器人重构验证流程

我设计的流程不是黑魔法,而是一个半自动管道:

  • TG 机器人定时去邮箱拉取新邮件;
  • 根据发件人域名(spotify.com、google.com 等)过滤出验证类邮件;
  • 用正则表达式把验证码或验证链接提取出来;
  • 通过 Telegram 消息推送到你手机,附上操作按钮;
  • 你点一下消息里的按钮,直接打开验证链接或回填验证码。

这样“全自动验证”的准确说法是“全自动接收+半自动点击”,因为大部分平台出于风控,还是需要你本人确认,但只要消息推送及时,基本都能一次过。这条流程对三大平台完全通用,你只需要在配置里定义好各自的发件人和邮件标题关键词。

2. 搭建TG机器人前需要准备什么

2.1 注册机器人并拿到Token

这一步最简单,也最关键。在 Telegram 里找到@BotFather,发送/newbot,按提示填一个名字和用户名。用户名必须以bot结尾,比如edu_verifier_bot。创建成功后会收到一个字符串形式的 token,形如123456789:AAE...,这就是机器人的身份证。

拿到 token 后,你还需要知道自己的chat_id,也就是和机器人对话的会话编号。最简单的办法是把机器人拉到一个只有你的群聊,或者直接在 Bot 里点“Start”,然后访问 Telegram API 的getUpdates接口,用 Python 请求一次就能看到chat对象里的id。这个数字后面发送消息会反复用到,建议提前存到环境变量里。

2.2 选择运行环境

机器人脚本不需要高性能服务器,但要求稳定在线。我试过三种环境,给你直接说结论:

  • 本地电脑 + Windows 计划任务 / systemd:适合折腾,电脑不关机的情况下零成本;缺点是断电、休眠时会漏消息。
  • 一台云主机(1核512MB 就够):目前最推荐,因为可以常驻,配合systemd管理崩溃自动重启。
  • 云函数 / 定时触发器:成本最低但稍微麻烦,需要把每个邮箱轮询任务打包成无状态函数,验证码提取后一次性请求 Telegram API。

如果你刚开始,我建议用本地电脑跑通再迁到云主机。为了不暴露代码里的邮箱密码,记得把敏感配置放在.env文件里,用python-dotenv读取。

2.3 邮箱接入的三种姿势

这里需要根据你学校邮箱的情况选一种。学校邮箱能开 IMAP 的话(绝大多数都能),用imaplib拉取是最省事的。如果你所在的学校邮箱出于安全策略关闭了 IMAP,那就只能用邮件转发:在邮箱后台把带subject:verification的邮件自动转发到你的 Gmail,然后让机器人只读 Gmail。第三种是“专用邮箱法”,我个人的小窍门:注册一个专门用于教育权益申请的 Gmail/Outlook 邮箱,提交学生信息时用这个专用邮箱,机器人也只盯着这个邮箱,避免和学习邮件混在一起。

三种方式各有优缺点,表格如下:

接入方式优点缺点适合人群
IMAP直连实时性高,不用额外邮箱需开启IMAP和授权码学校邮箱支持IMAP
自动转发无需改学校邮箱设置转发有延迟,可能丢邮件学校邮箱不支持IMAP
专用邮箱逻辑清晰,避免打扰需多注册一个邮箱长期订阅多个权益

3. 代码实战:让机器人替你盯验证邮件

3.1 目录结构与依赖

新建一个项目文件夹,结构如下:

edu_verifier/ ├── main.py # 主程序入口 ├── config.py # 配置读取 ├── requirements.txt # 依赖清单 ├── .env # 敏感信息

requirements.txt里至少需要这些库:

python-telegram-bot==21.6 python-dotenv==1.0.1 beautifulsoup4==4.12.3 requests==2.32.3

python-telegram-bot负责和 TG 交互,beautifulsoup4用于解析 HTML 邮件正文,requests用于打开验证链接时附带必要的 headers。

3.2 核心代码:IMAP拉取+验证码提取+TG推送

先看主循环。脚本每 60 秒连接一次邮箱,抓取最近 3 封未读邮件,并判断是否属于目标平台邮件。代码骨架如下:

import imaplib import email import re import os import requests from email.header import decode_header from dotenv import load_dotenv load_dotenv() IMAP_HOST = os.getenv("IMAP_HOST") # 例如 imap.gmail.com IMAP_USER = os.getenv("IMAP_USER") IMAP_PASS = os.getenv("IMAP_PASS") TG_TOKEN = os.getenv("TG_TOKEN") TG_CHAT_ID = os.getenv("TG_CHAT_ID") TARGET_SENDER_PATTERN = r"(noreply@|no-reply@)" keywords = { "spotify": r"(spotify|sheerid|student discount)", "gemini": r"(gemini|google workspace|education)", "chatgpt": r"(chatgpt|openai|student pack|copilot)" } def fetch_unseen_mails(): mail = imaplib.IMAP4_SSL(IMAP_HOST, 993) mail.login(IMAP_USER, IMAP_PASS) mail.select("INBOX") status, data = mail.search(None, "UNSEEN") mail_ids = data[0].split() mails = [] for mid in mail_ids[-3:]: status, msg_data = mail.fetch(mid, "(RFC822)") raw = msg_data[0][1] msg = email.message_from_bytes(raw) mails.append(msg) return mail, mails

这里注意,有些学校邮箱的 IMAP 服务器地址不是imap.学校域名,而是outlook.office365.com这种公共服务器,你需要先查一下学校邮箱帮助页面,或者问同学要一条 IMAP 配置。

提取验证码时,不能只匹配纯短信里的 6 位数字。很多平台邮件正文是 HTML,验证码可能被拆成多个节点。我只保留关键逻辑:

def extract_code_from_html(html_text): # 常见样式:验证码放在 <b>123456</b> 或 <strong>123456</strong> soup = BeautifulSoup(html_text, "html.parser") for tag in soup.find_all(["b", "strong", "span"]): text = tag.get_text(strip=True) if re.fullmatch(r"\d{4,8}", text): return text # 兜底:匹配整段文本里的连续数字 plain_text = soup.get_text(" ", strip=True) m = re.search(r"(?<!\d)\d{4,8}(?!\d)", plain_text) return m.group(0) if m else None

拿到验证码后,立即用 Telegram Bot API 发送:

def send_tg_message(text): url = f"https://api.telegram.org/bot{TG_TOKEN}/sendMessage" data = {"chat_id": TG_CHAT_ID, "text": text} requests.post(url, data=data, timeout=10)

这样你手机上会在 1 分钟内收到一条带验证码的消息,比传统去邮箱看网页快得多。

3.3 各平台验证邮件的特征配置

为了减少误报,我的做法是给每个平台维护一个“邮件特征清单”。比如说:

  • Spotify 的验证邮件发件人通常是noreply@sheerid.com或no-reply@spotify.com,标题里带Verify your student status;
  • Gemini/Google Workspace for Education 的验证邮件可能来自workspace-noreply@google.com,标题里有Google Workspace或education account;
  • ChatGPT 相关的教育权益验证,如果是通过 GitHub 处理的,发件人大概率是notifications@github.com,标题有Student Developer Pack。

把这些特征写进配置文件,classify()就能返回平台标签,然后按各自偏好生成推送文案。比如 Spotify 的直接给验证码,GitHub 的可能给“点击链接确认”的按钮。按钮用 Telegram 的 Inline Keyboard:

from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Application, CommandHandler, CallbackQueryHandler reply_markup = InlineKeyboardMarkup( [[InlineKeyboardButton("打开验证链接", url=verify_url)]] )

用户只需要点一下,浏览器会自动打开对应页面,整个过程十秒内完成。

3.4 部署与开机自启

本地开发完后,把代码传到云主机,创建虚拟环境并安装依赖。用systemd托管是最省心的方式,写一个 service 文件:

[Unit] Description=Edu Verifier Bot After=network.target [Service] User=youruser WorkingDirectory=/home/youruser/edu_verifier ExecStart=/home/youruser/edu_verifier/venv/bin/python main.py Restart=always RestartSec=15 [Install] WantedBy=multi-user.target

保存后执行systemctl enable --now edu_verifier,机器人在云主机上就会常驻运行。如果出现未知错误,systemd每 15 秒会自动重启一次,基本不会漏掉验证邮件。我自己的经验是,上线后先跑一周,观察推送延迟,再决定要不要把轮询间隔从 60 秒改成 30 秒。

4. 常见问题与排查技巧

4.1 收不到验证邮件怎么办

这是最高频的问题。先别急着怀疑机器人,按顺序排查:用网页版邮箱登录,搜一下发件人域名,看看邮件是不是进了垃圾箱;如果垃圾箱里也没有,多半是学校邮件系统的外部域名白名单设置太严,你需要把spotify.com、google.com等域名加入白名单或“发件人安全列表”。

如果邮件确实存在,但机器人一直没拉到,大概率是 IMAP 搜索UNSEEN时,邮件已经被别的客户端标记为已读。我的解决方法是把搜索条件改成SINCE最近一天,再通过 Message-ID 去重,不依赖未读状态。

4.2 验证码提取成乱码或空白

很多验证邮件是 Base64 编码的 HTML,直接用email.get_payload()可能拿到原始编码串。你需要在邮件解析时判断is_multipart(),并用get_content_type()拿到text/html后做解码,再传给BeautifulSoup。另外,有些平台故意把验证码放在一张图片里,这种情况 OCR 成本高,我遇到后就直接推送整封邮件原文到 Telegram,手动看两眼也很快。

4.3 机器人掉线、Token失效、消息丢失

Telegram Bot token 理论上不会自动失效,但如果你重复执行/newbot,旧 token 就废了。我的经验是:把 token 写进.env后就不要在 Telegram 对话里手动/newbot测试,那样容易产出新 token,导致原来的机器人失联。

消息丢失多半是轮询间隔内邮箱连接超时导致的。我用imaplib时设置了timeout=15,每次连接失败就自动重试 3 次;如果连续失败 5 次,则通过备用渠道(比如 email 本身)发提醒。这样即使脚本临时异常,你也能知道需要手动看一眼邮箱。

4.4 教育验证不通过怎么办

验证被拒,大多数情况不是技术问题,而是你的提交信息不匹配。常见原因有:学校邮箱后缀不在平台支持的名单里;你在校状态处于“已毕业但邮箱未注销”的灰色地带;或者平台查到了你的 IP/账号有同一设备大量申请记录。此时自动化的作用已经到边界了,剩下的要看人:补交学生证照片、联系平台客服说明情况,而不是换个邮箱硬试。坦率说,我见过有人半自动化批量申请多个平台的优惠,结果账号被风控锁定,得不偿失。

5. 合规操作与后续扩展

5.1 明确边界,别把工具用歪

这里必须多说一句。教育权益的前提是“你确实是一名在校学生”,TG 机器人只是帮你把接收和提取验证码的流程提效,不是帮你伪造学生身份。平台在验证时往往会核实注册邮箱、证件、甚至学校数据库,如果你没有真实学籍,即便自动化再流畅,最终也拿不到权益,还有可能被记录恶意申请。所以我的教程默认读者都是合规用户:把自己已有的学生身份高效利用起来,而不是占平台的便宜。

5.2 从“接收通知”到“自动回填”的进阶

如果你希望进一步减少手动操作,可以考虑在验证页面由程序自动填充验证码。比较可行的是在浏览器端配合油猴脚本,仅在验证页面出现时读取剪贴板里的验证码并自动提交。注意这需要你已经在本地或浏览器里运行了一个桥接服务,把 Telegram 收到的验证码写入剪贴板。这个方案我用过,体验很好,但要注意平台是否允许自动化填充,万一被风控判定异常,你的账号可能进入人工审核流程。我的建议是:初期手动点击,稳定后再逐步自动化,猥琐发育别浪。

5.3 还能接入哪些订阅权益

本质套路学会后,你能自动盯的远不止这三家。Adobe Creative Cloud 学生版、Apple Music 学生认证、Notion 教育版、JetBrains 学生授权,它们的验证邮件同样符合“发件人+验证码/链接”的特征。只需要在配置里添加新的关键词,机器人就能立刻接管。甚至你可以把“即将过期的权益”也做成邮件提醒,让机器人每月检查一封来自订阅平台的系统通知,提前告诉你去续期。

我个人实际用下来,这套 TG 机器人最重要的不是省那几秒钟,而是把被动刷邮箱的习惯改成了主动推送。你不再需要担心验证邮件错过了 3 小时失效,手机通知一亮,顺手点一下,教育权益就到手了。踩过几次坑之后,我悟出一个道理:自动化工具的价值,不在于把复杂的事情变简单,而在于把简单的事情变可靠。希望这篇教程能让你把时间花在更有意思的事情上,而不是天天盯着收件箱刷新。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询