Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

本篇博客中使用的框架为OPQBOT,这是它在Github上的仓库: OPQBOT/OPQ

本篇博客中与接口交互使用的语言是Python。

总而言之,OPQBOT和Python几乎就是本篇中的所有知识点。而我运行服务的平台是阿里云的学生版服务器,操作系统是Ubuntu,架构是amd64,不过OPQBOT是跨平台的,作者提供了Window, Linux, 和FreeBSD的多个版本。

那么事不宜迟,下面就先讲怎么安装这个框架。

安装框架

因为我的平台的原因,我下载了linux_amd64版本的Release:https://files.gitter.im/5f27939ed73408ce4feb3112/E7rD/OPQBot_6.0.6_linux_amd64.tar.gz
如果大家是在别的平台的话也不必担心,这个超链接将会指引你到用户的聊天室中: OPQBOT,在里面翻一翻聊天记录,就会找到作者发的各个版本的包。

在这之后,你需要到Gitter上获取一个Token:Gitter。复制这个Token并粘贴到CoreConf.conf中的”Token”中,如: Token = “123456”。
然后CoreConf.conf中”Port”项能够改变服务运行的端口。如果你要将其运行在服务器上,那么前期你应该将它运行在0.0.0.0上,等到一切都配置完毕,再运行在本地即127.0.0.1上,以防止有人恶意访问。
然后执行OPQBot:

1
./OPQBot

等到控制台输出:Everything is ok!
这样服务就跑起来了。

登陆QQ帐号

强烈建议使用小号,因为你登录的QQ号会和你的Github绑在一起(可能是作者出于某种考虑这么做的,但是即使这样也建议使用小号登录,以免造成不必要的损失。)。
那么如何登录QQ号呢?只有通过扫码的方式。使用浏览器访问http://IP:PORT/v1/Login/GetQRcode来获取二维码,然后扫码。虽然大多数人都明白,但我还是说一下,IP是运行服务的机器的IP,如果是内网的机器则把IP换成该机器的内网IP,如果是公网的机器则换成公网IP(如果机器同时在内网和公网中当我没说)。PORT则是服务运行的端口。注意,如果你的服务运行在127.0.0.1上,其他机器是无法访问的,只能让机器自己访问自己。

收发消息

其实这里看这位兄台的博客就好使用Python制作IOTQQ插件
然后这里是手册:Home
然后有一点需要注意的是登录QQ的时候如果使用的小号的话会有几天不能在群聊里发送消息,我的小号的限制期为3天,其他人也许会不一样吧。

那么接下来是我写的代码,只有一个功能: 监听群聊消息,如果目标QQ号发送消息,那么就回复一句Hello。不过有个BUG没有解决: 如果目标发送的是中文(我想除了键盘上这些字符以外的所有字符受到的待遇也会与中文一样)则会导致该条信息无法识别。其实是可以识别的,但是不知道为什么就触发不了自动回复。不过我也没打算用中文进行交互,所以就没有修。如果你打算直接照搬代码的话请注意这一点。

安装依赖:

1
2
3
pip install python-socketio
pip install websocket-client
pip install requests

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import socketio
import json
import requests

sio = socketio.Client()
robotqq = "123456789" # 这里填写你的QQ号
webapi = "http://127.0.0.1:8888"
@sio.event
def connect():
print('成功连接服务器')
sio.emit('GetWebConn',robotqq)#取得当前已经登录的QQ链接

# 该函数的作用是发送消息。ToQQ是要发送的QQ号或群号,Content是内容,sendToType是要发送的类型,即好友,群聊,私聊这三个类型,1为好友,2为群聊,3为私聊,这其中有些需要注意的地方,这里我就不再多说了,请看我上面发出的文档的链接里的内容
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']=groupid
tmp['atUser']=atuser
print("This is Send")
print("this is sendToType::", sendToType)
print("This is ToQQ: ", ToQQ)
print("This is atuser: ", atuser)
print("This is groupid: ", groupid)
print("This is Content: ", Content)
tmp1 = json.dumps(tmp)
result = requests.post(webapi+'/v1/LuaApiCaller?funcname=SendMsg&qq='+robotqq,data=tmp1)
print(result.text)

@sio.on("OnGroupMsgs")
def OnGroupMsgs(message):
"""监听群消息"""
print(message)
if(message['CurrentPacket']['Data']['FromUserId'] == 11223344): # 11223344为目标QQ号,其应该为整型。这一步是判断是否为目标QQ号
send(message['CurrentPacket']['Data']['FromGroupId'], message['CurrentPacket']['Data']['Content'], 2)

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

就是这些,其中监听好友消息和监听事件没有用到。

那么,本篇完。

评论



愿火焰指引你