刚学了两天Python,就心血来潮申请个tg机器人玩玩。

首先找@BotFather申请,拿api。
设置头像,ID之类的,很简单,具体过程不详说了。
这里是 我的BOT
后端控制这里就用Python
直接pip3 install python-telegram-bot装上包

文档

关于机器人的配置这里有一些官方的参考示例 Examples 里面写的很具体清楚。
注意了:Telegram在国内是无法连接的,要把代码放到境外服务器上运行。
机器人正常运行以后,就能处理用户请求了。可以接上 图灵 的API让它和用户聊天,免费用户每天100条。

1
2
3
4
5
6
7
8
9
import requests
inmsg = update.message.text
resp = requests.post("API", data={
"key": "KEY",
"info": inmsg,
"userid": update.effective_user.id
})
resp = resp.json()
context.bot.send_message(chat_id=update.effective_chat.id, text=resp['text'])

我的目标是建立个模型让机器人根据聊天记录进行学习,不过我现在的水平还达不到做人工智能,下面就简单的过一遍。
导入用到的包

1
2
3
4
5
6
7
8
import logging
import telegram
from telegram.error import NetworkError, Unauthorized
from time import sleep
from uuid import uuid4
from telegram import InlineQueryResultArticle, ParseMode, \
InputTextMessageContent
from telegram.ext import Updater, InlineQueryHandler, CommandHandler, MessageHandler, Filters

主函数

1
2
3
4
5
6
def main():
updater = Updater("这里填你申请的机器人Token", use_context=True)
dp = updater.dispatcher

updater.start_polling() #让机器人保持运行
updater.idle()

可以自己写一些好玩的。

1
2
3
4
5
def echo(update, context):  
if '你好' in update.message.text: #收到你好后回复
update.message.reply_text('你好啊。')
else:
update.message.reply_text('你可以对我说“你好”')

记得在主函数内加上

1
dp.add_handler(MessageHandler(Filters.text, echo)) #非命令的消息,机器人回复消息。

关于内联查询,要先在@BotFather那里把inline模式打开,然后就可以在群里直接 @机器人 发消息了。

1
2
3
4
5
6
7
8
9
def inlinequery(update, context):
query = update.inline_query.query
results = [
InlineQueryResultArticle(
id=uuid4(),
title="发送",
input_message_content=InputTextMessageContent(
query.upper())),]
update.inline_query.answer(results)

当然也要在主函数内加上

1
dp.add_handler(InlineQueryHandler(inlinequery)

让机器人处理/start命令,首先在@BotFather里设置添加命令。

1
2
def start(update, context):
update.message.reply_text('机器人已经成功运行啦!') #收到指令/start 回复

主函数内添加

1
dp.add_handler(CommandHandler("start", start))

最后调用主函数。

1
2
if __name__ == '__main__':
main()

Linux系统通过SSH登录让机器人程序保持在后台运行
nohup python3 -u xxx.py > log.out 2>&1 &

这样一个简单的tg机器人就完成了,还有更多功能可以实现,以下是我自己写的一个用户签到功能(刚学python两天写的代码求不吐槽)。
代码存在 Github 上 。 获取用户tg ID,每次向机器人请求签到时先从txt读取存储的数据到列表中,listA[userid,point]中的point值+1,然后将用户数据写入到txt文件中存储。
使用时调用函数 如果没签到过返回值是listA,已经签到之后返回值是一串字符串。详细见代码 内(第一次运行前要在.py文件目录里建 jfreset.txt)

1
2
3
4
5
6
7
8
9
def sign(update, context):
"""通过/sign 命令签到"""
user_id=str(update.effective_user.id)
print('签到请求:'+user_id)
sign_list=jf(user_id)
if len(sign_list[1])<4:
update.message.reply_text('恭喜用户 '+update.effective_user.full_name+' 签到成功啦!积分增加1,你现在的积分是:【'+sign_list[1]+'】。')
else:
update.message.reply_text('很抱歉哦,今天你已经签到过啦,明天再来吧~')

记得运行函数timer()开启重置每日签到次数(每天0点重置签到次数。) (服务器是单核CPU,这里好像要用到多线程?不用thread只能执行1个函数。我也不知道这个是什么原理,有人可以告诉我吗?)

1
2
3
4
5
from threading import Thread
#function code
if __name__ == '__main__':
Thread(target = main).start()
Thread(target = timer).start()

出现了一个错误,但两个函数还是都可以运行的ValueError: signal only works in main thread

评论

2020 年 5 月 15 日星期五 22:45:26 猫猫 nya.4@outlook.com 虽然看不懂但是感觉很厉害!!!!!!!!!