def uploadimg(self, media_file=None, media_file_path=None, appid=None, secret=None, token=None, storage=None, forcard=False): media_file = media_file or open(media_file_path, 'rb') files = { 'buffer': media_file, } if forcard else { 'media': media_file, } return self.post( self.WECHAT_MEDIA_UPLOADIMG, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, files=files, )
def get_blacks(self, appid=None, secret=None, token=None, storage=None, begin_openid=''): """ { "total": 2, "count": 2, "data": { "openid": ["OPENID1", "OPENID2"] }, "next_openid": "NEXT_OPENID" } """ return self.post( self.WECHAT_TAGS_MEMBERS_GETBLACKLIST. format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'begin_openid': begin_openid, }, )
def send_wxa_subscribe_template_message(self, user_id, template_id, data, page=None, miniprogram_state=None, lang=None, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_SEND_WXA_SUBSCRIBE_TEMPLATE_MESSAGE, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data={ 'touser': user_id, 'template_id': template_id, 'page': page, 'miniprogram_state': miniprogram_state, 'lang': lang, 'data': data, }, )
def update(self, data, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_CARD_UPDATE.format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data=data, )
def get_tag_users(self, tagid, appid=None, secret=None, token=None, storage=None, next_openid=''): """ { "count": 2, "data": { "openid": ["OPENID1", "OPENID2"] }, "next_openid": "NEXT_OPENID" } """ return self.post( self.WECHAT_USER_TAG_GET.format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'tagid': tagid, 'next_openid': next_openid, }, )
def get_wxa_code(self, path, width=430, auto_color=False, line_color={ 'r': '0', 'g': '0', 'b': '0' }, is_hyaline=False, appid=None, secret=None, token=None, storage=None, res_to_base64=True, data_uri_scheme=True): res = self.post( self.GET_WXA_CODE.format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'path': path, 'width': width, 'auto_color': auto_color, 'line_color': line_color, 'is_hyaline': is_hyaline, }, res_to_json=False) if not res_to_base64: return res return '{0}{1}'.format( 'data:image/{0};base64,'.format( res.headers.get('Content-Type', '').split('/')[-1] or 'jpeg') if data_uri_scheme else '', base64.b64encode(res.content))
def batchget_user_info(self, users, appid=None, secret=None, token=None, storage=None): """ { "user_list": [ { "openid": "otvxTs4dckWG7imySrJd6jSi0CWE", "lang": "zh_CN" }, { "openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg", "lang": "zh_CN" } ] } """ return self.post( self.WECHAT_USER_INFO_BATCHGET. format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'user_list': users, }, )
def tags_get(self, appid=None, secret=None, token=None, storage=None): return self.get(self.WECHAT_TAGS_GET, access_token=final_access_token(self, appid=appid, secret=secret, token=token, storage=storage))
def create(self, action_name='QR_SCENE', scene_id=0, scene_str='', expire_seconds=2592000, appid=None, secret=None, token=None, storage=None, qrurl=False, qrdata=False, useurl=False): """ ``action_name`` 二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值 ``scene_id``场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000) ``scene_str``场景值ID(字符串形式的ID),字符串类型,长度限制为1到64 ``expire_seconds`` 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 """ if action_name == 'QR_SCENE': data = { 'expire_seconds': expire_seconds, 'action_name': action_name, 'action_info': { 'scene': { 'scene_id': scene_id } } } elif action_name == 'QR_STR_SCENE': data = { 'expire_seconds': expire_seconds, 'action_name': action_name, 'action_info': { 'scene': { 'scene_str': scene_str } } } elif action_name == 'QR_LIMIT_SCENE': data = { 'action_name': action_name, 'action_info': { 'scene': { 'scene_id': scene_id } } } elif action_name == 'QR_LIMIT_STR_SCENE': data = { 'action_name': action_name, 'action_info': { 'scene': { 'scene_str': scene_str } } } qrinfo = self.post( self.WECHAT_QRCODE_CREATE, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data=data ) if 'ticket' not in qrinfo: return qrinfo if qrurl: return qrinfo.get('url') if useurl else self.showurl(qrinfo.get('ticket')) if qrdata: return self.download(qrinfo.get('ticket')) return qrinfo
def upload(self, media_type='image', media_file=None, media_file_path=None, appid=None, secret=None, token=None, storage=None): """ :param media_type: 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) :param media_file: 要上传的文件,一个 File-object """ return self.post( self.WECHAT_MEDIA_UPLOAD, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), 'type': media_type, }, files={ 'media': media_file or open(media_file_path, 'rb'), }, )
def add_conditional(self, menus, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_MENU_ADDCONDITIONAL, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data=menus, )
def create_menu(self, menus, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_MENU_CREATE, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data=menus, )
def get_all_users(self, appid=None, secret=None, token=None, storage=None, users_func=None, authorizer_appid=None): goon = True next_openid = '' while goon: get_user_infos = self.get(self.WECHAT_USER_GET, access_token=final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), next_openid=next_openid) if users_func: users_func(authorizer_appid, get_user_infos) if get_user_infos.get('count') < 10000: goon = False next_openid = get_user_infos.get('next_openid', '')
def try_match(self, user_id, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_MENU_TRYMATCH, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data={ 'user_id': user_id, }, )
def del_conditional(self, menuid, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_MENU_DELCONDITIONAL, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data={ 'menuid': menuid, }, )
def send_custom_message(self, data, account=None, appid=None, secret=None, token=None, storage=None): if account: data['customservice'] = {'kf_account': account} return self.post( self.WECHAT_CUSTOM_MESSAGE_SEND, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data=data, )
def custom_typing(self, openid=None, typing=True, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_CUSTOM_TYPING, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data={ 'touser': openid, 'command': 'Typing' if typing else 'CancelTyping', }, )
def upload_headimg(self, kf_account, media_file=None, media_file_path=None, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_CUSTOM_DEL_KFACCOUNT, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), 'kf_account': kf_account, }, files={ 'media': media_file or open(media_file_path, 'rb'), }, )
def get_users(self, appid=None, secret=None, token=None, storage=None, next_openid=''): """ { "total": 2, "count": 2, "data": { "openid": ["OPENID1", "OPENID2"] }, "next_openid": "NEXT_OPENID" } """ return self.get(self.WECHAT_USER_GET, access_token=final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), next_openid=next_openid)
def del_kfaccount(self, kf_account, nickname, password, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_CUSTOM_DEL_KFACCOUNT, params={ 'access_token': final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), }, data={ 'kf_account': kf_account, 'nickname': nickname, 'password': password, }, )
def tags_getidlist(self, openid, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_TAGS_GETIDLIST.format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'openid': openid, }, )
def mambers_batchunblacklist(self, openids, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_TAGS_MEMBERS_BATCHUNBLACKLIST. format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'openid_list': openids, }, )
def downloadurl(self, media_id, hd=False, appid=None, secret=None, token=None, storage=None): return self.geturl( self.WECHAT_MEDIA_GET_JSSDK if hd else self.WECHAT_MEDIA_GET, access_token=final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), media_id=media_id)
def msg_sec_check(self, content, appid=None, secret=None, token=None, storage=None, res_bool_val=False): res = self.post( self.WECHAT_MSG_SEC_CHECK.format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'content': content, }, ) return res.get('errcode') == 0 if res_bool_val else res
def tags_delete(self, tagid, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_TAGS_DELETE.format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'tag': { 'id': tagid, }, }, )
def img_sec_check(self, media_file=None, media_file_path=None, appid=None, secret=None, token=None, storage=None, res_bool_val=False): res = self.post( self.WECHAT_IMG_SEC_CHECK.format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), files={ 'media': media_file or open(media_file_path, 'rb'), }, ) return res.get('errcode') == 0 if res_bool_val else res
def members_batchuntagging(self, tagid, openids, appid=None, secret=None, token=None, storage=None): return self.post( self.WECHAT_TAGS_MEMBERS_BATCHUNTAGGING. format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'tagid': tagid, 'openids': openids, }, )
def test_token_mem(self): appid = WECHAT.get('JSAPI', {}).get('appID') appsecret = WECHAT.get('JSAPI', {}).get('appsecret') token = Token(appid=appid, secret=appsecret) access_token1 = token.access_token() assert isinstance(access_token1, basestring) access_token2 = access_token(appid=appid, secret=appsecret) assert isinstance(access_token2, basestring) access_token3 = final_access_token(cls=token, appid=appid, secret=appsecret) assert isinstance(access_token3, basestring) assert access_token1 == access_token3 != access_token2
def get_user_info(self, openid, lang='zh_CN', appid=None, secret=None, token=None, storage=None): """ :param lang: 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 """ return self.get(self.WECHAT_USER_INFO, access_token=final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), openid=openid, lang=lang)
def tags_create(self, name, appid=None, secret=None, token=None, storage=None): """ :param name: 标签名(30个字符以内) """ return self.post( self.WECHAT_TAGS_CREATE.format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'tag': { 'name': name[:30], }, }, )
def media_check_async(self, media_url=None, media_type=None, appid=None, secret=None, token=None, storage=None, res_bool_val=False): res = self.post( self.WECHAT_MEDIA_CHECK_ASYNC. format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'media_url': media_url, 'media_type': media_type, }, ) return res.get('errcode') == 0 if res_bool_val else res
def update_remark(self, openid, remark, appid=None, secret=None, token=None, storage=None): """ :param remark: 新的备注名,长度必须小于30字符 """ return self.post( self.WECHAT_USER_INFO_UPDATE_REMARK. format(access_token=final_access_token( self, appid=appid, secret=secret, token=token, storage=storage)), data={ 'openid': openid, 'remark': remark[:30], }, )
def downloadurl(self, media_id, hd=False, appid=None, secret=None, token=None, storage=None): return self.geturl(self.WECHAT_MEDIA_GET_JSSDK if hd else self.WECHAT_MEDIA_GET, access_token=final_access_token(self, appid=appid, secret=secret, token=token, storage=storage), media_id=media_id)