This repository has been archived by the owner on Dec 28, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 9106bc9
Showing
8 changed files
with
927 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
*.py[co] | ||
*.o | ||
*.sw[po] | ||
*~ | ||
.DS_Store | ||
*.log | ||
*.tmp | ||
.idea | ||
tags | ||
.#* | ||
*.db | ||
logs/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
## 介绍 | ||
一个桥接XMPP和QQ的机器人,现在紧紧支持桥接XMPP和QQ群消息,桥接后可以实现XMPP和QQ互通 | ||
|
||
## 环境 | ||
Python 2.7 | ||
|
||
## 配置 | ||
编辑settings.py填入相应配置项 | ||
|
||
## 安装 | ||
pip install -r dev_requirements.txt | ||
|
||
## 运行 | ||
python qxbot.py | ||
|
||
## 问题 | ||
群会收到两遍消息 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#!/usr/bin/env python | ||
# -*- coding:utf-8 -*- | ||
# | ||
# Author : cold | ||
# E-mail : [email protected] | ||
# Date : 13/03/01 11:44:05 | ||
# Desc : 消息调度 | ||
# | ||
from util import get_logger | ||
|
||
class MessageDispatch(object): | ||
""" 消息调度器 """ | ||
def __init__(self, qxbot, bridges, xmpp_msg_queue, qq_msg_queue): | ||
self.logger = get_logger() | ||
self.xmpp_msg_queue = xmpp_msg_queue | ||
self.qq_msg_queue = qq_msg_queue | ||
self.qxbot = qxbot | ||
self.uin_qid_map = {} | ||
self.qid_uin_map = {} | ||
self.bridges = bridges | ||
|
||
def get_map(self): | ||
uins = [key for key, value in self.qxbot.webqq.group_map.items()] | ||
for uin in uins: | ||
qid = self.get_qid_with_uin(uin) | ||
self.uin_qid_map[uin] = qid | ||
self.qid_uin_map[qid] = uin | ||
|
||
def get_xmpp_account(self, uin): | ||
""" 根据uin获取桥接的XMPP帐号 """ | ||
qid = self.get_qid_with_uin(uin) | ||
for q, xmpp in self.bridges: | ||
if q == qid: | ||
return xmpp | ||
|
||
def get_uin_account(self, xmpp): | ||
""" 根据xmpp帐号获取桥接的qq号的uin """ | ||
for qid, x in self.bridges: | ||
if x == xmpp: | ||
return self.qid_uin_map.get(qid) | ||
|
||
def get_qid_with_uin(self, uin): | ||
qid = self.uin_qid_map.get(uin) | ||
if not qid: | ||
qid = self.qxbot.webqq.get_qid_with_uin(uin) | ||
self.uin_qid_map[uin] = qid | ||
return qid | ||
|
||
def handle_qq_group_msg(self, message): | ||
""" 处理组消息 """ | ||
gcode = message.get("value", {}).get("group_code") | ||
uin = message.get("value", {}).get("send_uin") | ||
content = message.get("value", {}).get("content", [])[-1] | ||
gname = self.qxbot.get_group_name(gcode) | ||
uname = self.qxbot.get_group_member_nick(gcode, uin) | ||
body = u"[{0}][{1}] {2}".format(gname, uname, content) | ||
msg = {"to":self.get_xmpp_account(gcode), "body":body} | ||
self.xmpp_msg_queue.put(msg) | ||
|
||
def dispatch_qq(self, qq_source): | ||
if qq_source.get("retcode") == 0: | ||
messages = qq_source.get("result") | ||
for m in messages: | ||
if m.get("poll_type") == "group_message": | ||
self.handle_qq_group_msg(m) | ||
|
||
def dispatch_xmpp(self, stanza): | ||
body = stanza.body | ||
frm = stanza.from_jid.bare().as_string() | ||
msg = {"to":self.get_uin_account(frm), "body" : body} | ||
self.qq_msg_queue.put(msg) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
#!/usr/bin/env python | ||
# -*- coding:utf-8 -*- | ||
# | ||
# Author : cold | ||
# E-mail : [email protected] | ||
# Date : 13/03/01 11:46:21 | ||
# Desc : 主程序 | ||
# | ||
import Queue | ||
from xmpp import XMPPBot | ||
from webqq import WebQQ | ||
from message_dispatch import MessageDispatch | ||
from util import ThreadPool, get_logger | ||
|
||
from settings import QQ, QQ_PWD, BRIDGES | ||
|
||
|
||
|
||
class QxBot(object): | ||
def __init__(self): | ||
self.logger = get_logger() | ||
self.xmpp_msg_queue = Queue.Queue() | ||
self.qq_msg_queue = Queue.Queue() | ||
self.msg_dispatch = MessageDispatch(self, BRIDGES, self.xmpp_msg_queue, | ||
self.qq_msg_queue) | ||
self.webqq = WebQQ(QQ, self.msg_dispatch) | ||
self.xmpp = XMPPBot(self.msg_dispatch) | ||
self.thread_pool = ThreadPool(3) | ||
self.thread_pool.start() | ||
|
||
def get_group_name(self, gcode): | ||
""" 根据gcode获取群名 """ | ||
return self.webqq.group_map.get(gcode, {}).get("name") | ||
|
||
def get_group_member_nick(self, gcode, uin): | ||
return self.webqq.group_m_map.get(gcode, {}).get(uin, {}).get("nick") | ||
|
||
def run(self): | ||
self.thread_pool.add_job(self.webqq.login, QQ_PWD) | ||
self.thread_pool.add_job(self.handle_qq) | ||
self.thread_pool.add_job(self.handle_xmpp) | ||
self.xmpp.run() | ||
|
||
def handle_xmpp(self): | ||
while True: | ||
msg = self.xmpp_msg_queue.get() | ||
self.logger.info("Send QQ Message %s to XMPP Account %s", | ||
msg.get("body"), msg.get("to")) | ||
self.xmpp.send_msg(**msg) | ||
|
||
def handle_qq(self): | ||
while True: | ||
msg = self.qq_msg_queue.get() | ||
body = msg.get("body") | ||
if body: | ||
self.logger.info("Send XMPP Message %s to QQ Account %s", | ||
body, msg.get("to")) | ||
self.webqq.send_group_msg(msg.get("to"), body) | ||
|
||
|
||
if __name__ == "__main__": | ||
qx = QxBot() | ||
qx.run() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#!/usr/bin/env python | ||
# -*- coding:utf-8 -*- | ||
# | ||
# Author : cold | ||
# E-mail : [email protected] | ||
# Date : 13/03/01 14:55:34 | ||
# Desc : 配置文件 | ||
# | ||
|
||
QQ = 1685359365 | ||
|
||
QQ_PWD = "" | ||
|
||
XMPP_ACCOUNT = "[email protected]" | ||
|
||
XMPP_PASSWD = "" | ||
|
||
# 桥接的QQ群和XMPP帐号 | ||
BRIDGES = ( | ||
(224241247, "[email protected]"), # QQ 群 -> XMPP | ||
) |
Oops, something went wrong.