Skip to content
This repository has been archived by the owner on Aug 23, 2020. It is now read-only.

增加了 poll 命令的支持 #296

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
17 changes: 15 additions & 2 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,14 @@ QQBot 启动后,在另一个控制台窗口使用 qq 命令操作 QQBot ,目
4) 消息发送命令

qq send buddy|group|discuss $rinfo $message


   5) 消息接收命令

       qq poll


5) 群管理命令: 设置/取消管理员 、 设置/删除群名片 、 群成员禁言 以及 踢除群成员
6) 群管理命令: 设置/取消管理员 、 设置/删除群名片 、 群成员禁言 以及 踢除群成员

qq group-set-admin $ginfo $minfo1,$minfo2,...

Expand All @@ -83,7 +88,7 @@ QQBot 启动后,在另一个控制台窗口使用 qq 命令操作 QQBot ,目
qq group-kick $ginfo $minfo1,$minfo2,...


6) 加载/卸载/显示插件
7) 加载/卸载/显示插件

qq plug/unplug myplugin

Expand Down Expand Up @@ -458,6 +463,9 @@ GUI 模式是默认的模式,只适用于个人电脑。邮箱模式可以适

# 二维码 http 服务器端口号
"httpServerPort" : 8189,

# Tornado restapi 服务器端口号
"restapiServerPort" : 8190,

# 自动登录的 QQ 号
"qq" : "3497303033",
Expand Down Expand Up @@ -512,6 +520,7 @@ GUI 模式是默认的模式,只适用于个人电脑。邮箱模式可以适
# "termServerPort" : 8188,
# "httpServerIP" : "",
# "httpServerPort" : 8189,
# "restapiServerPort" : 8190,
# "qq" : "",
# "mailAccount" : "",
# "mailAuthCode" : "",
Expand Down Expand Up @@ -580,6 +589,10 @@ QQBot 启动后,会开启一个 QQBot-term 服务器监听用户通过 qq 命

如果需要在同一台机器上登录多个 QQ 号码,可以直接在不同的终端中开启多个 qqbot 进程进行登录,但是,每个 qqbot 进程必须设置专有的 termServerPort 和 httpServerPort (或者全部设置为 0 或 空值 ),否则会造成端口号冲突。

#### QQBot-restapi 服务器端口号( restapiServerPort )

逻辑和 QQBot-term 一样,但是是基于Tornado的一个restapi接口。便于使用其它程序和QQBot进行交互

#### 调试模式( debug )

若 debug 项设置为 True ,则运行过程中会打印调试信息。
Expand Down
4 changes: 3 additions & 1 deletion faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ contact.ctype 为 'buddy'/'group'/'discuss' 时,分别代表本消息时 好

#### 如何采用 virtualenv 将本项目安装至独立的运行环境?

本项目依赖于 reqests 、flask 、 certifi 和 apscheduler 库,用 pip 安装本项目时会自动安装以上四个库以及它们所依赖的库。一般来说安装本项目不会与系统其他项目冲突,因此可直接安装至系统的全局 site-packages 目录。
本项目依赖于 reqests 、flask 、 certifi 、 tornado 和 apscheduler 库,用 pip 安装本项目时会自动安装以上四个库以及它们所依赖的库。一般来说安装本项目不会与系统其他项目冲突,因此可直接安装至系统的全局 site-packages 目录。

在某些系统中可能会出现 https 请求错误,这时需要安装 certifi 库的指定版本(2015.4.28 版),可能会将系统中已有的 certifi 库升级或降级并导致会使系统中的其他项目无法使用,这时可以使用 virtualenv 将本项目安装至独立的运行环境中。

Expand All @@ -76,6 +76,7 @@ virtualenv 基本原理和使用可参考 [廖雪峰的教程](http://www.liaoxu
pip install certifi==2015.4.28
pip install flask==0.12
pip install apscheduler==3.3.1
pip install tornado==4.5.2
pip install qqbot

注意:使用本方式安装本项目后,每次使用 qqbot 和 qq 命令之前,需要先运行下面这条命令激活 qqbot-venv 下的运行环境:
Expand All @@ -97,6 +98,7 @@ Windows 下, 上述脚本改为:
pip install certifi==2015.4.28
pip install flask==0.12
pip install apscheduler==3.3.1
pip install tornado==4.5.2
pip install qqbot

其中 %UserProfile% 是用户主目录,Win7中为 C:\Users\xxx 目录。
Expand Down
15 changes: 13 additions & 2 deletions qqbot/qconf.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@

# 二维码 http 服务器端口号
"httpServerPort" : 8189,

# restapi 服务器端口号
"restapiServerPort" : 8190,

# 自动登录的 QQ 号
"qq" : "3497303033",
Expand Down Expand Up @@ -82,6 +85,7 @@
# "termServerPort" : 8188,
# "httpServerIP" : "",
# "httpServerPort" : 8189,
# "restapiServerPort" : 8190,
# "qq" : "",
# "mailAccount" : "",
# "mailAuthCode" : "",
Expand All @@ -102,6 +106,7 @@
"termServerPort" : 8188,
"httpServerIP" : "",
"httpServerPort" : 8189,
"restapiServerPort" : 8190,
"qq" : "",
"mailAccount" : "",
"mailAuthCode" : "",
Expand All @@ -124,7 +129,7 @@
QQBot 机器人

用法: {PROGNAME} [-h] [-d] [-nd] [-u USER] [-q QQ]
[-p TERMSERVERPORT] [-ip HTTPSERVERIP][-hp HTTPSERVERPORT]
[-p TERMSERVERPORT] [-rp RESTAPISERVERPORT] [-ip HTTPSERVERIP][-hp HTTPSERVERPORT]
[-m MAILACCOUNT] [-mc MAILAUTHCODE] [-r] [-nr]
[-fi FETCHINTERVAL]

Expand Down Expand Up @@ -156,6 +161,9 @@
-p TERMSERVERPORT, --termServerPort TERMSERVERPORT
更改QTerm控制台的监听端口到 TERMSERVERPORT 。
默认的监听端口是 8188 (TCP)。
-rp RESTAPISERVERPORT, --restapiServerPort RESTAPISERVERPORT
更改RestAPI监听端口到 RESTAPISERVERPORT 。
默认的监听端口是 8190 (TCP)。

HTTP二维码查看服务器设置:
(请阅读说明文件以了解此HTTP服务器的详细信息。)
Expand Down Expand Up @@ -227,7 +235,9 @@ def readCmdLine(self, argv):

parser.add_argument('-ip', '--httpServerIP')

parser.add_argument('-hp', '--httpServerPort', type=int)
parser.add_argument('-hp', '--httpServerPort', type=int)

parser.add_argument('-rp', '--restapiServerPort', type=int)

parser.add_argument('-m', '--mailAccount')

Expand Down Expand Up @@ -427,6 +437,7 @@ def Display(self):
INFO('二维码服务器 ip :%s', self.httpServerIP or '无')
INFO('二维码服务器端口号:%s',
self.httpServerIP and self.httpServerPort or '无')
INFO('RestAPI服务器端口号:%s', self.restapiServerPort or '无')
INFO('用于接收二维码的邮箱账号:%s', self.mailAccount or '无')
INFO('邮箱服务授权码:%s', self.mailAccount and '******' or '无')
INFO('以文本模式显示二维码:%s', self.cmdQrcode and '是' or '否')
Expand Down
50 changes: 49 additions & 1 deletion qqbot/qqbotcls.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@
from qqbot.qconf import QConf
from qqbot.utf8logger import INFO, CRITICAL, ERROR, WARN
from qqbot.qsession import QLogin, RequestError
from qqbot.common import StartDaemonThread, Import
from qqbot.common import StartDaemonThread, Import, Queue
from qqbot.qterm import QTermServer
from qqbot.webserver.server import TornadoServer
from qqbot.mainloop import MainLoop, Put
from qqbot.groupmanager import GroupManager
from qqbot.termbot import TermBot
Expand Down Expand Up @@ -128,6 +129,37 @@ def Login(self, argv=None):
# child thread 1
self.poll = session.Copy().Poll

def PollMessage(self):
maxIter = 1024
result = []
while maxIter > 0:
try:
if not self.msgQueue.empty():
tmp = self.msgQueue.get(block=False)
if tmp[1] is None:
tmpdict = {
'ctype' : tmp[5],
'buddy' : str(tmp[0]),
'content' : tmp[2],
'fromUin' : tmp[3],
}
else:
tmpdict = {
'ctype' : tmp[5],
'group' : str(tmp[0]),
'member' : str(tmp[1]),
'content' : tmp[2],
'fromUin' : tmp[3],
'membUin' : tmp[4],
}
result.append(tmpdict)
maxIter -= 1
else:
break
except Exception as e:
ERROR('处理消息队列出错 %s'%str(e), exc_info=True)
return result

def Run(self):
if self.conf.startAfterFetch:
self.firstFetch()
Expand All @@ -139,6 +171,7 @@ def Run(self):
StartDaemonThread(self.pollForever)
StartDaemonThread(self.intervalForever)
StartDaemonThread(QTermServer(self.conf.termServerPort, self.onTermCommand).Run)
StartDaemonThread(TornadoServer(self.conf.restapiServerPort, self.onCommand).Run)
self.scheduler.start()

self.started = True
Expand Down Expand Up @@ -198,6 +231,18 @@ def onPollComplete(self, ctype, fromUin, membUin, content):
else:
INFO('来自 %s[%s] 的消息: "%s"' % (contact, member, content))

try:
self.msgQueue.put((contact, member, content, fromUin, membUin, ctype), block=False)
except queue.Full:
self.discardedMessage += 1
self.msgQueue.get(block=False)
try:
self.msgQueue.put((contact, member, content, fromUin, membUin, ctype), block=False)
except Exception as e:
ERROR('消息队列出错 %s'%str(e), exc_info=True)
except Exception as e:
ERROR('消息队列出错 %s'%str(e), exc_info=True)

self.onQQMessage(contact, member, content)

def detectAtMe(self, nameInGroup, content):
Expand Down Expand Up @@ -240,6 +285,9 @@ def init(self, argv):
for pluginName in self.conf.plugins:
self.Plug(pluginName)

self.discardedMessage = 0
self.msgQueue = Queue.Queue(maxsize=1024)

self.onInit()

def wrap(self, slots):
Expand Down
Loading