Skip to content
This repository has been archived by the owner on Dec 28, 2018. It is now read-only.

Commit

Permalink
create repo
Browse files Browse the repository at this point in the history
  • Loading branch information
coldnight committed Mar 1, 2013
0 parents commit 9106bc9
Show file tree
Hide file tree
Showing 8 changed files with 927 additions and 0 deletions.
12 changes: 12 additions & 0 deletions .gitignore
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/
17 changes: 17 additions & 0 deletions README.md
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

## 问题
群会收到两遍消息
71 changes: 71 additions & 0 deletions message_dispatch.py
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)
63 changes: 63 additions & 0 deletions qxbot.py
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()
21 changes: 21 additions & 0 deletions settings.py
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
)
Loading

0 comments on commit 9106bc9

Please sign in to comment.