Telegram bot聊天机器人python实现

发布于 2020-07-25  315 次阅读


总述

telegram bot是telegram的一个机器人特殊账户,可以实现自动聊天,以及一些操作对应回复的功能,经过代码编写可以实现很多事情,官方的api已经有了很多语言的版本了,我是跟NUS的同学一起写的一个作业,协商后决定使用python+mysql来进行机器人开发(使用的是pyTelegramBotAPI)

开发时候遇到的一些问题及解决办法

1.代理问题(socks5)

因为国内政策的原因,你在本地调试代码时是会出现connect不上问题的,这时候你就要设置代理,其实就是你把程序用socks5端口代理,由于我这个是python语言写的,在GitHub给出了代理的方法

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'}

但是!我配置了好久发现还是不行,我甚至把issues翻遍了,还是不行,所以我继续读官方文档,我发现了另一个可以写代理的地方
updater = Updater(...request_kwargs={'proxy_url':'socks5://proxy_address:port'})
虽然我不知道为什么会有两个地方,而且官方给出的代理方法不行,但是我摸索出来的这个方法的确代理成功并且connected了,所以记录下来当作一个方法

2.定时任务

设想的是在每天固定时间给所有用户发送一条消息,我们引入了schedule这个python库


def groupsend():
    group=sm.alluserId()
    for id in group:
        bot.send_message(chat_id=id[0], text=sm.getToDoList(id[0]),parse_mode = ParseMode.MARKDOWN)

def sendlistdaily():
     return groupsend()

schedule.every().day.at("xx:xx").do(sendlistdaily)

可能会有疑惑的部分就是为啥我的sendlistdaily函数仅仅是return另一个函数,而不是直接调用,因为问题就是在telegram里这个do里面的函数应该是return一个python执行语句,所以才这么写,这个也是一个很大的坑,最开始直接在函数里写执行语句发现疯狂报错,所以这里记录一下

3.获取用户回答的话

我们设计了一个阶段用来帮用户储存需要记录的东西,但是我们会对用户输入错误的时提示并且重新录入,而这里的坑就是每个阶段只能获取一次用户输入,意思就是不要在函数里写根据用户输入来while循环,你的数据是不会变的,你需要重新return那个阶段


def addLevel(update,context):
    level = update.message.text
    print(level)
    if level != '1' and level != '2' and level != '3':
        update.message.reply_text('请输入正确格式')
        return LEVEL
    else:
        context.user_data['level'].append(level)
        update.message.reply_text('What is the exam module you would like to add?', reply_markup=markup2,
                                  parse_mode=ParseMode.MARKDOWN)
        return EXAM

剩下的应该没什么了,基础一个开发,等27号教授审核完毕后我会上传到GitHub,欢迎star


浪子三唱,不唱悲歌