【教学】QQ机器人 OPQBOT

有关资料

GitHub仓库

wiki

使用Python制作IOTQQ插件

准备

  1. 联网Linux机器,云服务器,联网的树莓派均可
  2. 基础的Linux知识

Start

下载

访问wiki,点进下载地址

然后选择自己对应的版本下载,右键复制链接,然后使用命令 wget 链接 即可下载

如果访问超时,那就是GitHub访问的问题,需要开代理,不在本文讨论范围内

下下来之后,解压文件夹,解压命令自己去网上搜。

启动

先要去注册一个Gitter,然后拿到自己的token,填到CoreConf.conf文件的token栏里面

port端口自己随便选一个没有被占用的就行

然后在文件目录运行 ./OPQBot

登录

wiki已经写得很清楚了

使用

然后你私聊给你的bot发信息,你的控制台就会有对应消息事件的输出。这是因为在Plugins目录下面有三个默认的插件已经内置了,有基本的事件输出到控制台的功能。想要自己写自己的bot功能,就需要自己写插件。但是OPQBot这个项目是用lua写插件,lua这个语言大多数人都没学过怎么办呢?

不要慌,IOTQQ支持WebSocket,所以我们可以通过任意支持WebSocket的编程语言来开发插件,例如Python。

建一个py文件,放在哪都行。

首先要把Python有关包装了:

pip install python-socketio

pip install websocket-client

模板代码如下:

#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)
    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()

然后直接运行就行。

如何放到后台

Python插件运行的前提条件是OPQBot也在运行,但是你可能并不会后台运行,Ctrl + C直接就停止了。

要把命令放在后台很简单,只需要用到一个命令叫做 screen

例如,我原来是要运行 python server.py,现在我只需要运行 screen python server.py

然后我就会进入screen窗口,要想中断程序用Ctrl + C,要想在不中断程序的情况下退出使用 Ctrl + A + D(三个键同时按住)

想再次进入后台程序运行窗口看看,首先 screen -ls 查看所有后台程序, 然后找到对应的程序id,使用 screen -r id即可进入后台程序。

如果后台程序开多了,不知道哪个是哪个怎么办?screen可以自己命名,自行搜索Screen用法吧!

1 个赞

OPQBot 文档站

注意下载的版本问题,例如


使用uname -a可以查看系统架构,不确定的话去网上搜搜应该选哪个版本

另一个QQ机器人框架的教程新鲜出炉:

异步QQ机器人框架 oicq2-webapid 使用保姆级教程