有关资料
准备
- 联网Linux机器,云服务器,联网的树莓派均可
- 基础的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用法吧!