From 25081399bef9e7d9db866c506dc330e3cccb48fd Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Wed, 28 Mar 2018 22:59:19 -0700 Subject: [PATCH 01/22] rpc server --- itchat/__init__.py | 3 ++ itchat/components/__init__.py | 2 + itchat/components/rpc.py | 99 +++++++++++++++++++++++++++++++++++ itchat/core.py | 8 +++ 4 files changed, 112 insertions(+) create mode 100644 itchat/components/rpc.py diff --git a/itchat/__init__.py b/itchat/__init__.py index 256fc721..3a3f5dba 100644 --- a/itchat/__init__.py +++ b/itchat/__init__.py @@ -18,6 +18,9 @@ def new_instance(): # but it makes auto-fill a real mess, so forgive me for my following ** # actually it toke me less than 30 seconds, god bless Uganda +# rpc +start_rpc_server = originInstance.start_rpc_server + # components.login login = originInstance.login get_QRuuid = originInstance.get_QRuuid diff --git a/itchat/components/__init__.py b/itchat/components/__init__.py index f088c173..c4122f22 100644 --- a/itchat/components/__init__.py +++ b/itchat/components/__init__.py @@ -3,6 +3,7 @@ from .login import load_login from .messages import load_messages from .register import load_register +from .rpc import load_rpc def load_components(core): load_contact(core) @@ -10,3 +11,4 @@ def load_components(core): load_login(core) load_messages(core) load_register(core) + load_rpc(core) diff --git a/itchat/components/rpc.py b/itchat/components/rpc.py new file mode 100644 index 00000000..9f693577 --- /dev/null +++ b/itchat/components/rpc.py @@ -0,0 +1,99 @@ +import logging +import six.moves.xmlrpc_server as rpc +import six.moves.xmlrpc_client as cli +import itchat.storage.templates as tpl +import itchat.returnvalues as rv +import threading +import types +import base64 +import json + +logger = logging.getLogger('itchat') + +exported_functions = [ + # components.login + 'login', + 'get_QRuuid', + 'get_QR', + 'check_login', + 'web_init', + 'show_mobile_login', + 'start_receiving', + 'get_msg', + 'logout', + + # components.contact + 'update_chatroom', + 'update_friend', + 'get_contacts', + 'get_friends', + 'get_chatrooms', + 'get_mps', + 'set_alias', + 'set_pinned', + 'add_friend', + 'get_head_img', + 'create_chatroom', + 'set_chatroom_name', + 'delete_member_from_chatroom', + 'add_member_into_chatroom', + +# components.messages + 'send_raw_msg', + 'send_msg', + 'upload_file', + 'send_file', + 'send_image', + 'send_video', + 'send', + 'revoke', + +# components.hotreload + 'dump_login_status', + 'load_login_status', + +# components.register + 'auto_login', + 'configured_reply', + 'msg_register', + 'run', + +# other functions + 'search_friends', + 'search_chatrooms', + 'search_mps', + 'set_logging', +] + + +def dump_obj(marshaller, value, write, escape=cli.escape): + write('') + write(escape(json.dumps(value))) + write('') + + +def register_types(): + cli.Marshaller.dispatch[tpl.Chatroom] = dump_obj + cli.Marshaller.dispatch[tpl.ContactList] = dump_obj + cli.Marshaller.dispatch[tpl.User] = dump_obj + cli.Marshaller.dispatch[tpl.ChatroomMember] = dump_obj + cli.Marshaller.dispatch[tpl.MassivePlatform] = dump_obj + cli.Marshaller.dispatch[rv.ReturnValue] = dump_obj + + +def load_rpc(core): + core.start_rpc_server = start_rpc_server + + +def start_rpc_server(self): + server = rpc.SimpleXMLRPCServer(('localhost', 9000), allow_none=True) + server.register_introspection_functions() + for i in exported_functions: + if hasattr(self, i): + server.register_function(getattr(self, i)) + rpc_thread = threading.Thread(target=server.serve_forever, args=()) + rpc_thread.daemon = True + logger.info('Starting RPC server') + register_types() + rpc_thread.start() + self.rpc = server \ No newline at end of file diff --git a/itchat/core.py b/itchat/core.py index 52d6ae4f..11cd9ece 100644 --- a/itchat/core.py +++ b/itchat/core.py @@ -27,6 +27,8 @@ def __init__(self): self.functionDict = {'FriendChat': {}, 'GroupChat': {}, 'MpChat': {}} self.useHotReload, self.hotReloadDir = False, 'itchat.pkl' self.receivingRetryCount = 5 + self.rpc = None + def login(self, enableCmdQR=False, picDir=None, qrCallback=None, loginCallback=None, exitCallback=None): ''' log in like web wechat does @@ -456,4 +458,10 @@ def search_chatrooms(self, name=None, userName=None): def search_mps(self, name=None, userName=None): return self.storageClass.search_mps(name, userName) + def start_rpc_server(self): + ''' start rpc server + it is defined in components/rpc.py + ''' + raise NotImplementedError() + load_components(Core) From 68ebed5b81b6bdd81a59e70f69ff18de560d247a Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Wed, 28 Mar 2018 23:01:26 -0700 Subject: [PATCH 02/22] update rpc code --- itchat/components/rpc.py | 4 ++-- itchat/core.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/itchat/components/rpc.py b/itchat/components/rpc.py index 9f693577..7aea6fb2 100644 --- a/itchat/components/rpc.py +++ b/itchat/components/rpc.py @@ -85,8 +85,8 @@ def load_rpc(core): core.start_rpc_server = start_rpc_server -def start_rpc_server(self): - server = rpc.SimpleXMLRPCServer(('localhost', 9000), allow_none=True) +def start_rpc_server(self, host, port): + server = rpc.SimpleXMLRPCServer((host, port), allow_none=True) server.register_introspection_functions() for i in exported_functions: if hasattr(self, i): diff --git a/itchat/core.py b/itchat/core.py index 11cd9ece..28da80c8 100644 --- a/itchat/core.py +++ b/itchat/core.py @@ -458,7 +458,7 @@ def search_chatrooms(self, name=None, userName=None): def search_mps(self, name=None, userName=None): return self.storageClass.search_mps(name, userName) - def start_rpc_server(self): + def start_rpc_server(self, host, port): ''' start rpc server it is defined in components/rpc.py ''' From ab243368f5a009764e160f3736f96c73ce149506 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 31 Mar 2018 18:50:23 -0700 Subject: [PATCH 03/22] add recv api --- itchat/__init__.py | 1 + itchat/components/rpc.py | 3 +++ itchat/core.py | 6 ++++-- itchat/storage/__init__.py | 8 ++++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/itchat/__init__.py b/itchat/__init__.py index 3a3f5dba..adb930cc 100644 --- a/itchat/__init__.py +++ b/itchat/__init__.py @@ -20,6 +20,7 @@ def new_instance(): # rpc start_rpc_server = originInstance.start_rpc_server +recv = originInstance.recv # components.login login = originInstance.login diff --git a/itchat/components/rpc.py b/itchat/components/rpc.py index 7aea6fb2..d99ea97f 100644 --- a/itchat/components/rpc.py +++ b/itchat/components/rpc.py @@ -3,6 +3,7 @@ import six.moves.xmlrpc_client as cli import itchat.storage.templates as tpl import itchat.returnvalues as rv +import itchat.storage.messagequeue as mq import threading import types import base64 @@ -63,6 +64,7 @@ 'search_chatrooms', 'search_mps', 'set_logging', + 'recv', ] @@ -79,6 +81,7 @@ def register_types(): cli.Marshaller.dispatch[tpl.ChatroomMember] = dump_obj cli.Marshaller.dispatch[tpl.MassivePlatform] = dump_obj cli.Marshaller.dispatch[rv.ReturnValue] = dump_obj + cli.Marshaller.dispatch[mq.Message] = dump_obj def load_rpc(core): diff --git a/itchat/core.py b/itchat/core.py index 28da80c8..950a1a13 100644 --- a/itchat/core.py +++ b/itchat/core.py @@ -457,11 +457,13 @@ def search_chatrooms(self, name=None, userName=None): return self.storageClass.search_chatrooms(name, userName) def search_mps(self, name=None, userName=None): return self.storageClass.search_mps(name, userName) - + def recv(self): + ''' receive cached message on msgList + ''' + return self.storageClass.recv() def start_rpc_server(self, host, port): ''' start rpc server it is defined in components/rpc.py ''' raise NotImplementedError() - load_components(Core) diff --git a/itchat/storage/__init__.py b/itchat/storage/__init__.py index ec6c8ba7..8b0280b8 100644 --- a/itchat/storage/__init__.py +++ b/itchat/storage/__init__.py @@ -115,3 +115,11 @@ def search_mps(self, name=None, userName=None): if name in m['NickName']: matchList.append(copy.deepcopy(m)) return matchList + def recv(self): + rtn = [] + tmp = self.msgList + self.msgList = Queue(-1) + while not tmp.empty(): + rtn.append(dict(tmp.get())) + return rtn + \ No newline at end of file From 0f49f82e0aba0f4989f97ce251581d97abdd2efb Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 31 Mar 2018 19:05:45 -0700 Subject: [PATCH 04/22] update readme --- README.md | 21 +++++++++++++++++++++ README.rst | 20 ++++++++++++++++++++ README_EN.md | 21 +++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/README.md b/README.md index 75767d9b..50d523ef 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,27 @@ itchat.logout() 若不设置loginCallback的值,则将会自动删除二维码图片并清空命令行显示。 +### RPC调用 + +如果你想启动RPC服务器,请使用下面的命令,监听地址和端口可根据自己需求修改 + +```python +import itchat + +itchat.start_rpc_server(‘localhost’, 9000) +``` + +几乎所有的API都已经导出,细节请查看rpc.py文件 + +客户端代码示例 + +```python +import xmlrpc.client + +rpc = xmlrpc.client.ServerProxy("http://localhost:9000/") +rpc.get_friends() +``` + ## 常见问题与解答 Q: 如何通过这个包将自己的微信号变为控制器? diff --git a/README.rst b/README.rst index 47b6df45..e4a47de6 100644 --- a/README.rst +++ b/README.rst @@ -235,6 +235,26 @@ If loginCallback is not set, qr picture will be deleted and cmd will be cleared. If you exit through phone, exitCallback will also be called. +*RPC Call* + +If you want to start RPC server, please use the command below. You can specify the listening address and port. + +.. code:: python + import itchat + + itchat.start_rpc_server(‘localhost’, 9000) + +Almost all the APIs are exported for RPC use, please check rpc.py for detail + +Client side code: + +.. code:: python + import xmlrpc.client + + rpc = xmlrpc.client.ServerProxy("http://localhost:9000/") + rpc.get_friends() + + **FAQ** Q: Why I can't send files whose name is encoded in utf8? diff --git a/README_EN.md b/README_EN.md index ab6df03d..2b6a1e82 100644 --- a/README_EN.md +++ b/README_EN.md @@ -237,6 +237,27 @@ If loginCallback is not set, qr picture will be deleted and cmd will be cleared. If you exit through phone, exitCallback will also be called. +### RPC Call + +If you want to start RPC server, please use the command below. You can specify the listening address and port. + +```python +import itchat + +itchat.start_rpc_server(‘localhost’, 9000) +``` + +Almost all the APIs are exported for RPC use, please check rpc.py for detail + +Client side code: + +```python +import xmlrpc.client + +rpc = xmlrpc.client.ServerProxy("http://localhost:9000/") +rpc.get_friends() +``` + ## FAQ Q: How to use this package to use my wechat as an monitor? From 0366ca8b0a30853ede84b8c68837a94c0fd6c7ea Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 31 Mar 2018 21:15:17 -0700 Subject: [PATCH 05/22] update rpc --- .gitignore | 1 + itchat/components/rpc.py | 117 +++++++++++++++++++++------------------ 2 files changed, 63 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index c0ca475b..e63e229d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ test.py itchat.pkl QR.jpg .DS_Store +QR.png diff --git a/itchat/components/rpc.py b/itchat/components/rpc.py index d99ea97f..d56bbdca 100644 --- a/itchat/components/rpc.py +++ b/itchat/components/rpc.py @@ -1,27 +1,28 @@ +import base64 +import io +import json import logging -import six.moves.xmlrpc_server as rpc -import six.moves.xmlrpc_client as cli -import itchat.storage.templates as tpl -import itchat.returnvalues as rv -import itchat.storage.messagequeue as mq import threading import types -import base64 -import json + +import itchat.returnvalues as rv +import itchat.storage.templates as tpl +import six.moves.xmlrpc_client as cli +import six.moves.xmlrpc_server as rpc logger = logging.getLogger('itchat') exported_functions = [ # components.login - 'login', - 'get_QRuuid', - 'get_QR', - 'check_login', - 'web_init', - 'show_mobile_login', - 'start_receiving', - 'get_msg', - 'logout', + 'login', + 'get_QRuuid', + 'get_QR', + 'check_login', + 'web_init', + 'show_mobile_login', + 'start_receiving', + 'get_msg', + 'logout', # components.contact 'update_chatroom', @@ -30,48 +31,54 @@ 'get_friends', 'get_chatrooms', 'get_mps', - 'set_alias', - 'set_pinned', - 'add_friend', - 'get_head_img', - 'create_chatroom', - 'set_chatroom_name', - 'delete_member_from_chatroom', - 'add_member_into_chatroom', - -# components.messages - 'send_raw_msg', - 'send_msg', - 'upload_file', - 'send_file', - 'send_image', - 'send_video', - 'send', - 'revoke', - -# components.hotreload - 'dump_login_status', - 'load_login_status', - -# components.register - 'auto_login', - 'configured_reply', - 'msg_register', - 'run', - -# other functions - 'search_friends', - 'search_chatrooms', - 'search_mps', + 'set_alias', + 'set_pinned', + 'add_friend', + 'get_head_img', + 'create_chatroom', + 'set_chatroom_name', + 'delete_member_from_chatroom', + 'add_member_into_chatroom', + + # components.messages + 'send_raw_msg', + 'send_msg', + 'upload_file', + 'send_file', + 'send_image', + 'send_video', + 'send', + 'revoke', + + # components.hotreload + 'dump_login_status', + 'load_login_status', + + # components.register + 'auto_login', + 'configured_reply', + 'msg_register', + 'run', + + # other functions + 'search_friends', + 'search_chatrooms', + 'search_mps', 'set_logging', - 'recv', + 'recv', ] def dump_obj(marshaller, value, write, escape=cli.escape): - write('') - write(escape(json.dumps(value))) - write('') + if isinstance(value, io.BytesIO): + write('') + encoded = base64.encodebytes(value.getvalue()) + write(encoded.decode('ascii')) + write('') + else: + write('') + write(escape(json.dumps(value))) + write('') def register_types(): @@ -81,7 +88,7 @@ def register_types(): cli.Marshaller.dispatch[tpl.ChatroomMember] = dump_obj cli.Marshaller.dispatch[tpl.MassivePlatform] = dump_obj cli.Marshaller.dispatch[rv.ReturnValue] = dump_obj - cli.Marshaller.dispatch[mq.Message] = dump_obj + cli.Marshaller.dispatch[io.BytesIO] = dump_obj def load_rpc(core): @@ -99,4 +106,4 @@ def start_rpc_server(self, host, port): logger.info('Starting RPC server') register_types() rpc_thread.start() - self.rpc = server \ No newline at end of file + self.rpc = server From 1488133262ae2a1ee68555a4ae455271e5a211be Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sun, 1 Apr 2018 18:31:22 -0700 Subject: [PATCH 06/22] fix bug --- itchat/storage/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/itchat/storage/__init__.py b/itchat/storage/__init__.py index 8b0280b8..7758dbfb 100644 --- a/itchat/storage/__init__.py +++ b/itchat/storage/__init__.py @@ -118,8 +118,9 @@ def search_mps(self, name=None, userName=None): def recv(self): rtn = [] tmp = self.msgList - self.msgList = Queue(-1) - while not tmp.empty(): + count = 1024 + while count > 0 and not tmp.empty(): rtn.append(dict(tmp.get())) + count -= 1 return rtn \ No newline at end of file From 773ae74a02c73684e62d02c66e188b30c26f3788 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sun, 1 Apr 2018 18:59:09 -0700 Subject: [PATCH 07/22] fix rpc issue --- itchat/components/rpc.py | 5 +++++ itchat/storage/__init__.py | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/itchat/components/rpc.py b/itchat/components/rpc.py index d56bbdca..f6e5d3ea 100644 --- a/itchat/components/rpc.py +++ b/itchat/components/rpc.py @@ -75,6 +75,10 @@ def dump_obj(marshaller, value, write, escape=cli.escape): encoded = base64.encodebytes(value.getvalue()) write(encoded.decode('ascii')) write('') + elif isinstance(value, int): + write('') + write('%d' % value) + write('') else: write('') write(escape(json.dumps(value))) @@ -89,6 +93,7 @@ def register_types(): cli.Marshaller.dispatch[tpl.MassivePlatform] = dump_obj cli.Marshaller.dispatch[rv.ReturnValue] = dump_obj cli.Marshaller.dispatch[io.BytesIO] = dump_obj + cli.Marshaller.dispatch[int] = dump_obj def load_rpc(core): diff --git a/itchat/storage/__init__.py b/itchat/storage/__init__.py index 7758dbfb..81a58b0c 100644 --- a/itchat/storage/__init__.py +++ b/itchat/storage/__init__.py @@ -120,7 +120,8 @@ def recv(self): tmp = self.msgList count = 1024 while count > 0 and not tmp.empty(): - rtn.append(dict(tmp.get())) + elem = tmp.get() + rtn.append(dict(elem)) count -= 1 return rtn \ No newline at end of file From 9d4d9c1c4145c234b7c8b66cce2875b7816b363f Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sun, 1 Apr 2018 21:14:19 -0700 Subject: [PATCH 08/22] update --- itchat/storage/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/itchat/storage/__init__.py b/itchat/storage/__init__.py index 81a58b0c..24b1d034 100644 --- a/itchat/storage/__init__.py +++ b/itchat/storage/__init__.py @@ -117,10 +117,9 @@ def search_mps(self, name=None, userName=None): return matchList def recv(self): rtn = [] - tmp = self.msgList count = 1024 - while count > 0 and not tmp.empty(): - elem = tmp.get() + while count > 0 and not self.msgList.empty(): + elem = self.msgList.get() rtn.append(dict(elem)) count -= 1 return rtn From 531394b958753baedac5d6e6afa9ec3b723ecfe0 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Fri, 6 Apr 2018 15:46:48 -0700 Subject: [PATCH 09/22] remove extra log message --- itchat/components/rpc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itchat/components/rpc.py b/itchat/components/rpc.py index f6e5d3ea..d8b17278 100644 --- a/itchat/components/rpc.py +++ b/itchat/components/rpc.py @@ -101,7 +101,7 @@ def load_rpc(core): def start_rpc_server(self, host, port): - server = rpc.SimpleXMLRPCServer((host, port), allow_none=True) + server = rpc.SimpleXMLRPCServer((host, port), logRequests=False, allow_none=True) server.register_introspection_functions() for i in exported_functions: if hasattr(self, i): From a79282c00d150bc11113a133c9b167173fe311cc Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 22:54:26 -0700 Subject: [PATCH 10/22] update rpc server code to enable block mode --- itchat/components/rpc.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/itchat/components/rpc.py b/itchat/components/rpc.py index d8b17278..d389db67 100644 --- a/itchat/components/rpc.py +++ b/itchat/components/rpc.py @@ -100,15 +100,20 @@ def load_rpc(core): core.start_rpc_server = start_rpc_server -def start_rpc_server(self, host, port): +def start_rpc_server(self, host, port, block=False): server = rpc.SimpleXMLRPCServer((host, port), logRequests=False, allow_none=True) server.register_introspection_functions() for i in exported_functions: if hasattr(self, i): server.register_function(getattr(self, i)) - rpc_thread = threading.Thread(target=server.serve_forever, args=()) - rpc_thread.daemon = True logger.info('Starting RPC server') - register_types() - rpc_thread.start() self.rpc = server + if not block: + rpc_thread = threading.Thread(target=server.serve_forever, args=()) + rpc_thread.daemon = True + register_types() + rpc_thread.start() + else: + register_types() + server.serve_forever() + From d7f99c4e24f4d198c138ea062f13a87ed55a9283 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 22:59:07 -0700 Subject: [PATCH 11/22] add run itchat server script --- run_itchat_server.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 run_itchat_server.py diff --git a/run_itchat_server.py b/run_itchat_server.py new file mode 100755 index 00000000..f31ea0f1 --- /dev/null +++ b/run_itchat_server.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +import sys +import itchat + +def lc(): + itchat.start_rpc_server('localhost', 9000, block=True) + +def ec(): + itchat.logout() + sys.exit(1) + + +if __name__ == '__main__': + itchat.login(enableCmdQR=True, loginCallback=lc, exitCallback=ec) From 118c619b6f0af748763398bca54d989212819819 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 23:13:37 -0700 Subject: [PATCH 12/22] update script --- run_itchat_server.py | 14 -------------- setup.py | 2 ++ 2 files changed, 2 insertions(+), 14 deletions(-) delete mode 100755 run_itchat_server.py diff --git a/run_itchat_server.py b/run_itchat_server.py deleted file mode 100755 index f31ea0f1..00000000 --- a/run_itchat_server.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 -import sys -import itchat - -def lc(): - itchat.start_rpc_server('localhost', 9000, block=True) - -def ec(): - itchat.logout() - sys.exit(1) - - -if __name__ == '__main__': - itchat.login(enableCmdQR=True, loginCallback=lc, exitCallback=ec) diff --git a/setup.py b/setup.py index 51e04f1d..1173033e 100644 --- a/setup.py +++ b/setup.py @@ -49,6 +49,8 @@ install_requires=['requests', 'pyqrcode', 'pypng'], + scripts = ['scripts/itchat_server'], + # List additional groups of dependencies here extras_require={}, ) From ee46d7e9ce33f783828c0082c4b1cae667a298db Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 23:13:45 -0700 Subject: [PATCH 13/22] update script --- scripts/itchat_server | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100755 scripts/itchat_server diff --git a/scripts/itchat_server b/scripts/itchat_server new file mode 100755 index 00000000..0c691809 --- /dev/null +++ b/scripts/itchat_server @@ -0,0 +1,26 @@ +#!/usr/bin/env sh + +HOST=localhost +PORT=9000 + +if [ $# == 2 ] +then + HOST=$1 + PORT=$2 +fi + +cat << EOF | python3 +import sys +import itchat + +def lc(): + itchat.start_rpc_server('${HOST}', ${PORT}, block=True) + +def ec(): + itchat.logout() + sys.exit(1) + + +if __name__ == '__main__': + itchat.login(enableCmdQR=True, loginCallback=lc, exitCallback=ec) +EOF \ No newline at end of file From 73d6633ef758fe75f7cb4f04a41d88f7663e05ef Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 23:17:27 -0700 Subject: [PATCH 14/22] update --- scripts/itchat_server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/itchat_server b/scripts/itchat_server index 0c691809..1e328faf 100755 --- a/scripts/itchat_server +++ b/scripts/itchat_server @@ -3,7 +3,7 @@ HOST=localhost PORT=9000 -if [ $# == 2 ] +if [ "$#" -eq 2 ] then HOST=$1 PORT=$2 From 4e3a15b8c95de65042cf8ce74eb3217c97668b86 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 23:32:04 -0700 Subject: [PATCH 15/22] update --- scripts/itchat_server | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/scripts/itchat_server b/scripts/itchat_server index 1e328faf..2c5eee3a 100755 --- a/scripts/itchat_server +++ b/scripts/itchat_server @@ -1,13 +1,28 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash HOST=localhost PORT=9000 +QRCODE=TRUE -if [ "$#" -eq 2 ] -then - HOST=$1 - PORT=$2 -fi +usage() { echo "Usage: $0 [-h ] [-p ] [-2]" 1>&2; exit 1; } + +while getopts ":h:p:2" o; do + case "${o}" in + h) + HOST=${OPTARG} + ;; + p) + PORT=${OPTARG} + ;; + 2) + QRCODE=2 + ;; + *) + usage + ;; + esac +done +shift $((OPTIND-1)) cat << EOF | python3 import sys @@ -22,5 +37,5 @@ def ec(): if __name__ == '__main__': - itchat.login(enableCmdQR=True, loginCallback=lc, exitCallback=ec) + itchat.login(enableCmdQR=${QRCODE}, loginCallback=lc, exitCallback=ec) EOF \ No newline at end of file From 161aa61ad393560f0132a0c0dbbb2c631c9d9d32 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 23:32:41 -0700 Subject: [PATCH 16/22] update --- scripts/itchat_server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/itchat_server b/scripts/itchat_server index 2c5eee3a..9bc6975f 100755 --- a/scripts/itchat_server +++ b/scripts/itchat_server @@ -2,7 +2,7 @@ HOST=localhost PORT=9000 -QRCODE=TRUE +QRCODE=True usage() { echo "Usage: $0 [-h ] [-p ] [-2]" 1>&2; exit 1; } From 7fca2368b03a388cd45739309f27f5619991dce0 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 23:34:13 -0700 Subject: [PATCH 17/22] update --- scripts/itchat_server | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/itchat_server b/scripts/itchat_server index 9bc6975f..b11966ea 100755 --- a/scripts/itchat_server +++ b/scripts/itchat_server @@ -29,7 +29,11 @@ import sys import itchat def lc(): - itchat.start_rpc_server('${HOST}', ${PORT}, block=True) + try: + itchat.start_rpc_server('${HOST}', ${PORT}, block=True) + except: + print('exiting...') + sys.exit(0) def ec(): itchat.logout() From b679aac03857c564ec728fc48d23d2462dff5c97 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sat, 7 Apr 2018 23:36:05 -0700 Subject: [PATCH 18/22] update --- scripts/itchat_server | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/itchat_server b/scripts/itchat_server index b11966ea..49e47682 100755 --- a/scripts/itchat_server +++ b/scripts/itchat_server @@ -41,5 +41,9 @@ def ec(): if __name__ == '__main__': - itchat.login(enableCmdQR=${QRCODE}, loginCallback=lc, exitCallback=ec) + try: + itchat.login(enableCmdQR=${QRCODE}, loginCallback=lc, exitCallback=ec) + except: + print('exiting before login...') + sys.exit(-1) EOF \ No newline at end of file From c474589a8e89e47e2d0361878dcadf88ae8f4c62 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sun, 8 Apr 2018 13:01:35 -0700 Subject: [PATCH 19/22] bug fix --- scripts/itchat_server | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/itchat_server b/scripts/itchat_server index 49e47682..c5e8793d 100755 --- a/scripts/itchat_server +++ b/scripts/itchat_server @@ -28,12 +28,10 @@ cat << EOF | python3 import sys import itchat +loginSuccess = False + def lc(): - try: - itchat.start_rpc_server('${HOST}', ${PORT}, block=True) - except: - print('exiting...') - sys.exit(0) + loginSuccess = True def ec(): itchat.logout() @@ -43,7 +41,9 @@ def ec(): if __name__ == '__main__': try: itchat.login(enableCmdQR=${QRCODE}, loginCallback=lc, exitCallback=ec) + if loginSuccess: + itchat.start_rpc_server('${HOST}', ${PORT}, block=True) except: - print('exiting before login...') - sys.exit(-1) + print('exiting...') + sys.exit(0) EOF \ No newline at end of file From 1ef1a9d42004194527f44eb94ea3b189b63987a1 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Sun, 8 Apr 2018 13:05:25 -0700 Subject: [PATCH 20/22] update code --- scripts/itchat_server | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/scripts/itchat_server b/scripts/itchat_server index c5e8793d..fcf94b02 100755 --- a/scripts/itchat_server +++ b/scripts/itchat_server @@ -28,21 +28,11 @@ cat << EOF | python3 import sys import itchat -loginSuccess = False - -def lc(): - loginSuccess = True - -def ec(): - itchat.logout() - sys.exit(1) - if __name__ == '__main__': try: - itchat.login(enableCmdQR=${QRCODE}, loginCallback=lc, exitCallback=ec) - if loginSuccess: - itchat.start_rpc_server('${HOST}', ${PORT}, block=True) + itchat.login(enableCmdQR=${QRCODE}) + itchat.start_rpc_server('${HOST}', ${PORT}, block=True) except: print('exiting...') sys.exit(0) From ee1dfa44c6a056d97290b60d4eec141e8d42cc66 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Wed, 11 Apr 2018 11:00:45 -0700 Subject: [PATCH 21/22] update --- scripts/itchat_server | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/itchat_server b/scripts/itchat_server index fcf94b02..38305e70 100755 --- a/scripts/itchat_server +++ b/scripts/itchat_server @@ -28,12 +28,15 @@ cat << EOF | python3 import sys import itchat +def quit(): + print('error, exiting...') + sys.exit(-1) if __name__ == '__main__': try: - itchat.login(enableCmdQR=${QRCODE}) + itchat.auto_login(enableCmdQR=${QRCODE}, hotReload=True, exitCallback=quit) itchat.start_rpc_server('${HOST}', ${PORT}, block=True) - except: + except KeyboardInterrupt: print('exiting...') sys.exit(0) EOF \ No newline at end of file From 55f3f6d584021e0e5b8c9780c7a87ccfea5c87d2 Mon Sep 17 00:00:00 2001 From: Wilson Wang Date: Thu, 12 Apr 2018 15:47:40 -0700 Subject: [PATCH 22/22] update readme --- README.md | 4 ++-- README.rst | 4 ++-- README_EN.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 50d523ef..3cceb963 100644 --- a/README.md +++ b/README.md @@ -246,7 +246,7 @@ itchat.logout() ```python import itchat -itchat.start_rpc_server(‘localhost’, 9000) +itchat.start_rpc_server('localhost', 9000) ``` 几乎所有的API都已经导出,细节请查看rpc.py文件 @@ -256,7 +256,7 @@ itchat.start_rpc_server(‘localhost’, 9000) ```python import xmlrpc.client -rpc = xmlrpc.client.ServerProxy("http://localhost:9000/") +rpc = xmlrpc.client.ServerProxy('http://localhost:9000/') rpc.get_friends() ``` diff --git a/README.rst b/README.rst index e4a47de6..a1180ac6 100644 --- a/README.rst +++ b/README.rst @@ -242,7 +242,7 @@ If you want to start RPC server, please use the command below. You can specify t .. code:: python import itchat - itchat.start_rpc_server(‘localhost’, 9000) + itchat.start_rpc_server('localhost', 9000) Almost all the APIs are exported for RPC use, please check rpc.py for detail @@ -251,7 +251,7 @@ Client side code: .. code:: python import xmlrpc.client - rpc = xmlrpc.client.ServerProxy("http://localhost:9000/") + rpc = xmlrpc.client.ServerProxy('http://localhost:9000/') rpc.get_friends() diff --git a/README_EN.md b/README_EN.md index 2b6a1e82..a38da6e8 100644 --- a/README_EN.md +++ b/README_EN.md @@ -244,7 +244,7 @@ If you want to start RPC server, please use the command below. You can specify t ```python import itchat -itchat.start_rpc_server(‘localhost’, 9000) +itchat.start_rpc_server('localhost', 9000) ``` Almost all the APIs are exported for RPC use, please check rpc.py for detail @@ -254,7 +254,7 @@ Client side code: ```python import xmlrpc.client -rpc = xmlrpc.client.ServerProxy("http://localhost:9000/") +rpc = xmlrpc.client.ServerProxy('http://localhost:9000/') rpc.get_friends() ```