diff --git a/examples/__init__.py b/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/auto_accept_friend_request.py b/examples/auto_accept_friend_request.py new file mode 100644 index 0000000..0d29212 --- /dev/null +++ b/examples/auto_accept_friend_request.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +import sys +import ntchat +import xml.dom.minidom + +wechat = ntchat.WeChat() + +# 打开pc微信, smart: 是否管理已经登录的微信 +wechat.open(smart=False) + + +# 注册消息回调 +@wechat.msg_register(ntchat.MT_RECV_FRIEND_MSG) +def on_recv_text_msg(wechat_instance: ntchat.WeChat, message): + xml_content = message["data"]["raw_msg"] + dom = xml.dom.minidom.parseString(xml_content) + + # 从xml取相关参数 + encryptusername = dom.documentElement.getAttribute("encryptusername") + ticket = dom.documentElement.getAttribute("ticket") + scene = dom.documentElement.getAttribute("scene") + + # 自动同意好友申请 + wechat_instance.accept_friend_request(encryptusername, ticket, int(scene)) + + +try: + while True: + pass +except KeyboardInterrupt: + ntchat.exit_() + sys.exit() diff --git a/examples/echo_bot_msg_register.py b/examples/echo_bot_msg_register.py new file mode 100644 index 0000000..685a703 --- /dev/null +++ b/examples/echo_bot_msg_register.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import sys +import ntchat + +wechat = ntchat.WeChat() + +# 打开pc微信, smart: 是否管理已经登录的微信 +wechat.open(smart=False) + + +# 注册消息回调 +@wechat.msg_register(ntchat.MT_RECV_TEXT_MSG) +def on_recv_text_msg(wechat_instance: ntchat.WeChat, message): + data = message["data"] + from_wxid = data["from_wxid"] + self_wxid = wechat_instance.get_login_info()["wxid"] + + # 判断消息不是自己发的,并回复对方 + if from_wxid != self_wxid: + wechat_instance.send_text(to_wxid=from_wxid, content=f"你发送的消息是: {data['msg']}") + + +try: + while True: + pass +except KeyboardInterrupt: + ntchat.exit_() + sys.exit() diff --git a/examples/echo_bot_on.py b/examples/echo_bot_on.py new file mode 100644 index 0000000..980e43d --- /dev/null +++ b/examples/echo_bot_on.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +import sys +import ntchat + +wechat = ntchat.WeChat() + +# 打开pc微信, smart: 是否管理已经登录的微信 +wechat.open(smart=False) + + +def on_recv_text_msg(wechat_instance: ntchat.WeChat, message): + data = message["data"] + from_wxid = data["from_wxid"] + self_wxid = wechat_instance.get_login_info()["wxid"] + + # 判断消息不是自己发的,并回复对方 + if from_wxid != self_wxid: + wechat_instance.send_text(to_wxid=from_wxid, content=f"你发送的消息是: {data['msg']}") + + +# 监听接收文本消息 +wechat.on(ntchat.MT_RECV_TEXT_MSG, on_recv_text_msg) + +try: + while True: + pass +except KeyboardInterrupt: + ntchat.exit_() + sys.exit() diff --git a/examples/get_contacts.py b/examples/get_contacts.py new file mode 100644 index 0000000..9c17c69 --- /dev/null +++ b/examples/get_contacts.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +import sys +import ntchat + +wechat = ntchat.WeChat() + +# 打开pc微信, smart: 是否管理已经登录的微信 +wechat.open(smart=False) + +# 等待登录 +wechat.wait_login() + +# 获取联系人列表并输出 +contacts = wechat.get_contacts() + +print("联系人列表: ") +print(contacts) + + +try: + while True: + pass +except KeyboardInterrupt: + ntchat.exit_() + sys.exit() diff --git a/examples/get_rooms.py b/examples/get_rooms.py new file mode 100644 index 0000000..1dcaa27 --- /dev/null +++ b/examples/get_rooms.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +import sys +import ntchat + +wechat = ntchat.WeChat() + +# 打开pc微信, smart: 是否管理已经登录的微信 +wechat.open(smart=False) + +# 等待登录 +wechat.wait_login() + +# 获取联系人列表并输出 +rooms = wechat.get_rooms() + +print("群列表: ") +print(rooms) + + +try: + while True: + pass +except KeyboardInterrupt: + ntchat.exit_() + sys.exit() diff --git a/examples/multi_open.py b/examples/multi_open.py new file mode 100644 index 0000000..a9ed2e7 --- /dev/null +++ b/examples/multi_open.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +import sys +import ntchat + +# 多开3个微信 +for i in range(3): + wechat = ntchat.WeChat() + wechat.open() + diff --git a/examples/resources/send_text_ui.xml b/examples/resources/send_text_ui.xml new file mode 100644 index 0000000..75d4d8c --- /dev/null +++ b/examples/resources/send_text_ui.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/examples/resources/warn.svg b/examples/resources/warn.svg new file mode 100644 index 0000000..f32463d --- /dev/null +++ b/examples/resources/warn.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/send_text.py b/examples/send_text.py new file mode 100644 index 0000000..b6932e3 --- /dev/null +++ b/examples/send_text.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +import sys +import ntchat + +wechat = ntchat.WeChat() + +# 打开pc微信, smart: 是否管理已经登录的微信 +wechat.open(smart=False) + +# 等待登录 +wechat.wait_login() + +# 向文件助手发送一条消息 +wechat.send_text(to_wxid="filehelper", content="hello, filehelper") + +try: + while True: + pass +except KeyboardInterrupt: + ntchat.exit_() + sys.exit() + + + diff --git a/examples/send_text_ui.py b/examples/send_text_ui.py new file mode 100644 index 0000000..cda06da --- /dev/null +++ b/examples/send_text_ui.py @@ -0,0 +1,53 @@ +import xcgui +import ntchat +from xcgui import XApp, XWindow + + +class NtChatWindow(XWindow): + def __init__(self): + super(NtChatWindow, self).__init__() + self.loadLayout("resources\\send_text_ui.xml") + self.setMinimumSize(600, 500) + + btn: xcgui.XButton = self.findObjectByName("btn_open") + btn.regEvent(xcgui.XE_BNCLICK, self.on_btn_open_clicked) + + btn: xcgui.XButton = self.findObjectByName("btn_send") + btn.regEvent(xcgui.XE_BNCLICK, self.on_btn_send_clicked) + + self.edit_wxid: xcgui.XEdit = self.findObjectByName("edit_wxid") + self.edit_content: xcgui.XEdit = self.findObjectByName("edit_content") + self.edit_log: xcgui.XEdit = self.findObjectByName("edit_log") + self.edit_log.enableAutoWrap(True) + + self.wechat_instance: ntchat.WeChat = None + + def on_btn_open_clicked(self, sender, _): + self.wechat_instance = ntchat.WeChat() + self.wechat_instance.open() + self.wechat_instance.on(ntchat.MT_ALL, self.on_recv_message) + + def on_btn_send_clicked(self, sender, _): + if not self.wechat_instance.login_status: + svg = xcgui.XSvg.loadFile("resources\\warn.svg") + svg.setSize(16, 16) + self.notifyMsgWindowPopup(xcgui.position_flag_top, "警告", "请先打开并登录微信", + xcgui.XImage.loadSvg(svg), xcgui.notifyMsg_skin_warning) + else: + self.wechat_instance.send_text(self.edit_wxid.getText(), self.edit_content.getText()) + + def on_recv_message(self, wechat, message): + text = self.edit_log.getText() + text += "\n" + text += str(message) + self.edit_log.setText(text) + self.redraw() + + +if __name__ == '__main__': + app = XApp() + window = NtChatWindow() + window.showWindow() + app.run() + ntchat.exit_() + app.exit() diff --git a/examples/test.py b/examples/test.py new file mode 100644 index 0000000..b15c3a0 --- /dev/null +++ b/examples/test.py @@ -0,0 +1,8 @@ +import xml.dom.minidom + +content = "" +dom = xml.dom.minidom.parseString(content) +encryptusername = dom.documentElement.getAttribute("encryptusername") +ticket = dom.documentElement.getAttribute("ticket") +scene = dom.documentElement.getAttribute("scene") +print(dom.documentElement.getAttribute("encryptusername")) \ No newline at end of file diff --git a/ntchat/const/wx_type.py b/ntchat/const/wx_type.py index 5db00e5..538ddab 100644 --- a/ntchat/const/wx_type.py +++ b/ntchat/const/wx_type.py @@ -1,4 +1,4 @@ - +MT_ALL = 11000 MT_READY_MSG = 11024 MT_USER_LOGIN_MSG = 11025 MT_USER_LOGOUT_MSG = 11026 diff --git a/ntchat/core/wechat.py b/ntchat/core/wechat.py index 98821bd..921d71a 100644 --- a/ntchat/core/wechat.py +++ b/ntchat/core/wechat.py @@ -69,14 +69,17 @@ class WeChat: return wrapper def on_recv(self, message): + log.debug("on recv message: %s", message) msg_type = message["type"] extend = message.get("extend", None) if msg_type == wx_type.MT_USER_LOGIN_MSG: - self.login_status = False + self.login_status = True self.__wait_login_event.set() self.__login_info = message.get("data", {}) + log.info("login success, wxid: %s, nickname: %s", self.__login_info["wxid"], self.__login_info["nickname"]) elif msg_type == wx_type.MT_USER_LOGOUT_MSG: self.login_status = False + log.info("logout, pid: %d", self.pid) if extend is not None and extend in self.__req_data_cache: req_data = self.__req_data_cache[extend] @@ -84,6 +87,7 @@ class WeChat: del self.__req_data_cache[extend] else: self.__msg_event_emitter.emit(str(msg_type), self, message) + self.__msg_event_emitter.emit(str(wx_type.MT_ALL), self, message) def wait_login(self, timeout=None): log.info("wait login...") @@ -114,7 +118,7 @@ class WeChat: if extend is not None: message["extend"] = extend message_json = json.dumps(message) - log.debug("communicate wechat pid:%d, data: %s", self.pid, message) + log.debug("communicate wechat pid: %d, data: %s", self.pid, message) return wcprobe.send(self.client_id, message_json) def __send_sync(self, msg_type, data=None, timeout=10): diff --git a/ntchat/utils/logger.py b/ntchat/utils/logger.py index dc692cb..09d5477 100644 --- a/ntchat/utils/logger.py +++ b/ntchat/utils/logger.py @@ -47,7 +47,7 @@ def get_logger(name: str) -> logging.Logger: filepath = f'{base_dir}/log-{time_now.strftime(time_format)}.txt' - file_handler = logging.FileHandler(filepath, 'a') + file_handler = logging.FileHandler(filepath, 'a', encoding='utf-8') file_handler.setLevel(NTCHAT_LOG) file_handler.setFormatter(log_formatter) logger.addHandler(file_handler)