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)