本文最后更新于 2020年08月10日 已经是 1141天前了 ,文章可能具有时效性,若有错误或已失效,请在下方留言。
使用Python制作IOTQQ插件
IOTQQ
IOTQQ支持WebSocket 所以我们可以通过任意支持WebSocket的编程语言来开发插件,后面我们用Python来演示开发插件的过程
开发插件
环境配置
- Python环境搭建 (略)
- 安装
Socket.io
pip install python-socketio pip install websocket-client
务必安装
websocket-client
,否则无法使用!
开始编写插件
- 连接WebSocket接口:
#coding=utf-8 import socketio @sio.event def connect(): print('成功连接服务器') sio.emit('GetWebConn',123456)#取得当前已经登录的QQ链接 def main(): try: sio.connect("http://127.0.0.1:8888",transports=['websocket']) sio.wait() #阻塞进程 except BaseException as e: print (e) if __name__ == '__main__': main()
查看你是否连接成功
- 编写相关事件:
#coding=utf-8 import socketio @sio.event def connect(): print('成功连接服务器') sio.emit('GetWebConn',123456)#取得当前已经登录的QQ链接 @sio.on('OnGroupMsgs') def OnGroupMsgs(message): ''' 监听群组消息''' print(message) @sio.on('OnFriendMsgs') def OnFriendMsgs(message): ''' 监听好友消息 ''' print(message) @sio.on('OnEvents') def OnEvents(message): ''' 监听相关事件''' print(message) def main(): try: sio.connect("http://127.0.0.1:8888",transports=['websocket']) sio.wait() #阻塞进程 except BaseException as e: print (e) if __name__ == '__main__': main()
- 使用类库来信息处理
#coding=utf-8 import socketio class GMess: #QQ群消息类型 def __init__(self,message1): #print(message1) self.FromQQG = message1['FromGroupId'] #来源QQ群 self.QQGName = message1['FromGroupName'] #来源QQ群昵称 self.FromQQ = message1['FromUserId'] #来源QQ self.FromQQName = message1['FromNickName'] #来源QQ名称 self.Content = message1['Content'] #消息内容 class Mess: #私聊消息类型 def __init__(self,message1): self.FromQQ = message1['ToUin'] self.ToQQ = message1['FromUin'] self.Content = message1['Content'] @sio.event def connect(): print('成功连接服务器') sio.emit('GetWebConn',123456)#取得当前已经登录的QQ链接 @sio.on('OnGroupMsgs') def OnGroupMsgs(message): ''' 监听群组消息''' print(message) @sio.on('OnFriendMsgs') def OnFriendMsgs(message): ''' 监听好友消息 ''' print(message) @sio.on('OnEvents') def OnEvents(message): ''' 监听相关事件''' print(message) def main(): try: sio.connect("http://127.0.0.1:8888",transports=['websocket']) sio.wait() #阻塞进程 except BaseException as e: print (e) if __name__ == '__main__': main()
然后你就可以开发你自己想要的功能了
下面贴上我写的开发例程:#coding=utf-8 import socketio import json import requests import pdb import re import logging import time import socket ''' Python插件SDK Ver 0.0.2 维护者:enjoy(2435932516) 有问题联系我。 ''' robotqq = "123" #机器人QQ号 webapi = "http://127.0.0.1:8888" #Webapi接口 http://127.0.0.1:8888 sio = socketio.Client() #log文件处理 logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',level=0,filename='new.log',filemode='a') class GMess: #QQ群消息类型 def __init__(self,message1): #print(message1) self.FromQQG = message1['FromGroupId'] #来源QQ群 self.QQGName = message1['FromGroupName'] #来源QQ群昵称 self.FromQQ = message1['FromUserId'] #来源QQ self.FromQQName = message1['FromNickName'] #来源QQ名称 self.Content = message1['Content'] #消息内容 def send(ToQQ,Content,sendToType,atuser=0,sendMsgType='TextMsg',groupid=0): tmp={} tmp['sendToType'] = sendToType tmp['toUser']= ToQQ tmp['sendMsgType']=sendMsgType tmp['content']=Content tmp['groupid']=0 tmp['atUser']=atuser tmp1 = json.dumps(tmp) requests.post(webapi+'/v1/LuaApiCaller?funcname=SendMsg&qq='+robotqq,data=tmp1) def zan(QQ) #QQ名片赞 tmp={} tmp['UserID']=QQ tmp1 = json.dumps(tmp) requests.post(webapi+'/v1/LuaApiCaller?funcname=QQZan&timeout=10&qq='+robotqq,data=tmp1) def sendPic(ToQQ,Content,sendToType,imageUrl): #发送图片信息 tmp={} tmp['sendToType'] = sendToType tmp['toUser']= ToQQ tmp['sendMsgType']="PicMsg" tmp['content']=Content tmp['picBase64Buf']='' tmp['fileMd5']='' tmp['picUrl']=imageUrl tmp1 = json.dumps(tmp) #print(tmp1) print(requests.post(webapi+'/v1/LuaApiCaller?funcname=SendMsg&timeout=10&qq='+robotqq,data=tmp1).text) class Mess: def __init__(self,message1): self.FromQQ = message1['ToUin'] self.ToQQ = message1['FromUin'] self.Content = message1['Content'] # standard Python # SocketIO Client #sio = socketio.AsyncClient(logger=True, engineio_logger=True) # ----------------------------------------------------- # Socketio # ----------------------------------------------------- def beat(): while(1): sio.emit('GetWebConn',robotqq) time.sleep(60) @sio.event def connect(): print('connected to server') sio.emit('GetWebConn',robotqq)#取得当前已经登录的QQ链接 beat() #心跳包,保持对服务器的连接 @sio.on('OnGroupMsgs') def OnGroupMsgs(message): ''' 监听群组消息''' tmp1 = message tmp2 = tmp1['CurrentPacket'] tmp3 = tmp2['Data'] a = GMess(tmp3) cm = a.Content.split(' ',3) #分割命令 ''' a.FrQQ 消息来源 a.QQGName 来源QQ群昵称 a.FromQQG 来源QQ群 a.FromNickName 来源QQ昵称 a.Content 消息内容 ''' if a.Content=='#菜单': #print(a.ToQQ) send(a.FromQQG,"功能",2,a.FromQQ) return te = re.search(r'\#(.*)',str(a.Content)) if te == None: return temp = eval(requests.get("https://hlqsc.cn/lexicon/?id="+str(a.FromQQ)+"&msg="+te.group(1)+"&name=tuling").text) sendtext = re.sub(r"http.*", "", temp['text'], count=0, flags=0) send(a.FromQQG,sendtext,2,a.FromQQ) ''' 图灵接口 已丢弃 如果你有图灵api可以直接使用 data_temp = {} chat_temp = {} user = {} user['apiKey'] = '587f10e38dac47bd9abbaa7cfcf3dc64' user['userId'] = str(a.FromQQ) te = re.search(r'\#(.*)',str(a.Content)) if te == None: return chat_temp['inputText'] = {'text':te.group(1)} data_temp['perception'] = chat_temp data_temp['userInfo'] = user json_temp = json.dumps(data_temp) print(json_temp) temp =eval(requests.post('http://openapi.tuling123.com/openapi/api/v2',data=json_temp).text) temp1 = temp['results'] text = '' for i in temp1: if i['resultType'] == 'text': text+= i['values']['text'] send(a.FromQQG,text,2,a.FromQQ) ''' logging.info("["+str(a.FromQQG)+']'+str(a.FromQQ)+": "+str(a.Content)) #print(message) @sio.on('OnFriendMsgs') def OnFriendMsgs(message): ''' 监听好友消息 ''' tmp1 = message tmp2 = tmp1['CurrentPacket'] tmp3 = tmp2['Data'] a = Mess(tmp3) #print(tmp3) cm = a.Content.split(' ') if a.Content=='#菜单': send(a.ToQQ,"你好",1) @sio.on('OnEvents') def OnEvents(message): ''' 监听相关事件''' print(message) # ----------------------------------------------------- def main(): try: sio.connect(webapi,transports=['websocket']) #pdb.set_trace() 这是断点 sio.wait() except BaseException as e: logging.info(e) print (e) if __name__ == '__main__': main()
https://github.com/mcoo/iotqq-plugins-demo/blob/master/Python/iotqq.py
https://raw.githubusercontent.com/mcoo/iotqq-plugins-demo/master/Python/iotqq.py
欢迎star
请问一下,我的socketio会出现ImportError: DLL load failed: 找不到指定的模块的问题,该怎么解决呢
可能模块没有安装好,请先卸载模块再安装试试
谢谢大佬
取得当前已经登录的QQ链接怎么获取
你指的是 获取QQ号吗? 你得自己先在OPQ里登录后 才能使用!
取得当前已经登录的QQ链接怎么获取
为什么我监听事件没反应了
博客的内容更新不及时,有些事件的名字有误,请看GitHub仓库!
写个什么机器人好呢,纠结ing…
运行成功后显示啥呢
你插件连接成功后发送信息会产生log
为啥每次尝试发送的时候都发不出去。在linux后台显示
你调用发送的是哪个函数,可以的话把相关代码发一下
调用的send的函数,就是
这个,调用的时候会弹提示
你看看 a.FromQQG 是不是空值
开始入坑python
666666
Name sio is not defind 难搞哦
注意是否安装依赖:
还有是否引用!
这里是前几个代码框里的bug啦,前几个代码框都需要先
博客的内容没有更新及时,请前往Github查看。有bug请提issue