登录
  • 人们都希望被别人需要 却往往事与愿违
  • 如果调试 (debug) 是去除 bug 的过程, 那么编程就是制造 bug 的过程 @Edsger Dijkstra (图灵奖得主)

[Telegram bot 系列]0:用 Python 写一个 Telegram Bot 简单的回话 bot

编程 Benny 小土豆 24818 次浏览 5627 字 31 个评论
文章目录 [显示]
这篇文章在 2020 年 12 月 25 日 13:47:40 更新了哦~
(我知道我还有一个 SSH 系列的坑没填完,别催,越催越不填,再催熄火

终于,又轮到了小土豆我开新系列的日子啦,这也可能是我的为数不多的讲编程的文章。这一系列中我们将详细说说怎么用 Python 写一个能玩的 Telegram bot,顺便学习一下 Python 中的一些知识点。

前言

假定读者们都知道 Telegram 是什么,会翻墙并且掌握一定的 Python 基础。在本系列中我使用 Python 2.7 和 PyCharm,如果要是用 Python 3 的话最好用 Python 3.6

本系列可能会有部分内容翻译自 Telegram 官方网站,可是官网对于 API 的说明非常简明易懂,而且有的地方还很幽默。如果英语水平连这都看不懂、理解苦难的话,那说句实在话(不是打击大家),还是尽早转行吧

所以有的时候我也很纠结,我写这一系列干嘛啊,吃饱了没事干么?

目录

未完待定

什么是 bot(机器人)

机器人是一种特殊的不额外需要手机号码的账号。用户可以通过给机器人发消息来进行交互。哎呀反正你们都知道啦。

机器人和普通用户有何不同呢?

机器人没有在线状态、没有上次在线时间;

机器人的存储空间是有限的;

机器人不能主动和用户开启会话,换句话说,要用户先跟它说(或者是添加到群里),他才能回消息;

机器人的用户名结尾永远是 bot;

把机器人加到群里的时候,默认情况下(开启隐私模式),机器人是不会收到所有的消息的;

机器人不吃不喝,不睡觉也不抱怨(除非编码太垃圾分分钟抛异常?)。

如何创建一个机器人

很简单,跟 BotFather 说话,他会指引你创建一个机器人。真的是太简单了,大家去官网自己看吧。

在此系列中,我创建一个名为 @benny_demo_bot 的机器人,TOKEN 为 XXX 我当然不会告诉你啦。

并且,我使用Edit commands添加了如下命令(start、help、settings 是全局命令):

start - 自我介绍

help - 帮助

talk - 聊天

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

搭建开发环境

众所周知的是,Python 可以使用 pip 来安装一些非常好用的第三方库。这里我们使用了 pyTelegramBotAPI 来和 Telegram API 进行交互。实际上你想用 curl 也没人拦着你。

为啥不用另一个 star 更多的库?我嫌弃那个库麻烦不好用。

准备 virtual environment 与 pyTelegramBotAPI

Virtual environment 就是一个虚拟出来的纯净的、不包含第三方库的 Python 环境(想包含本地已安装的,也不是不行)。

为什么要使用 virtual environment 呢?唔是这样的,pip 默认会把库安装到系统里对应的 site-packages 里,这样无论你在哪打开 Python,都是可以用这个库的。这样听起来好像挺好,但实际上还是有一些弊端的。比如说,在一些项目中,我们最后需要整理出来一个这个项目使用了哪些第三方库,然后指引用户去安装这些库。一个两个还好,多了的话,恐怕开发者也容易找不全、漏掉一些库吧。再加上一些库的依赖、版本等问题,所以如果有必要,那么一定要使用 virtual Environment 的。

所以我们先创建 virtual environment 吧。有好几种方式,这里我们就说两种:命令行方式和 IDE 方式

命令行方式

首先我们需要安装 virtual environment,用pip就可以了,网上教程很多,这里我就简述一下。

  1. pip install virtualenv

如果你使用某些 Linux 发行版,可能会提示pip: command not found,如果是 Debian 系的话,那么运行:

  1. sudo apt install python-pip

之后我们创建一个目录,使之成为工程目录:

  1. mkdir bot_demo
  2. cd bot_demo
  3. #创建virtualenv
  4. virtualenv ENV
  5. #激活virtualenv(Windows)
  6. ENV\Scripts\activate
  7. #激活virtualenv(Linux)
  8. source ENV/bin/activate

此时命令行前面会变成 (ENV),代表着已经进入了。这个时候再运行 pip 就会安装到虚拟环境中

  1. pip install pyTelegramBotAPI

IDE 方式

使用 IDE 相比来说很方便。我们只需要新建一个项目,File - Settings - Project interpreter, 右侧的齿轮里即可选择 create VirtualEnv

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

我建议将 VirtualEnv 选择到工程目录下,这样方便我们判断哪个 VirtualEnv 对应哪个项目。当然,如果你打算把代码 push 到 GitHub,记得把这个目录加到.gitignore里。

之后我们点击加号,安装pyTelegramBotAPI这个 package,PyCharm 就会自动为我们安装好这个包了。

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

开始你的项目

我该怎么处理我的 TOKEN

为了方便项目的扩展,咱一般都会把配置信息放在一个 Python 文件中。但是,咱知道,像 TOKEN 这类东西都是比较敏感的,如果要打算把代码 push 到 GitHub,那么很容易就会泄露这类敏感信息。也千万别以为删除这些信息了就万事大吉了。要知道时光机可是 Git 的能力之一。万一不幸发生了这种事情,推荐大家用 BFG 抹掉历史纪录,详细教程可以参考我

那从头开始预防这件事,咱该怎么做呢?一个非常愚蠢但是有效的办法是,新建一个名为config.py的文件,此文件用于保存你的配置信息,并将其加到.gitignore中,另外复制一个名为config-example.py,此文件内容与config.py一致,只是不包含 TOKEN 敏感信息。

为什么咱不直接把不包含敏感信息的config.py先 push 上去,然后加入自己的 TOKEN,之后再加入到.gitignore中呢?其实这样要倍加小心,哦是这样的,gitignore 管不到已经在历史记录中的文件的。

另外,如果你使用私有仓库(并且打算以后公开),那就更简单了。可以什么都不管直接 push 上去,再打算公开之前抹掉 TOKEN 再 push,然后用 BFG 抹掉历史记录再 force push 就可以了。

另一个更好的办法是,创建一个config.py但是不在这里写入真实的配置信息,转而设置环境变量然后用os.environ加判断获取到对应的 KEY,如果使用 PyCharm 的话,在 Run/Debug configuration 里就可以添加环境变量,当然直接在命令行里设置也可以(windows 要用set xxx='123', Linux 直接export xxx='123'设置可以考虑写入.bashrc里)

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

项目结构

这里由于只是一个演示,并不打算 push 到 GitHub,所以就不处理 TOKEN 啦。

很显然,我们需要一个config.py用于保存配置文件,还需要一个 "主程序",这里我就很无耻的叫它main.py啦。

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

一些解释:

第一行的#!/usr/bin/python用于指定当给文件加 x 权限并执行时 (./main.py) 该使用哪个解释器,用法和 shell 编程中的是一样的;

第二行用于指定编码格式,下面则是注释说明与 doc 啦。大家不好奇这些是怎么来的吗?实际上是 IDE 自动生成的啦。我才懒得自己打这些玩意。

在设置中的如下位置即可设定模板,更多信息可以参考 JetBrains 官网。

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

config.py

显然我们要在这里放入 TOKEN,所以我们直接写一行TOKEN='XXX'即可。我一般习惯把这类变量全大写,给人 “常量” 的感觉嘛(实际上 Python 中是没有常量这个概念的)。如下所示

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

看这时间戳,我写一篇文章容易嘛我!几个小时了……

main.py

首先我们需要 import 库和我们的配置文件并创建 telebot 类的实例

  1. import telebot
  2. from config import TOKEN
  3. bot = telebot.TeleBot(TOKEN)

定义接受 / start 和命令的消息处理函数,如果多个命令都用这一个函数处理,就这样['start','help']

  1. @bot.message_handler(commands=['start'])
  2. def send_welcome(message):
  3. bot.send_message(message.chat.id, '大家好,我是机器人')

定义接受所有消息的处理函数

  1. @bot.message_handler()
  2. def echo(message):
  3. bot.reply_to(message, message.text)

另一种 reply_to

  1. @bot.message_handler(commands=['help'])
  2. def send_welcome(message):
  3. bot.send_message(reply_to_message_id=message.message_id, chat_id=message.chat.id, text='有什么可以帮您')

定义程序的入口:

  1. if __name__ == '__main__':
  2. bot.polling()

我来解释一下:

装饰器

在每个函数前面,我们可以看到有一个@bot.message_handler,这其实是一个 Python 装饰器。装饰器其实是一个起初听起来觉得什么用都没有、但是用起来却很方便的高阶 Python 功能。简单说,装饰器可以在运行时改变或增加函数的功能。此话怎讲?

比如说,我们需要在函数开始运行、结束运行的时候输出消息到控制台,大家可能会想着在函数开始和结尾加两个print。没错这样是可以的,但是假如我们有 10 个函数呢?这代码都没能重用,删除的时候还要删除 20 次。由于函数在 Python 中是一等公民,我们可以定义一个嵌套函数(也就是装饰器),配合 Python 的语法糖 @来实现这一功能。

在我们说的打印日志这个例子中,装饰器就可以这么写这么用:

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

当然在这个例子中,这个装饰器无法处理带参数的函数。要处理函数的参数,我们需要在内层的wrapper的参数中使用*args**kwargs来处理参数(和关键字参数),关于装饰器更多的内容,可以参考奔跑的蜗牛壳《Python 装饰器》

message

Telegram API 会返回给我们一组 JSON,但是控制台用print打印出来的 JSON 都是一行,看起来很不舒服,解决方法是使用pprint或者新建一个扩展名为 json 的文件,将一行 json 放入,Ctrl + Alt + L 格式化。

在 message 这个参数中,有几个是比较重要的,我说几个个人比较常用的:

message.chat.id 类型为 int,聊天 ID,如果是和机器人私聊,那么这个 ID 也就是用户的 user_id;如果是群组的话,那么就是群组的 id

message.text 类型为 unicode,用户发给机器人的聊天内容

message.message_id 类型为 int,用户发给机器人的消息编号,再使用 "回复" 功能时会用到这个编号。

send_message 与 reply_to_message

send_message用于给用户发送消息,必须要有至少两个参数,一个是chat_id,一个是 text;

reply_to则是回复某条消息,是send_message(message.chat.id, text, reply_to_message_id=message.message_id, **kwargs)的方便用法,需要两个参数,一个是 message,一个是回复的内容;

如果我们要用send_message来实现relpy_to_message,那么就要手动用关键字参数指定回复哪条消息,如代码中的 help 命令所示。

if __name__ == '__main__':

这一行则定义了这个 Python 程序的入口,在他下面运行bot.polling()方法。这个方法可神奇了呢,他会帮你处理各种事件,自动帮你从 API 里取回消息,基本不用你干预。

如果我们不用__name__控制的话,那么当在其他文件中 import 时,也就顺便运行这个文件啦。这很明显不是我们想要的结果。

运行与调试

如果一切顺利的话,当你点击运行时,跟机器人说话,它就会回复你啦。当然啦,运行(run)与调试(debug)其实还是有些区别的,关于这的一些技巧,我们可以以后再谈~

[Telegram bot系列]0:用Python写一个Telegram Bot 简单的回话bot

哦对了,我们还需要导出依赖,方便别人也能够用啊!

很简单,进入到 virtual env,运行如下命令:

  1. pip freeze > requirements.txt

别人用的时候,pip install -r requirements.txt就可以安装对应的依赖啦。

我该怎么长期运行我的机器人呢

这个问题问得好!首先你得有个在海外的服务器(或者让程序走代理),可以考虑用用nohup或者screen,这样当你关掉终端之后,程序还会继续运行。呃,那些用 Windows 做服务器的,当我什么都没说好了。

当然了正经的办法,是要用 systemd 或者 supervisor 的。具体可以参考这里

我想要任务计划机器人,怎么办

这个问题问得也很好。我们可能需要某种机器人,每十分钟给用户发送一条消息。

此时我的建议是,如果需求很简单,那么使用操作系统自带的任务计划功能来执行脚本(Linux 为 cron)。

可能有人会有反对意见了。Python 里有很多优秀的任务调度、任务计划库,比如说 apscheduler。这样也是可以的,只不过需要多写点代码!

当然了,有些时候我们的需求比较灵活,操作系统提供的任务计划用起来会很麻烦,此时就只能用一些任务调度的库啦。

下一篇打算讲点什么呢

如果我们的机器人只能以固定的模式讲话,那么显然是不行的!

那么下一篇,我们就要尝试着接入其他服务(使用 pycurl 发送 POST 或者 GET 请求),操作数据库,给机器人加入 "正在输入" 的特效,更加深入的理解 Telegram Bot API。当然了,我下一篇说不定等到啥时候,所以,别太期待。


文章版权归原作者所有丨本站默认采用 CC-BY-NC-SA 4.0 协议进行授权 |
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/tgbot0.html
喜欢 (44)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(31) 个小伙伴在吐槽
  1. 1. tg bot 的文档确实挺烂的 2. 对使用 virtual environment 的优势解释欠缺 如果只是为了方便获取当前项目的依赖 完全可以在所有代码完成后使用 pipreqs 来生成 requirements.txt
    xiflask6662023-08-10 12:49 回复
  2. 您好,请问如何评论呢,我评论的问题好像显示不出来。。。顺便问一下怎么注册这个的账号
    CUI2019-09-06 02:15 回复
    • 啊,估计是你贴了太多代码,被 akismet 判断为垃圾评论了。没有开放注册哦
      Benny 小土豆 2019-09-11 09:39 回复
  3. 您好博主,我想请问一下,我加上了 apihelper.proxy = {'https':'socks5://127.0.0.1:1080'} 仍然出现了,requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot/getUpdates?offset=1&timeout=20 (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x7f14836cdb70>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)'))【只截取了报错最后一段】的报错,请问是什么原因呢?
    CUI2019-09-06 02:12 回复
    • 梯子不太稳定?是按照这里来的吗 https://github.com/eternnoir/pyTelegramBotAPI#proxy
      Benny 小土豆 2019-09-11 09:41 回复
  4. 您好,请问在运行 bot.polling() 的时候报错 Traceback (most recent call last): File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 141, in _new_conn (self.host, self.port), self.timeout, **extra_kw) File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 83, in create_connection raise err File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 73, in create_connection sock.connect(sa) socket.timeout: timed out During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 601, in urlopen chunked=chunked) File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 346, in _make_request self._validate_conn(conn) File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 852, in _validate_conn conn.connect() File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 284, in connect conn = self._new_conn() File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 146, in _new_conn (self.host, self.timeout)) urllib3.exceptions.ConnectTimeoutError: (<urllib3.connection.VerifiedHTTPSConnection object at 0x7fe331c564a8>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)') During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/requests/adapters.py", line 440, in send timeout=timeout File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 639, in urlopen _stacktrace=sys.exc_info()[2]) File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 398, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot926724899:AAFy40aQe2AWa_0bN32nhnCWfX9ppiANblw/getUpdates?offset=1&timeout=20 (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x7fe331c564a8>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/telebot/util.py", line 59, in run task(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/telebot/__init__.py", line 276, in __retrieve_updates updates = self.get_updates(offset=(self.last_update_id + 1), timeout=timeout) File "/usr/local/lib/python3.6/dist-packages/telebot/__init__.py", line 246, in get_updates json_updates = apihelper.get_updates(self.token, offset, limit, timeout, allowed_updates) File "/usr/local/lib/python3.6/dist-packages/telebot/apihelper.py", line 180, in get_updates return _make_request(token, method_url, params=payload) File "/usr/local/lib/python3.6/dist-packages/telebot/apihelper.py", line 54, in _make_request timeout=(connect_timeout, read_timeout), proxies=proxy) File "/usr/lib/python3/dist-packages/requests/sessions.py", line 520, in request resp = self.send(prep, **send_kwargs) File "/usr/lib/python3/dist-packages/requests/sessions.py", line 630, in send r = adapter.send(request, **kwargs) File "/usr/lib/python3/dist-packages/requests/adapters.py", line 496, in send raise ConnectTimeout(e, request=request) requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot926724899:AAFy40aQe2AWa_0bN32nhnCWfX9ppiANblw/getUpdates?offset=1&timeout=20 (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x7fe331c564a8>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)')) " Traceback (most recent call last): File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 141, in _new_conn (self.host, self.port), self.timeout, **extra_kw) File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 83, in create_connection raise err File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 73, in create_connection sock.connect(sa) socket.timeout: timed out During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 601, in urlopen chunked=chunked) File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 346, in _make_request self._validate_conn(conn) File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 852, in _validate_conn conn.connect() File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 284, in connect conn = self._new_conn() File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 146, in _new_conn (self.host, self.timeout)) urllib3.exceptions.ConnectTimeoutError: (<urllib3.connection.VerifiedHTTPSConnection object at 0x7fe331c564a8>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)') During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/requests/adapters.py", line 440, in send timeout=timeout File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 639, in urlopen _stacktrace=sys.exc_info()[2]) File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 398, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot926724899:AAFy40aQe2AWa_0bN32nhnCWfX9ppiANblw/getUpdates?offset=1&timeout=20 (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x7fe331c564a8>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/cui/PycharmProjects/telegram/bot_test_new.py", line 31, in <module> bot.polling() File "/usr/local/lib/python3.6/dist-packages/telebot/__init__.py", line 389, in polling self.__threaded_polling(none_stop, interval, timeout) File "/usr/local/lib/python3.6/dist-packages/telebot/__init__.py", line 412, in __threaded_polling polling_thread.raise_exceptions() File "/usr/local/lib/python3.6/dist-packages/telebot/util.py", line 78, in raise_exceptions six.reraise(self.exc_info[0], self.exc_info[1], self.exc_info[2]) File "/usr/lib/python3/dist-packages/six.py", line 693, in reraise raise value File "/usr/local/lib/python3.6/dist-packages/telebot/util.py", line 59, in run task(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/telebot/__init__.py", line 276, in __retrieve_updates updates = self.get_updates(offset=(self.last_update_id + 1), timeout=timeout) File "/usr/local/lib/python3.6/dist-packages/telebot/__init__.py", line 246, in get_updates json_updates = apihelper.get_updates(self.token, offset, limit, timeout, allowed_updates) File "/usr/local/lib/python3.6/dist-packages/telebot/apihelper.py", line 180, in get_updates return _make_request(token, method_url, params=payload) File "/usr/local/lib/python3.6/dist-packages/telebot/apihelper.py", line 54, in _make_request timeout=(connect_timeout, read_timeout), proxies=proxy) File "/usr/lib/python3/dist-packages/requests/sessions.py", line 520, in request resp = self.send(prep, **send_kwargs) File "/usr/lib/python3/dist-packages/requests/sessions.py", line 630, in send r = adapter.send(request, **kwargs) File "/usr/lib/python3/dist-packages/requests/adapters.py", line 496, in send raise ConnectTimeout(e, request=request) requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot926724899:AAFy40aQe2AWa_0bN32nhnCWfX9ppiANblw/getUpdates?offset=1&timeout=20 (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x7fe331c564a8>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)')) 是什么原因,该如何解决呢。。
    CUI2019-09-06 01:55 回复
  5. 请问 pyTelegramBotAPI 这个东西怎么让一直监视某个值,当这个值不符合条件后,自动触发,并发送给我自己。话说 chat_id,message_id 都该怎么用啊。
    miffyrcee2019-05-16 20:30 回复
    • 单独写一个程序监控变量(或者线程),调用发消息的接口就可以了
      Benny 小土豆 2019-05-19 08:54 回复
  6. #激活 virtualenv(Linux) source ENV\bin\activate \ 应该改成 /
    kkren2018-10-26 21:55 回复
    • 噗我这个手啊抖。感谢
      Benny 小土豆 2018-10-27 20:27 回复
  7. 感谢!刚制作完 bot 想看看具体放服务器上怎么处理文章非常有帮助
    kimo2018-09-23 21:24 回复
    • Mark 吧?
      Benny 小土豆 2018-09-23 21:33 回复
  8. 想问一下,尝试制作了一个 bot,但是运行就会出错,错误显示在 bot.polling() 这一行 requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /botTOKEN/getUpdates?offset=1&timeout=20 (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x107696e48>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)')) 是因为我的网络环境有问题吗 (:з」∠) 挂了全局的 VPN 在网上都没有找到答案,希望博主有空的时候能解答一下~
    Charlie_Shen2018-03-18 22:58 回复
    • emmmm,好像是我的请求次数太多了?但是这是我第一次请求啊 (:з」∠) 之前那段代码里面没有写 token,其实是用了的,但是还是返回错误。。
      Charlie_Shen2018-03-18 23:12 回复
      • 参考这里设置代理就好啦。
        Benny 小土豆 2018-03-19 12:36 回复
        • QAQ 在下看了文档,,,但是只有三行说明三行代码,,,不是很懂具体该怎么用 emmmm 其次我只有两个酸酸乳的代理,,,我是不是应该弄个 http 或者 $$ 啊? 或者,,,有没有什么轮子可以直接在任意一段代码里加上代理,,,这样我其他的所有程序都能用了 QAQ 最好是酸酸乳能用的方案 (
          MokaNeko2018-12-03 00:56
        • If you want to use socket5 proxy you need install dependency pip install requests[socks] and make sure, that you have the latest version of gunicorn, PySocks, pyTelegramBotAPI, requests and urllib3. apihelper.proxy = {'https':'socks5://userproxy:password@proxy_address:port'}
          Benny 小土豆 2018-12-03 09:01
        • 啊,,,这段话我看到了,,,但是那个参数设置不知道怎么填进去,,,就,,,比如混淆,加密方式这两个我该怎么用啊,,,以及 proxy_address 我知道是服务器地址,但是 userproxy 需要填什么我不是很清楚 QAQ 抱歉啊问了这么多问题,,,
          MokaNeko2018-12-03 13:36
          1. apihelper.proxy = {'https':'socks5://127.0.0.1:1080'}
          Benny 小土豆 2018-12-04 09:22
        • 啊,,,怪我不太了解 socks5,昨天自己弄明白了,,,但是好像这个和 urllib3 之间存在兼容的问题,1.19.1 版本的 urllib3 能正常用,但是新一些的版本的就连接不上了 (
          MokaNeko2018-12-04 14:54
        • 看 requests[socks] 要求
          Benny 小土豆 2018-12-04 14:57
    • 是因为连接不上 telegram 的 api。
      Benny 小土豆 2018-03-19 12:35 回复
      • 您好博主,我加上了 apihelper.proxy = {'https':'socks5://127.0.0.1:1080'},可还是出现了 (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x107696e48>, 'Connection to api.telegram.org timed out. (connect timeout=3.5)')) ,请问是什么原因呢
        CUI2019-09-06 02:43 回复
        • 可能是梯子比较慢?看起来设置的似乎是没问题的
          Benny 小土豆 2019-09-11 09:44
      • 您好博主,我改了之后出现了新的问题,requests.exceptions.ConnectionError: ('Connection aborted.', OSError(0, 'Error')),请问您知道这是什么问题,可以怎么解决么
        CUI2019-09-06 03:23 回复
  9. 我来给你点个赞?
    弦上韫玉 2017-10-23 06:18 回复
    • 点赞失败,请重试…
      Benny 小土豆 2017-10-23 09:19 回复
      • 逻辑错误,跳出循环
        弦上韫玉 2017-10-23 09:35 回复
        • 系统错误。
          Benny 小土豆 2017-10-23 13:49
  10. ?? 羡慕高产(
    ホロ 2017-10-20 23:34 回复
    • 我就知道是萌狼!我就知道你会这么说!那下一篇交给你了吧??
      Benny 小土豆 2017-10-20 23:38 回复