转载

Python 自建 Telegram Bot

今天配置好了 strongswan ,手机也可以科学上网了。为了进一步充分利用服务器,建了一个 Telegram 机器人,实现 LaTeX 公式转图片的小功能。服务器用 Nginx + Flask,由于要求 HTTPS 连接,使用 Let’s Encrypt 申请免费 SSL 证书。

1. Python3 虚拟环境

保持良好习惯,使用独立 Python 虚拟环境:

python3 -m venv venv3   source venv3/bin/activate   pip install flask   pip install uwsgi  # Ubuntu 14.04 系统有问题,导致 apt-get install python3-venv 找不到 # 如下方法解决 python3 -m venv --without-pip venv3   source venv3/bin/activate   curl https://bootstrap.pypa.io/get-pip.py | python   deactivate   source venv3/bin/activate   

2. 创建 Telegram Bot

找到机器人老爹 @BotFather 请求创建新 Bot,输入指令 /newbot ,选好 nameusername 之后,老爹会返回一串 Token:

Use this token to access the HTTP API:   187512456:A*****************-***************s   

到这里就算申请完毕了,不需要备案审核,也不需要300块。关于 Bot 的说明和 API 文档可以从官方获取( About , API )。这里采用设定 WebHook 的方式,被动响应用户指令。

Telegram 要求设定的 WebHook 地址为 HTTPS,因此需要申请 SSL 证书。

3. Let's Encrypt

git clone https://github.com/letsencrypt/letsencrypt   cd letsencrypt   sudo chmod g+x letsencrypt-auto  # Nginx  ./letsencrypt-auto certonly --email=YOUREMAIL@YOURDOMAIN.COM -d YOURDOMAIN.COM -d SUB.YOURDOMAIN.COM 

要求服务器 IP 与域名指向的 IP 一致,刚开始一直返回下面的错误:

IMPORTANT NOTES:    - The following errors were reported by the server:     Domain: *.*.*    Type:   connection    Detail: Failed to connect to host for DVSNI challenge 

后来发现是 443 端口没有打开……

4. Flask & telegram

已经有 Python 封装好的 telegram API: python-telegram-bot ,直接下载:

pip install python-telegram-bot   

设置 WebHook 地址:

import telegram   bot = telegram.Bot(token = "TOKEN")   bot.setWebhook("https://webhook.url")   

我的 @MathModeBot 代码在 https://github.com/rainyear/MathModeBot 。

5. 配置 Nginx + uwsgi + Flask

根据官网配置即可:

server {     listen 443;   server_name example.com;    ssl on;   ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;   ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;    location / { try_files $uri @yourapplication; }   location @yourapplication {     include uwsgi_params;     uwsgi_pass unix:/tmp/uwsgi.sock;   } } 

启动 uwsgi:

uwsgi -s /tmp/uwsgi.sock -w main:app --logformat="%(method) %(uri) %(uagent)"   

参考

  1. Setup LetsEncrypt On Linux
  2. Simple-Echo-Telegram-Bot
  3. venv doesn't create activate script python3
Python

- END -

原文  http://blog.rainy.im/2016/02/28/telegram-bot-with-python/
正文到此结束
Loading...