Spaces:
Runtime error
Runtime error
import requests | |
from . import storage | |
class Core(object): | |
def __init__(self): | |
''' init is the only method defined in core.py | |
alive is value showing whether core is running | |
- you should call logout method to change it | |
- after logout, a core object can login again | |
storageClass only uses basic python types | |
- so for advanced uses, inherit it yourself | |
receivingRetryCount is for receiving loop retry | |
- it's 5 now, but actually even 1 is enough | |
- failing is failing | |
''' | |
self.alive, self.isLogging = False, False | |
self.storageClass = storage.Storage(self) | |
self.memberList = self.storageClass.memberList | |
self.mpList = self.storageClass.mpList | |
self.chatroomList = self.storageClass.chatroomList | |
self.msgList = self.storageClass.msgList | |
self.loginInfo = {} | |
self.s = requests.Session() | |
self.uuid = None | |
self.functionDict = {'FriendChat': {}, 'GroupChat': {}, 'MpChat': {}} | |
self.useHotReload, self.hotReloadDir = False, 'itchat.pkl' | |
self.receivingRetryCount = 5 | |
def login(self, enableCmdQR=False, picDir=None, qrCallback=None, | |
loginCallback=None, exitCallback=None): | |
''' log in like web wechat does | |
for log in | |
- a QR code will be downloaded and opened | |
- then scanning status is logged, it paused for you confirm | |
- finally it logged in and show your nickName | |
for options | |
- enableCmdQR: show qrcode in command line | |
- integers can be used to fit strange char length | |
- picDir: place for storing qrcode | |
- qrCallback: method that should accept uuid, status, qrcode | |
- loginCallback: callback after successfully logged in | |
- if not set, screen is cleared and qrcode is deleted | |
- exitCallback: callback after logged out | |
- it contains calling of logout | |
for usage | |
..code::python | |
import itchat | |
itchat.login() | |
it is defined in components/login.py | |
and of course every single move in login can be called outside | |
- you may scan source code to see how | |
- and modified according to your own demand | |
''' | |
raise NotImplementedError() | |
def get_QRuuid(self): | |
''' get uuid for qrcode | |
uuid is the symbol of qrcode | |
- for logging in, you need to get a uuid first | |
- for downloading qrcode, you need to pass uuid to it | |
- for checking login status, uuid is also required | |
if uuid has timed out, just get another | |
it is defined in components/login.py | |
''' | |
raise NotImplementedError() | |
def get_QR(self, uuid=None, enableCmdQR=False, picDir=None, qrCallback=None): | |
''' download and show qrcode | |
for options | |
- uuid: if uuid is not set, latest uuid you fetched will be used | |
- enableCmdQR: show qrcode in cmd | |
- picDir: where to store qrcode | |
- qrCallback: method that should accept uuid, status, qrcode | |
it is defined in components/login.py | |
''' | |
raise NotImplementedError() | |
def check_login(self, uuid=None): | |
''' check login status | |
for options: | |
- uuid: if uuid is not set, latest uuid you fetched will be used | |
for return values: | |
- a string will be returned | |
- for meaning of return values | |
- 200: log in successfully | |
- 201: waiting for press confirm | |
- 408: uuid timed out | |
- 0 : unknown error | |
for processing: | |
- syncUrl and fileUrl is set | |
- BaseRequest is set | |
blocks until reaches any of above status | |
it is defined in components/login.py | |
''' | |
raise NotImplementedError() | |
def web_init(self): | |
''' get info necessary for initializing | |
for processing: | |
- own account info is set | |
- inviteStartCount is set | |
- syncKey is set | |
- part of contact is fetched | |
it is defined in components/login.py | |
''' | |
raise NotImplementedError() | |
def show_mobile_login(self): | |
''' show web wechat login sign | |
the sign is on the top of mobile phone wechat | |
sign will be added after sometime even without calling this function | |
it is defined in components/login.py | |
''' | |
raise NotImplementedError() | |
def start_receiving(self, exitCallback=None, getReceivingFnOnly=False): | |
''' open a thread for heart loop and receiving messages | |
for options: | |
- exitCallback: callback after logged out | |
- it contains calling of logout | |
- getReceivingFnOnly: if True thread will not be created and started. Instead, receive fn will be returned. | |
for processing: | |
- messages: msgs are formatted and passed on to registered fns | |
- contact : chatrooms are updated when related info is received | |
it is defined in components/login.py | |
''' | |
raise NotImplementedError() | |
def get_msg(self): | |
''' fetch messages | |
for fetching | |
- method blocks for sometime until | |
- new messages are to be received | |
- or anytime they like | |
- synckey is updated with returned synccheckkey | |
it is defined in components/login.py | |
''' | |
raise NotImplementedError() | |
def logout(self): | |
''' logout | |
if core is now alive | |
logout will tell wechat backstage to logout | |
and core gets ready for another login | |
it is defined in components/login.py | |
''' | |
raise NotImplementedError() | |
def update_chatroom(self, userName, detailedMember=False): | |
''' update chatroom | |
for chatroom contact | |
- a chatroom contact need updating to be detailed | |
- detailed means members, encryid, etc | |
- auto updating of heart loop is a more detailed updating | |
- member uin will also be filled | |
- once called, updated info will be stored | |
for options | |
- userName: 'UserName' key of chatroom or a list of it | |
- detailedMember: whether to get members of contact | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def update_friend(self, userName): | |
''' update chatroom | |
for friend contact | |
- once called, updated info will be stored | |
for options | |
- userName: 'UserName' key of a friend or a list of it | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def get_contact(self, update=False): | |
''' fetch part of contact | |
for part | |
- all the massive platforms and friends are fetched | |
- if update, only starred chatrooms are fetched | |
for options | |
- update: if not set, local value will be returned | |
for results | |
- chatroomList will be returned | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def get_friends(self, update=False): | |
''' fetch friends list | |
for options | |
- update: if not set, local value will be returned | |
for results | |
- a list of friends' info dicts will be returned | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def get_chatrooms(self, update=False, contactOnly=False): | |
''' fetch chatrooms list | |
for options | |
- update: if not set, local value will be returned | |
- contactOnly: if set, only starred chatrooms will be returned | |
for results | |
- a list of chatrooms' info dicts will be returned | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def get_mps(self, update=False): | |
''' fetch massive platforms list | |
for options | |
- update: if not set, local value will be returned | |
for results | |
- a list of platforms' info dicts will be returned | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def set_alias(self, userName, alias): | |
''' set alias for a friend | |
for options | |
- userName: 'UserName' key of info dict | |
- alias: new alias | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def set_pinned(self, userName, isPinned=True): | |
''' set pinned for a friend or a chatroom | |
for options | |
- userName: 'UserName' key of info dict | |
- isPinned: whether to pin | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def accept_friend(self, userName, v4,autoUpdate=True): | |
''' accept a friend or accept a friend | |
for options | |
- userName: 'UserName' for friend's info dict | |
- status: | |
- for adding status should be 2 | |
- for accepting status should be 3 | |
- ticket: greeting message | |
- userInfo: friend's other info for adding into local storage | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def get_head_img(self, userName=None, chatroomUserName=None, picDir=None): | |
''' place for docs | |
for options | |
- if you want to get chatroom header: only set chatroomUserName | |
- if you want to get friend header: only set userName | |
- if you want to get chatroom member header: set both | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def create_chatroom(self, memberList, topic=''): | |
''' create a chatroom | |
for creating | |
- its calling frequency is strictly limited | |
for options | |
- memberList: list of member info dict | |
- topic: topic of new chatroom | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def set_chatroom_name(self, chatroomUserName, name): | |
''' set chatroom name | |
for setting | |
- it makes an updating of chatroom | |
- which means detailed info will be returned in heart loop | |
for options | |
- chatroomUserName: 'UserName' key of chatroom info dict | |
- name: new chatroom name | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def delete_member_from_chatroom(self, chatroomUserName, memberList): | |
''' deletes members from chatroom | |
for deleting | |
- you can't delete yourself | |
- if so, no one will be deleted | |
- strict-limited frequency | |
for options | |
- chatroomUserName: 'UserName' key of chatroom info dict | |
- memberList: list of members' info dict | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def add_member_into_chatroom(self, chatroomUserName, memberList, | |
useInvitation=False): | |
''' add members into chatroom | |
for adding | |
- you can't add yourself or member already in chatroom | |
- if so, no one will be added | |
- if member will over 40 after adding, invitation must be used | |
- strict-limited frequency | |
for options | |
- chatroomUserName: 'UserName' key of chatroom info dict | |
- memberList: list of members' info dict | |
- useInvitation: if invitation is not required, set this to use | |
it is defined in components/contact.py | |
''' | |
raise NotImplementedError() | |
def send_raw_msg(self, msgType, content, toUserName): | |
''' many messages are sent in a common way | |
for demo | |
.. code:: python | |
@itchat.msg_register(itchat.content.CARD) | |
def reply(msg): | |
itchat.send_raw_msg(msg['MsgType'], msg['Content'], msg['FromUserName']) | |
there are some little tricks here, you may discover them yourself | |
but remember they are tricks | |
it is defined in components/messages.py | |
''' | |
raise NotImplementedError() | |
def send_msg(self, msg='Test Message', toUserName=None): | |
''' send plain text message | |
for options | |
- msg: should be unicode if there's non-ascii words in msg | |
- toUserName: 'UserName' key of friend dict | |
it is defined in components/messages.py | |
''' | |
raise NotImplementedError() | |
def upload_file(self, fileDir, isPicture=False, isVideo=False, | |
toUserName='filehelper', file_=None, preparedFile=None): | |
''' upload file to server and get mediaId | |
for options | |
- fileDir: dir for file ready for upload | |
- isPicture: whether file is a picture | |
- isVideo: whether file is a video | |
for return values | |
will return a ReturnValue | |
if succeeded, mediaId is in r['MediaId'] | |
it is defined in components/messages.py | |
''' | |
raise NotImplementedError() | |
def send_file(self, fileDir, toUserName=None, mediaId=None, file_=None): | |
''' send attachment | |
for options | |
- fileDir: dir for file ready for upload | |
- mediaId: mediaId for file. | |
- if set, file will not be uploaded twice | |
- toUserName: 'UserName' key of friend dict | |
it is defined in components/messages.py | |
''' | |
raise NotImplementedError() | |
def send_image(self, fileDir=None, toUserName=None, mediaId=None, file_=None): | |
''' send image | |
for options | |
- fileDir: dir for file ready for upload | |
- if it's a gif, name it like 'xx.gif' | |
- mediaId: mediaId for file. | |
- if set, file will not be uploaded twice | |
- toUserName: 'UserName' key of friend dict | |
it is defined in components/messages.py | |
''' | |
raise NotImplementedError() | |
def send_video(self, fileDir=None, toUserName=None, mediaId=None, file_=None): | |
''' send video | |
for options | |
- fileDir: dir for file ready for upload | |
- if mediaId is set, it's unnecessary to set fileDir | |
- mediaId: mediaId for file. | |
- if set, file will not be uploaded twice | |
- toUserName: 'UserName' key of friend dict | |
it is defined in components/messages.py | |
''' | |
raise NotImplementedError() | |
def send(self, msg, toUserName=None, mediaId=None): | |
''' wrapped function for all the sending functions | |
for options | |
- msg: message starts with different string indicates different type | |
- list of type string: ['@fil@', '@img@', '@msg@', '@vid@'] | |
- they are for file, image, plain text, video | |
- if none of them matches, it will be sent like plain text | |
- toUserName: 'UserName' key of friend dict | |
- mediaId: if set, uploading will not be repeated | |
it is defined in components/messages.py | |
''' | |
raise NotImplementedError() | |
def revoke(self, msgId, toUserName, localId=None): | |
''' revoke message with its and msgId | |
for options | |
- msgId: message Id on server | |
- toUserName: 'UserName' key of friend dict | |
- localId: message Id at local (optional) | |
it is defined in components/messages.py | |
''' | |
raise NotImplementedError() | |
def dump_login_status(self, fileDir=None): | |
''' dump login status to a specific file | |
for option | |
- fileDir: dir for dumping login status | |
it is defined in components/hotreload.py | |
''' | |
raise NotImplementedError() | |
def load_login_status(self, fileDir, | |
loginCallback=None, exitCallback=None): | |
''' load login status from a specific file | |
for option | |
- fileDir: file for loading login status | |
- loginCallback: callback after successfully logged in | |
- if not set, screen is cleared and qrcode is deleted | |
- exitCallback: callback after logged out | |
- it contains calling of logout | |
it is defined in components/hotreload.py | |
''' | |
raise NotImplementedError() | |
def auto_login(self, hotReload=False, statusStorageDir='itchat.pkl', | |
enableCmdQR=False, picDir=None, qrCallback=None, | |
loginCallback=None, exitCallback=None): | |
''' log in like web wechat does | |
for log in | |
- a QR code will be downloaded and opened | |
- then scanning status is logged, it paused for you confirm | |
- finally it logged in and show your nickName | |
for options | |
- hotReload: enable hot reload | |
- statusStorageDir: dir for storing log in status | |
- enableCmdQR: show qrcode in command line | |
- integers can be used to fit strange char length | |
- picDir: place for storing qrcode | |
- loginCallback: callback after successfully logged in | |
- if not set, screen is cleared and qrcode is deleted | |
- exitCallback: callback after logged out | |
- it contains calling of logout | |
- qrCallback: method that should accept uuid, status, qrcode | |
for usage | |
..code::python | |
import itchat | |
itchat.auto_login() | |
it is defined in components/register.py | |
and of course every single move in login can be called outside | |
- you may scan source code to see how | |
- and modified according to your own demond | |
''' | |
raise NotImplementedError() | |
def configured_reply(self): | |
''' determine the type of message and reply if its method is defined | |
however, I use a strange way to determine whether a msg is from massive platform | |
I haven't found a better solution here | |
The main problem I'm worrying about is the mismatching of new friends added on phone | |
If you have any good idea, pleeeease report an issue. I will be more than grateful. | |
''' | |
raise NotImplementedError() | |
def msg_register(self, msgType, | |
isFriendChat=False, isGroupChat=False, isMpChat=False): | |
''' a decorator constructor | |
return a specific decorator based on information given | |
''' | |
raise NotImplementedError() | |
def run(self, debug=True, blockThread=True): | |
''' start auto respond | |
for option | |
- debug: if set, debug info will be shown on screen | |
it is defined in components/register.py | |
''' | |
raise NotImplementedError() | |
def search_friends(self, name=None, userName=None, remarkName=None, nickName=None, | |
wechatAccount=None): | |
return self.storageClass.search_friends(name, userName, remarkName, | |
nickName, wechatAccount) | |
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) | |