基于go-cqhttp实现QQ机器人

前言

本篇文章原文:http://www.7yue.top/rabbitbot/

本篇文章记录一下自己在编写QQ机器人的时候所遇到的一些问题和核心功能的实现。

QQ机器人RabbitBot采用python编写,由于是个人学习使用,故目前不会开源完整代码,只会放出核心代码供学习参考。

使用的go-cqhttp项目:https://github.com/Mrs4s/go-cqhttp
go-cqhttp是基于 Mirai 以及 MiraiGo 的 cqhttp golang 原生实现。
RabbitBot在读取、发送QQ信息时采用的是HTTP API和反向HTTP POST接口。

github项目地址:https://github.com/Yang9999999/Go-CQHTTP-YesBot

初期配置

go-cqhttp的安装和完整配置可自行查看文档,这里描述一下关键部分。

配置文件:

{uin: 0password: 0encrypt_password: falsepassword_encrypted: ""enable_db: falseaccess_token: ""relogin: {enabled: truerelogin_delay: 3max_relogin_times: 0}_rate_limit: {enabled: falsefrequency: 1bucket_size: 1}ignore_invalid_cqcode: falseforce_fragmented: truefix_url: falseproxy_rewrite: ""heartbeat_interval: -1http_config: {enabled: truehost: 0.0.0.0port: 5700timeout: 0post_urls: {"127.0.0.1:5710":secret}}ws_config: {enabled: falsehost: 0.0.0.0port: 6700}ws_reverse_servers: [{enabled: falsereverse_url: ws://you_websocket_universal.serverreverse_api_url: ws://you_websocket_api.serverreverse_event_url: ws://you_websocket_event.serverreverse_reconnect_interval: 3000}]post_message_format: stringuse_sso_address: falsedebug: falselog_level: ""web_ui: null
}

其中uin为机器人QQ号
password为密码
enable_db为是否使用数据库,由于个人学习使用,这里并不开启数据库功能
heartbeat_interval为心跳间隔时间,默认开启,值小于0则关闭。
http_config进行http接口设置,post_urls设置上传接收端口
ws_configws_reverse_servers是Websocket的正向和反向接口,由于RabbitBot采用http接口,故这里也全部设置了false

RabbitBot开启后的显示结果:
在这里插入图片描述

信息发送和接收

RabbitBot利用python的socket库来进行数据的发送和接收,socket库的使用方法请自行学习。

5700为go-cqhttp默认端口,设置http post上报器端口为5710。

常用的HTTP API:
发送私聊信息:/send_private_msg
发送群聊信息:/send_group_msg

服务端接收信息配置:

ListenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ListenSocket.bind(('127.0.0.1', 5710))
ListenSocket.listen(100)HttpResponseHeader = '''HTTP/1.1 200 OK
Content-Type: text/html
'''#定位有效信息
def request_to_json(msg):for i in range(len(msg)):if msg[i]=="{" and msg[-1]=="}":return json.loads(msg[i:])return None#需要循环执行,返回值为json格式
def rev_msg():# json or Noneconn, Address = ListenSocket.accept()Request = conn.recv(1024).decode(encoding='utf-8')#print(Request)rev_json=request_to_json(Request)#print(rev_json)conn.sendall((HttpResponseHeader).encode(encoding='utf-8'))conn.close()return rev_json

接收到的群聊信息格式:

{‘anonymous’: None, ‘font’: 0, ‘group_id’: ×××××, ‘message’: ‘爱你’, ‘message_id’: 1425567994, ‘message_seq’: 2170, ‘message_type’: ‘group’, ‘post_type’: ‘message’, ‘raw_message’: ‘爱你’, ‘self_id’: ×××××, ‘sender’: {‘age’: 0, ‘area’: ‘’, ‘card’: ‘’, ‘level’: ‘’, ‘nickname’: ‘七月’, ‘role’: ‘owner’, ‘sex’: ‘unknown’, ‘title’: ‘’, ‘user_id’: ×××××}, ‘sub_type’: ‘normal’, ‘time’: 1611721421, ‘user_id’: ×××××}

group_id为群号,user_id为发送者QQ号,message为接收到的信息,message_id为信息编号,随机生成,message_type为信息类型。

接收到的私聊信息格式:

{‘font’: 0, ‘message’: ‘[CQ:face,id=107]’, ‘message_id’: -730420846, ‘message_type’: ‘private’, ‘post_type’: ‘message’, ‘raw_message’: ‘[CQ:face,id=107]’, ‘self_id’: ×××××, ‘sender’: {‘age’: 0, ‘nickname’: ‘七月’, ‘sex’: ‘unknown’, ‘user_id’: ×××××}, ‘sub_type’: ‘friend’, ‘time’: 1611726456, ‘user_id’: ×××××}

user_id为通话者QQ号,message为接收到的信息,**‘[CQ:face,id=107]’**为表情数据,message_id为信息编号,随机生成,message_type为信息类型。

客户端发送信息配置:

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#从客户端发送给服务端
def client_to_conn():label = get_message_type()number = get_number()msg = get_raw_message()if flag == 0:msg = txt_msg(get_raw_message())if label == 'group':payload = "GET /send_group_msg?group_id=" + str(number) + "&message=" + msg + " HTTP/1.1\r\nHost: 127.0.0.1:5700\r\nConnection: close\r\n\r\n"elif label == 'private':payload = "GET /send_private_msg?user_id=" + str(number) + "&message=××××" + " HTTP/1.1\r\nHost: 127.0.0.1:5700\r\nConnection: close\r\n\r\n"client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('127.0.0.1',5700))client.send(payload.encode("utf-8"))client.close()

信息处理

RabbitBot的学习信息保存至一个txt文档中,个人学习问题不大,但做成项目的话不建议这么使用。

获取信息和处理信息的一些函数:

#获取信息类型 群聊/私聊 group/private
def get_message_type():return all_message['message_type']#获取群号/私聊qq号
def get_number():if get_message_type() == 'group':return all_message['group_id']elif get_message_type() == 'private':return all_message['user_id']else:print('出错啦!找不到群号/QQ号')exit()
# 获取信息发送者的QQ号
def get_user_id():return all_message['user_id']#获取发送的信息
def get_raw_message():return all_message['raw_message']#查找txt文本数据库
def txt_msg(msg):fp = open("/机器人/txt.txt", "r",encoding='utf-8')while 1:s = fp.readline()if not s:fp.close()if flag == 2:returnreturn error()s = s.strip('\n')s1 = s.split(' ')[0]s2 = s.split(' ')[1]if '[CQ:at,qq=×××××] ' + s1 == msg:fp.close()return s2

发送信息的一些函数:

#帮助界面
def help_interface():number = get_number()payload = "GET /send_group_msg?group_id=" + str(number) + "&message=学习方式:%0a私聊rabbit酱,发送学习信息。%0a学习格式:%27学习%27%20%2b%20发送信息%20%2b%20回复信息,以空格分开%0a例:学习%20我爱你%20我也爱你" + " HTTP/1.1\r\nHost: 127.0.0.1:5700\r\nConnection: close\r\n\r\n"client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('127.0.0.1',5700))client.send(payload.encode("utf-8"))client.close()#错误
def error():client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('127.0.0.1',5700))rand = random.randint(1,4)number = get_number()if rand == 1:msg = "我听不懂你在说什么哦"elif rand == 2:msg = "我好笨,听不懂呜呜呜"elif rand == 3:msg = "啊?发生了什么"elif rand == 4:msg = "干啥呢干啥呢"payload = "GET /send_group_msg?group_id=" + str(number) + "&message=" + msg + " HTTP/1.1\r\nHost: 127.0.0.1:5700\r\nConnection: close\r\n\r\n"client.send(payload.encode("utf-8"))client.close()#发送猫猫图
,图片保存在本地
def send_cat_pic():global flagflag = 1cat_list = os.listdir("/data/catpic")all_message['raw_message'] = "[CQ:image,file=file:///data/catpic/"+ random.choice(cat_list)+"]"client_to_conn()#发送setu,图片从API内获取
def send_setu_pic():apikey = '×××××××××××××××'req_url="https://api.lolicon.app/setu/"params = {"apikey":apikey}res=requests.get(req_url,params=params)setu_url=res.json()['data'][0]['url']all_message['raw_message'] ="[CQ:image,file="+setu_url+"]"client_to_conn()

私聊机器人学习数据:

#调教机器人
#这块代码也有点bug,需要后期调整。
def training_message():s = get_raw_message()if s.split(' ')[0] != '学习':returns2 = s.split(' ')[1]s3 = s.split(' ')[2]s = s2 + ' ' + s3fp = open("/机器人/txt.txt", "a",encoding='utf-8')fp.write('\n')fp.write(s)fp.close()client_to_conn()

获取数据的第一时间判断信息内容:

#首次判断信息内容
def first_judgement():if get_message_type() == 'private':training_message()if get_raw_message() == '[CQ:at,qq=×××××××××] help':help_interface()returnif get_raw_message() == '[CQ:at,qq=×××××××××] setu':send_setu()returnelif get_raw_message() == '[CQ:at,qq=×××××××××] 猫猫图':send_cat_pic()returnelif len(get_raw_message()) < 20:  #即使不@,也有15%概率回复信息rand = random.randint(1,20)if rand <= 3:global flagflag = 2all_message['raw_message'] = '[CQ:at,qq=×××××××××] ' + all_message['raw_message']client_to_conn()else:returnelif get_raw_message()[0:20] != '[CQ:at,qq=×××××××××]':returnclient_to_conn()

循环部分:

#flag为全局变量
#flag = 0 正常
#flag = 1 数据不通过数据库
#flag = 2 退出
#使用try、except语句保证程序不会因部分错误退出。
while 1:global flagflag = 0all_message = rev_msg()#print(all_message)try:first_judgement()except:continue

示例

在这里插入图片描述
在这里插入图片描述
支持收发文本、图片、表情等等。
在这里插入图片描述
利用api获取setu。

最终项目可搭载在服务器上不间断运行,目前只实现了基本功能,还有许多功能有待开发,欢迎大佬们来找我一起交流学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/55623.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯官方可编程QQ机器人来了?QQHook

今天突然看见关于QQHook的最新消息&#xff0c;现在还是内测阶段 先打开链接&#xff08;需要用手机QQ打开&#xff09;&#xff1a;https://web.qun.qq.com/qunrobot/data.html?robot_uin2854196399&_wwv128&_wv3 打开后就会显示Hook&#xff1a; 点击“添加到群聊…

【腾讯广告】监测链接和API自归因回传接口逻辑

开头吐槽一下腾讯的文档是真的垃圾。以下是我自己的理解和经历 大概流程 新建广告–》配置网页链接—》配置监测链接&#xff08;用来监测网页链接&#xff0c;腾讯到时候会通过这个链接回传给我们一个url&#xff0c;URL的参数就是你配置的参数&#xff1a;如click_id等&…

围观GPT应答全国甲卷高考题

原文&#xff1a;围观GPT如何应答全国甲卷作文题看看AI写出的作文怎么样&#xff1f;https://mp.weixin.qq.com/s/_tk3AxeiQAT6ntQZSe9B1g 2023年全国甲卷作文题目&#xff1a; 阅读下面的材料&#xff0c;根据要求写作-60分 人们因技术发展得以更好的掌控时间&#xff0c;但…

PlumGPT【告别梯子,拥抱AI】

相信很多人苦于没有openai账号或者有着种种原因至今还没有使用过chatgpt&#xff0c;今天向大家推荐一个网站&#xff0c;在国内也可以任意方便使用&#xff0c;让你的办公效率最大化。 那就是PlumGPT&#xff1a;https://plumgpt.com/ PlumGPT&#xff08;国内版的chatgpt&a…

TED演讲集 TED视频打包下载(MP4+中英字幕) TED中英文对照字幕视频 TED资料文档 完整

TED演讲集 TED视频打包下载&#xff08;MP4中英字幕&#xff09; TED中英文对照字幕视频 TED资料文档 学习英语的好帮手 TED1984-2019全部中英对照演讲稿集视频 下载CSDN 一、TED简介&#xff1a; TED&#xff08;指Technology, Entertainment, Design在英语中的缩写&#…

都说程序员加班很严重,来听听国外的程序员怎么说

据说&#xff0c;某互联网公司招了个日本人做研发&#xff0c;上班第一天就对部门同事说&#xff1a;“我在日本工作时是个加班狂&#xff0c;每天都很晚回家&#xff0c;希望大家跟上我的步伐。”一个月之后他辞职回日本了&#xff0c;扔下一句话&#xff1a;“你们这样加班&a…

不想上班啊不想上班

不想上班啊不想上班!!!! 刚星期一就盼着星期五..

如果你不想工作了,先做这3件事

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 英国作家毛姆有句名言&#xff1a;“我从来不会厌倦生活&#xff0c;只是厌倦了那些毫无生气的生活方式。”把这句话稍微修改一下&#xff0c;放在职场也无比适用“我并不厌倦工作,只是厌倦了那些毫无…

聊聊自由职业:我为什么不想再回公司上班

离开大公司以后&#xff0c;我一直就没什么“正经”工作。创过业&#xff0c;做过CEO&#xff0c;还有各种或长或短的兼职顾问&#xff0c;按照现在政策的说法&#xff0c;我这也算“灵活就业”了&#xff0c;或者说&#xff0c;是“自由职业”&#xff0c;算算已经7年多了。 一…

如果你不想上班了,建议你做这4件事

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 每次假期结束&#xff0c;很多人自己对一成不变的工作提不起兴趣&#xff0c;迟迟不能进入状态。还有很多读者给K哥留言&#xff0c;实名羡慕K哥一边做着上市公司的高管&#xff0c;一边经营着自己的媒…

基于Anki+Vocabulary的英语单词记忆法

在这里给大家分享一下一个背英语单词的方法&#xff08;目前感觉是最适合自己的方法&#xff09; 介绍自己的方法之前&#xff0c;先给大家介绍两款软件&#xff1a; 一、Anki&#xff1a; 介绍&#xff1a; anki是一个辅助记忆软件&#xff0c;它可以在相对合适的时间来告诉你…

可能是全网最好用的桌面背单词软件

前言 之前复习考研英语时&#xff0c;想找一个桌面背单词软件。看到市面上只有一款DesktopVoc&#xff0c;功能实现的不咋地&#xff0c;界面臃肿不美观&#xff0c;关键是还要收费&#xff0c;索性就自己用Python写了一个悬浮窗背单词小程序&#xff0c;实现了调整播放速度、窗…

用python实现背单词的小脚本系统

python 前提准备 安装好python及其环境安装好Oracle数据库python中安装好cx_Oracle包&#xff0c;且能与数据库正常联立交互 注&#xff1a; 前提准备部分的内容不做描述&#xff0c;百度均有教程 步骤&#xff1a; 第一步&#xff1a;在oracle中创建以下表&#xff1a; …

360 Total Security(360国际版)官方中文版V10.8.0.1269 | 360国际版和国内版区别很大-杀毒能力相当且非常纯净不流氓

360 Total Security&#xff08;360国际版&#xff09;是由奇虎360公司开发的纯净无明显商业推广行为且杀毒能力一流的360杀毒软件&#xff0c;360国际版是为广大用户的电脑安全及效能量身打造的专业免费杀毒软件&#xff0c;根据360国际版官网说明得知&#xff0c;360国际版内…

PHP 限制输出内容的字数

2019独角兽企业重金招聘Python工程师标准>>> 一、contentWordNumLimit($content, $maxWordNum) 1 作用描述&#xff1a;内容格式化(英文单双引号替换为中文&#xff0c;回车换行替换为html中的br标签&#xff0c;\n替换为空格)&#xff0c; 限制输出内容的字数&…

孩子写作业比较磨蹭,家长如何处理?

在生活中我们发现&#xff0c;很多孩子都特别磨蹭&#xff0c;比如吃饭磨蹭&#xff0c;收拾东西磨蹭&#xff0c;写作业磨蹭&#xff0c;明明很快就能完成的事情&#xff0c;到他们手下却会一拖再拖。有时候家长会很着急&#xff0c;催促厉害了&#xff0c;他们还会闹情绪&…

减轻教师作业批改负担的神奇—每日交作业之手机扫描批改

给教师们介绍一款免费又实用的客观题自动批改的产品 简介&#xff1a;手机扫描即可实现客观题的自动批改 特点&#xff1a; 1.无需特定纸张&#xff0c;大大减少纸张成本&#xff1b;无纸张大小限制 2.无需特定设备&#xff0c;使用微信小程序或者app扫描即可 3.即时生成详细的…

父母该如何辅导孩子做作业

孩 子们会对家庭作业存在抵触情绪&#xff0c;而对父母来说&#xff0c;如何让孩子完成作业&#xff0c;可能也是一个同样艰巨的任务。那么&#xff0c;让孩子完成作业的最好策略是什么&#xff1f;大人辅导孩子做作业和大人自己做作业之间的界限何在&#xff1f;小孩子做作业拖…

(转)来自一位作业辅导老师的经验分享

https://baijiahao.baidu.com/s?id1585466248617857440&wfrspider&forpc 最近看新闻&#xff0c;很多家长都会为孩子写作业的事头痛&#xff0c;作为一个曾经连续四年专职给孩子辅导作业&#xff0c;并让全班90%同学在其校期中、期末成绩提高的作业辅导老师忍不住分享…

分享一个撩妹神器,各种聊天话术技巧

现在的男孩子太不会聊天了&#xff0c;为了你们我也是操碎了心了&#xff0c;特意找了一款神器分享大家 分享薇 ggvv1992 祝大家早日脱单