简介:一套可直接部署的Telegram多功能机器人PHP源码,集成后台管理面板,面向有一定PHP基础、希望快速搭建TG机器人的开发者与社群运营者。功能覆盖全面,包含TRX兑换、闪兑、USDT监控、余额查询、关键字监控、群管理、推广分享等几乎常见TG机器人功能,省去从零开发与逐项集成的重复工作。压缩包共36个文件,以28个PHP功能模块为主体,辅以.env环境配置、HTML后台管理界面、PNG展示图和说明文档,整体约28.63MB,解压后可直接上手,适合用于个人代币行情助手、社群管理与交易监控等服务场景。附带配置说明文本可帮助快速完成环境设置与模块启用,目前已吸引2468人学习查阅,适合需要研究成熟功能实现或在此源码上二次开发的用户。
1. Telegram机器人带后台到底多省事:这份Java源码包能省下三周工作量
聊到Telegram机器人源码,很多人的第一反应是“不就是BotFather拿个token,写个echo嘛”。真跑过的人都知道,能回复消息只是入场券。消息要落库、用户要分级、关键操作要留日志、隔三差五还要发定时通知,没有后台管理面板,连用户总量都不知道是多少。我拆了一个标题为“全功能tgbot Telegram机器人多功能有后台版源码.rar”的Java源码包,它解决的就是这个问题:机器人本体之外,附带一个完整的Web后台,管理员可以在网页上看用户、看日志、挂多个Bot实例,不用每次改配置都去动代码。对想快速搭一个可运营的Telegram机器人的开发者来说,这类“机器人+后台”一体化的Java源码,比单纯拿几个接口demo凑数要靠谱得多。下面从结构、部署、参数到踩坑,完整讲一遍。
2. 源码结构拆解:bot-core与admin-web如何分工,多Token怎么挂载
拿到rar包之后,先不要急着启动。把压缩包解开,第一步是把工程结构看清楚。这决定了后面部署时改哪里、启动哪个类、后台面板和Bot进程是什么关系。
2.1 一个工程两个模块:Bot逻辑与后台管理的边界
这类“有后台版”的Telegram机器人源码,几乎都是Spring Boot工程,常见做法是拆成两个子模块:一个负责与Telegram服务器通信,处理更新回调;另一个负责Web后台,给管理员提供页面和接口。两个模块跑在同一个进程里,共享同一个数据库。
我不确定你手里的rar包具体怎么分,但从“全功能”和“有后台版”这两个描述看,合理的目录结构大概是:
all-function-tgbot/ ├── bot-core/ # 机器人主逻辑模块 │ ├── src/main/java/com/tgbot/ │ │ ├── BotApplication.java # Spring Boot启动入口 │ │ ├── bot/ │ │ │ ├── TGBotHandler.java # Telegram更新处理器 │ │ │ └── BotSessionManager.java # Bot实例注册与生命周期管理 │ │ ├── service/ │ │ │ ├── MessageRouter.java # 消息路由:命令、文本、回调 │ │ │ ├── TaskScheduler.java # 定时任务调度 │ │ │ └── UserService.java # 用户状态管理 │ │ └── mapper/ # MyBatis或JPA数据访问层 │ └── src/main/resources/ │ └── application.yml # 核心配置 ├── admin-web/ # 后台管理面板模块 │ ├── src/main/java/com/tgbot/admin/ │ │ ├── AdminApplication.java │ │ ├── controller/ │ │ │ ├── LoginController.java # 后台登录 │ │ │ ├── UserController.java # 用户管理 │ │ │ ├── BotController.java # Bot实例管理 │ │ │ └── LogController.java # 日志查看 │ │ └── config/ │ │ └── SecurityConfig.java # 后台鉴权拦截 │ └── src/main/resources/ │ ├── application-admin.yml # 后台服务端口配置 │ └── templates/ # Thymeleaf模板页面 ├── sql/ │ └── init.sql # 初始化建表脚本 └── README.mdbot-core是核心,它负责跟Telegram的Bot API保持连接、接收消息、分发处理。admin-web是一个典型的后台管理系统,处理管理员登录、数据展示、Bot实例的新增和停用。两个模块最终打成一个jar包,同时启动两个Spring上下文的问题不用纠结,很多源码是把admin-web作为依赖引入bot-core,共用同一个Spring Boot应用。
2.2 数据表设计:用户、Bot实例、消息日志、任务调度
后台能不能“运营”,看表结构就一目了然。我一般拿到源码先看sql目录,表设计直接决定机器人能否支撑真实使用场景。这套源码里至少有这样几张表:
| 表名 | 用途 | 关键字段 |
|---|---|---|
| tg_user | 已交互用户 | chat_id、username、status、subscribed_at |
| tg_bot_instance | 多Bot实例注册 | bot_username、bot_token、is_active |
| tg_message_log | 收发消息记录 | chat_id、direction、text、created_at |
| tg_schedule_task | 定时任务 | task_name、cron_expr、action、last_run_at |
| admin_user | 后台管理员 | username、password_hash、role |
CREATE TABLE tg_user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, chat_id BIGINT UNIQUE NOT NULL COMMENT 'Telegram分配的chat_id', username VARCHAR(128), status VARCHAR(32) DEFAULT 'active', subscribed_at DATETIME DEFAULT CURRENT_TIMESTAMP, last_activity DATETIME ); CREATE TABLE tg_bot_instance ( id BIGINT AUTO_INCREMENT PRIMARY KEY, bot_username VARCHAR(128) NOT NULL, bot_token VARCHAR(256) NOT NULL, is_active TINYINT DEFAULT 1, started_at DATETIME ); CREATE TABLE tg_message_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY, chat_id BIGINT NOT NULL, direction VARCHAR(8) NOT NULL COMMENT 'inbound/outbound', content TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE tg_schedule_task ( id BIGINT AUTO_INCREMENT PRIMARY KEY, task_name VARCHAR(128), cron_expr VARCHAR(64), action VARCHAR(256), last_run_at DATETIME, is_enabled TINYINT DEFAULT 1 );chat_id是整张用户表的主心骨,它对应每个与机器人有过交互的Telegram用户。tg_bot_instance表是“有后台版”和“单bot版”的核心区别——后台可以往这张表里插入新的token,动态拉起新的Bot实例,不需要改代码。tg_message_log记录每次收发内容,任务表配合Spring的@Scheduled注解实现定时推送。这几张表构成闭环:用户由Bot产生,日志由Bot写入,任务由后台管理。
2.3 多Bot实例:一个后台挂多个Token
Telegram官方允许一个程序同时维护多个Bot实例,只要每个Bot都有独立的token。TelegramBots库提供了TelegramBotsApi注册机制,常见做法是启动时读配置,运行中读数据库:
@Component public class BotSessionManager { private final TelegramBotsApi telegramBotsApi; public BotSessionManager() throws TelegramApiException { this.telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class); } public void registerBot(String botToken, String botUsername) throws TelegramApiException { TGBotHandler bot = new TGBotHandler(botToken, botUsername); telegramBotsApi.registerBot(bot); // 注册成功后更新 tg_bot_instance 表状态 } public void unregisterAll() { // 调用 bot.unregister() 释放长轮询连接,常见做法是记录active状态再重启进程 } }注意registerBot是注册到TelegramBotsApi内部的长轮询线程里,每个Bot对应一个线程,持续调用getUpdates。这台机器上能挂多少个Bot,取决于内存和网络连接数,一次开二十个问题不大。MultiBotInstance这个设计值得一直保留:后期增加一个客服号或通知号,直接在后台填token就能上线,不用重新部署。
3. 部署全过程:配置、打包、启动到后台面板首次登录
结构看懂了,接下来是真正动手。这里最烦的事情是配置文件写错导致启动失败。这类全功能源码的配置项比单bot demo多了几个维度:数据库、Bot token、后台账号、webhook开关。逐个理清楚再启动,一次过。
3.1 配置文件逐项说明
Spring Boot的配置集中在application.yml,我建议把数据库、Telegram Bot参数、后台登录信息三块分开看。典型配置如下:
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/tgbot_db?useUnicode=true&characterEncoding=utf8 username: root password: your_mysql_password driver-class-name: com.mysql.cj.jdbc.Driver telegram: bot: # BotFather获取的token,形如 123456789:AAxxxxxxxxxxxxxxxxxxxx token: 123456789:AAxxxxxxxxxxxxxxxxxxxx username: your_bot_name # 默认为false,使用长轮询;如果接入webhook则改为true use-webhook: false webhook-url: https://yourdomain.com/webhook # 多Bot实例,启动时自动注册到tg_bot_instance表 extra-bots: enabled: false admin: username: admin # 初始密码,首次登录后必须修改 password: admin123 # 后台session有效期,单位分钟 session-timeout: 30token和username是从@BotFather申请机器人时拿到的两个最核心的值。use-webhook建议新手保持false,让程序用长轮询方式主动拉取更新——省去公网IP和HTTPS证书配置这一步。webhook-url只有在你的服务器有域名和SSL证书时才用得上。extra-bots.enabled字段如果不开启,程序就只启动主Bot,等后台手动加实例时再逐条注册。
admin.password是后台登录的初始密码,我先不管,登录后第一件事就是改。session-timeout控制后台登录态过期时间,设太短容易被踢下线,设太长有安全风险,搬到生产环境一般改成30。
3.2 Maven打包与启动
依赖装齐的前提下,整个项目打包通常是这样:
cd all-function-tgbot mvn clean package -Dmaven.test.skip=true参数说明:-Dmaven.test.skip=true跳过单元测试,避免测试用例连不上数据库导致打包中断。打包完成后,jar包出现在bot-core/target或根目录target下,文件名类似all-function-tgbot-1.0.jar。
启动前先确认MySQL建好库并导入sql脚本:
mysql -u root -p -e "CREATE DATABASE tgbot_db CHARACTER SET utf8mb4;" mysql -u root -p tgbot_db < sql/init.sql之后启动整个服务:
nohup java -jar all-function-tgbot-1.0.jar \ --spring.config.additional-location=file:/opt/tgbot/application.yml \ > /opt/tgbot/logs/console.log 2>&1 &这里我习惯把配置文件放到jar包外部,而不是打包进去。这样换服务器或改token时不用重新打包,直接编辑/opt/tgbot/application.yml然后重启进程就行。日志输出到logs目录,排查问题全靠它。启动后用jps或ps -ef看一眼java进程,确认进程在。
3.3 后台面板首次登录与功能核对
应用起来后,浏览器访问http://服务器IP:8080/login,用admin账号登录。登录成功后,后台面板应该能看到这些功能区块:
- 用户管理:查看所有交互过的用户、封禁/解封
- Bot实例:当前注册的Bot列表,支持新增token、停用实例
- 消息日志:双向消息流水,带时间和chat_id
- 定时任务:创建cron任务,指定推送消息内容
先不要急着点开所有功能,第一步是看“Bot实例”页里是否显示了你配置的主Bot,如果显示“运行中”说明长轮询线程已经建立。然后打开Telegram对你的机器人发一条/start,同一时间切到后台“消息日志”页,看日志有没有记下这条消息。如果日志有,后台和Bot的链路就通了。
4. 避坑手册:Telegram Bot API 五个翻车现场与排查顺序
这个章节我直接写踩过的坑。每一个都是真实发生过,现象、原因、解决方式对号入座。源码本身没毛病,大多数翻车都是配置与长期运行环境的问题。
4.1 getUpdates与webhook同时开启:409 Conflict反复报错
现象:控制台一直刷“Conflict: terminated by other getUpdates request”或者“can't use webhook: getUpdates method is not allowed”。
原因:同一个Bot token不能同时使用长轮询(getUpdates)和webhook两种接收方式。很多源码的配置里use-webhook默认false,但如果你改过或者Fastify/nginx层面挂了一个webhook,Telegram服务器会认为两种方式同时在抢更新。
解决:登录Telegram官方API接口,删掉残留的webhook:
curl -s "https://api.telegram.org/bot<你的token>/deleteWebhook"然后确认application.yml里use-webhook是false,重启jar包。DeleteWebhook之后,长轮询的getUpdates请求才能恢复。
4.2 发送消息报“can't parse entities”
现象:机器人发送包含HTML标签的消息时,Telegram返回400错误,“can't parse entities in text message”。
原因:消息文本里有&符号、<、>这类字符,Telegram解析HTML实体时遇到了非法结构。很多源码用ParseMode.HTML发送富文本消息,但字符串里直接从数据库拼了一个包含“AT&T”或“3 < 5”的文案。
解决:发消息前对文本做一次HTML转义。常见做法是写一个小工具:
public static String escapeHtml(String text) { return text .replace("&", "&") .replace("<", "<") .replace(">", ">"); }发送时用escapeHtml(content)代替原始content。这个问题在机器人推送“今日价格”“通知运维”这类带符号的内容时几乎必现,排查顺序是先看日志里的原文,再看发送方法里有没有转义。
4.3 定时任务不触发:cron表达式与服务区时错位
现象:后台配置了一个“每天早上9点”的任务,结果每天8点就发了,或者干脆不执行。
原因:Telegram机器人部署的服务器常用UTC时区,而cron表达式默认按Java虚拟机时区解析。Spring Boot的@Scheduled默认读服务器时区,配置错位时,每天9点的任务会在UTC的9点触发,对应北京时间17点。
解决:在配置里显式指定时区:
spring: jackson: time-zone: Asia/Shanghai task: scheduling: # 定时任务始终以这个时区执行 timezone: Asia/Shanghai如果是源代码里的@Scheduled注解,还可以用zone属性:
@Scheduled(cron = "0 0 9 * * ?", zone = "Asia/Shanghai") public void morningPush() { // 推送逻辑 }这样写的好处是,后台界面只管填cron,服务器搬到哪里都不会乱。
4.4 机器人明明在线却不响应:网络出口质量导致长轮询静默失效
现象:Bot在Telegram上显示在线,发消息后没有任何反应,控制台日志也停更了,进程还活着。
原因:Telegram服务器和你的服务器之间的长轮询连接断开后,代码里没有重新连接机制。TelegramBot库虽然内部有retry逻辑,但如果服务器网络出口质量差——丢包、高延迟timeout——连接可能长时间挂在半死状态。
解决:这是最需要警惕的坑。部署位置离Telegram服务端太远、网络链路不稳定的服务器,长轮询会反复断开。应对手段通常是两条:第一,进程监控,失败重启;第二,每次启动前先调用一次getMe确认网络链路对方可达,再进入长轮询循环。我在生产环境里加了一个健康检查接口,每10分钟调用一次getMe,只要连续3次失败就自动重启服务,这才把“僵尸在线”问题压下去。
4.5 后台改了token,运行中的Bot实例状态没变
现象:在后台面板里停用一个Bot实例,数据库is_active=0了,但Telegram上机器人依然能收到消息。
原因:后台操作只改了数据库状态,没有真正调用unregister或中断长轮询线程。Telegram Bot的长轮询是常驻连接,改数据库不会让它主动断开。
解决:代码里停用Bot实例时必须显式调用释放操作:
try { bot.unregister(); bot.clearWebhook(); } catch (TelegramApiException e) { log.error("停用Bot实例失败", e); }unregister()通知Telegram服务器不再推送更新,并中止本地的更新拉取循环。如果不做这一步,数据库状态和实际运行状态就不一致,后台显示“已停用”,实际Bot还是活的。这个逻辑特别容易在写后台管理接口时漏掉。
5. 上线前的自检与二次开发:从curl到底层异常日志
Bot跑起来只是开始,能给“全功能”收尾的,是一套自检流程。先验证Telegram API本身通不通,再看程序内部日志,最后把源码改成自己的工程名。
5.1 用curl直接探测API连通性
不管后台界面多花哨,最可靠的是直接调API接口:
curl -s "https://api.telegram.org/bot<你的token>/getMe"能看到返回json里有bot的username和id,说明程序到Telegram服务端的链路畅通。如果这一步超时,后面所有内容都不用看了。之后再用curl发一条测试消息:
curl -s -X POST "https://api.telegram.org/bot<你的token>/sendMessage" \ -d chat_id=<你的chat_id> \ -d text="自检测试消息"注意两点:chat_id是接收消息的人的ID,不是Bot的ID;用curl测试时如果“can't parse entities”报错,说明你传了HTML标签但没带parse_mode参数。
5.2 二次开发:改成自己的包名
源码包带有明显通用性,拿过来落地最重要的一步是改包名和工程名。常见的操作是把com.tgbot改成你自己的公司域名反写,比如com.yourcompany.tgbot。
find . -type f -name "*.java" -exec sed -i 's/com\.tgbot/com\.yourcompany\.tgbot/g' {} \; mv bot-core/src/main/java/com/tgbot bot-core/src/main/java/com/yourcompany/tgbot mv admin-web/src/main/java/com/tgbot admin-web/src/main/java/com/yourcompany/tgbot改完包名后重新mvn clean package一次,确认编译通过。这一步不做的话,两个模块同名类很容易在包扫描上出摩擦。artifact改成新名称后,也方便你区分线上版本和调试版本。这个源码包比较适合“要快速跑通有后台的Telegram机器人、打算在这个基础长线运营”的开发者,直接拿来当骨架是最快的路径。
从那以后我每次部署这类带后台的Telegram机器人源码,都强制走一遍“先看表结构→再盯启动日志→curl探测getMe→后台发一条消息验证日志落库”的流程。差不多十分钟能确认整套链路可用,之后再改业务逻辑也心安。这套自检习惯帮我节省了大量定位时间,希望也能帮你少走弯路。
本文还有配套的精品资源,点击获取