Telegram推送机器人

个人有推送服务的需求,目前手机能收到推送的软件也就 微信/邮箱/Telegram
微信可以使用方糖 Server酱,但是微信和邮箱的体验并不是很好
最后就选择了Telegram,经过搜索后找到了2个推送机器人的源码

  1. https://github.com/Fndroid/tg_push_bot
  2. https://github.com/n1try/telegram-middleman-bot

第一个是国人开发的基于Node.js的服务,第二个是歪果仁的Go版
经过一段时间折腾之后我选择了国人的这个程序,并增加了几个功能

创建机器人

@BotFather 通过BotFather创建自己的机器人,这一步是为了获取token

初步准备

获取源码

1
2
git clone https://github.com/DkWyatt/tg_push_bot.git
cd tg_push_bot

创建Sqlite3数据库

1
2
3
4
apt install sqlite3 -y
sqlite3 bot.db
sqlite> CREATE TABLE users (chatId int unique, chatToken text unique);
sqlite> .quit

创建配置文件 config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
https = {}
bot = {}
ui = {}

https.domain = '0.0.0.0' // 域名
https.privateKey = 'xxx.key' // Key文件
https.certificate = 'xxx.crt' // CSR文件

bot.token = 'https://api.telegram.org/bot{token}/' // BotFather返回的Token,以/结尾

ui.startHint = '您的推送链接: \r\nhttps://tgbot.szc.me/sendMessage/%s' // 用户发送/start时返回的内容,%s表示用户唯一URL
ui.stopHint = "用户记录已经删除,旧链接已经失效\r\n如需继续发送消息,请输入/start重新获取"
ui.userNotExistHint = 'no user' // 用户不存在时的返回内容
ui.httpsTestHint = 'hello from nodejs with https'
ui.errorHint = 'error' // 错误提示

module.exports = {
https: https,
bot: bot,
ui: ui
}

修改程序运行端口

将server.js 197行443端口修改为8443

1
httpsServer.listen(8443, config.https.domain, () => {

配置服务环境

安装Node.js

1
2
3
4
5
6
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install #安装依赖
npm install -g pm2 #安装pm2模块
pm2 start server.js #运行服务
pm2 startup #设置开机启动

配置Nginx反向代理

vhost目录下新建一个配置文件,相关数据替换成自己的网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
listen 443 ssl http2;
ssl_certificate /usr/local/nginx/conf/ssl/ssl.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/ssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
server_name your.domain;
#access_log /data/wwwlogs/your.domain_nginx.log combined;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;

proxy_redirect off;
# Socket.IO Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

location / {
proxy_pass https://127.0.0.1:8443;
}
}

然后重启nginx

1
service nginx restart

设置Bot webhook地址

浏览器访问下面地址,将token和域名替换成自己的地址

1
https://api.telegram.org/bot{token}/setWebhook?url=https://{domain}/inlineQuery

再通过下面链接检查webhook是否正常

1
https://api.telegram.org/bot{token}/getWebhookInfo

完成

添加自己的机器人,输入/start就能获取自己的推送链接了

推荐使用json格式发送数据

1
curl -H "Content-Type: application/json" -d '{"text":"HelloWorld","disable_notification": true }' -X POST https://tgbot.szc.me/sendMessage/:Token

具体用法可以参考项目 Redeme
这作者一开始没说明白怎么搭建,结果发现没法用,最后还是弄第二个源码的时候发现webhook没设置

最后附上两个机器人