使用Python制作IOTQQ插件
本文最后更新于 2020年08月10日 已经是 1141天前了 ,文章可能具有时效性,若有错误或已失效,请在下方留言

使用Python制作IOTQQ插件

IOTQQ


IOTQQ支持WebSocket 所以我们可以通过任意支持WebSocket的编程语言来开发插件,后面我们用Python来演示开发插件的过程

开发插件

环境配置

  1. Python环境搭建 (略)
  2. 安装Socket.io
    pip install python-socketio
    pip install websocket-client

    务必安装websocket-client,否则无法使用!

开始编写插件

  1. 连接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()

    查看你是否连接成功

  2. 编写相关事件:
    #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()
  3. 使用类库来信息处理
    #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

广告 广告位招租

评论

  1. aaa
    Windows Chrome
    江苏省
    2年前
    2021-4-02 11:55:11

    请问一下,我的socketio会出现ImportError: DLL load failed: 找不到指定的模块的问题,该怎么解决呢

    • Avatar photo
      enjoy
      博主
      aaa
      Android Chrome
      河北省保定市
      2年前
      2021-4-02 16:42:10

      可能模块没有安装好,请先卸载模块再安装试试

  2. 阿巴阿巴
    Android Chrome
    河北省
    3年前
    2020-11-15 8:38:29

    谢谢大佬

  3. 渣渣辉啊
    Windows Chrome
    河南省
    3年前
    2020-10-11 14:19:30

    取得当前已经登录的QQ链接怎么获取

    • Avatar photo
      enjoy
      博主
      渣渣辉啊
      Windows Chrome
      河北省保定市
      3年前
      2020-11-10 15:17:06

      你指的是 获取QQ号吗? 你得自己先在OPQ里登录后 才能使用!

  4. cai
    Windows Chrome
    河南省
    3年前
    2020-10-11 14:18:31

    取得当前已经登录的QQ链接怎么获取

  5. allenraotao
    Windows Chrome
    江西省抚州市
    3年前
    2020-8-10 11:12:27

    为什么我监听事件没反应了

    • Avatar photo
      enjoy
      博主
      allenraotao
      Windows Chrome
      贵州省黔东南州
      3年前
      2020-8-10 11:23:27

      博客的内容更新不及时,有些事件的名字有误,请看GitHub仓库!

  6. 阿辉
    Windows Chrome
    日本
    3年前
    2020-8-07 17:10:57

    写个什么机器人好呢,纠结ing…

  7. panghu
    Macintosh Edge
    安徽省合肥市
    3年前
    2020-8-07 12:26:15

    运行成功后显示啥呢

    • Avatar photo
      enjoy
      博主
      panghu
      Windows Chrome
      贵州省黔东南州
      3年前
      2020-8-07 16:07:19

      你插件连接成功后发送信息会产生log

  8. 沙盒梦想
    Windows Chrome
    四川省成都市
    3年前
    2020-8-05 19:02:47

    为啥每次尝试发送的时候都发不出去。在linux后台显示

    
    2020/08/05 19:00:23.123 [E]  QQLuaHttpVmRun /iotbot/iotbot_3.0.6_linux_amd64/WebPlugins/Api_LuaCaller.lua:18: attempt to index a non-table object(nil) with key 'toUser'
    stack traceback:
        /iotbot/iotbot_3.0.6_linux_amd64/WebPlugins/Api_LuaCaller.lua:18: in function 'fSwitch'
        /iotbot/iotbot_3.0.6_linux_amd64/WebPlugins/Api_LuaCaller.lua:180: in main chunk
        [G]: ?
    
    • Avatar photo
      enjoy
      博主
      沙盒梦想
      Android Chrome
      贵州省黔东南州
      3年前
      2020-8-05 19:32:11

      你调用发送的是哪个函数,可以的话把相关代码发一下

      • 沙盒梦想
        enjoy
        Windows Chrome
        四川省成都市
        3年前
        2020-8-06 17:23:11

        调用的send的函数,就是

        send(a.FromQQG,"功能",2,a.FromQQ)

        这个,调用的时候会弹提示

        • Avatar photo
          enjoy
          博主
          沙盒梦想
          Android Chrome
          贵州省黔东南州
          3年前
          2020-8-06 18:02:30

          你看看 a.FromQQG 是不是空值

  9. 小费
    Windows Chrome
    香港
    3年前
    2020-7-12 12:23:10

    开始入坑python

    • Avatar photo
      enjoy
      博主
      小费
      Windows Chrome
      贵州省黔东南州岑巩县
      3年前
      2020-7-15 12:13:59

      666666

  10. 柯北
    Linux Firefox
    江苏省南京市
    3年前
    2020-7-01 22:25:44

    Name sio is not defind 难搞哦

    • Avatar photo
      enjoy
      博主
      柯北
      Windows Chrome
      贵州省黔东南州
      3年前
      2020-7-04 20:26:43

      注意是否安装依赖:

      pip install python-socketio
      pip install websocket-client

      还有是否引用!

      • RamuneSoda
        enjoy
        Windows Chrome
        广东省东莞市
        已编辑
        3年前
        2020-7-14 19:17:43

        这里是前几个代码框里的bug啦,前几个代码框都需要先

        sio = socketio.Client()
        • Avatar photo
          enjoy
          博主
          RamuneSoda
          Windows Chrome
          贵州省黔东南州岑巩县
          3年前
          2020-7-15 12:13:35

          博客的内容没有更新及时,请前往Github查看。有bug请提issue

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
小黄脸
上一篇
下一篇