def _wrap_result(result): result = ReturnValue(result.json()) if 'ip_list' in result: result['errcode'] = 0 for i, v in enumerate(result['ip_list']): result['ip_list'][i] = v[:v.rfind('/')] return result
def update_tag(id, name, accessToken=None): data = encode_send_dict({ 'tagid': id, 'tagname': name, }) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/tag/update?access_token=%s' % (COMPANY_URL, accessToken), data=data).json() return ReturnValue(r)
def _wrap_result(result): if 'application/json' in result.headers['Content-Type']: j = result.json() if 'news_item' in j or 'down_url' in j: j['errcode'] = 0 return ReturnValue(j) else: tempStorage = io.BytesIO() for block in result.iter_content(1024): tempStorage.write(block) return ReturnValue({'file': tempStorage, 'errcode': 0})
def set_head_image(openedFile, kfAccount, accessToken=None): try: r = requests.post('%s/customservice/kfaccount/uploadheadimg?' 'access_token=%s&kf_account=%s' % (SERVER_URL, accessToken, kfAccount), files={ 'file': openedFile }).json() return ReturnValue(r) except Exception as e: return ReturnValue({'errcode': -10001, 'errmsg': e.message})
def _wrap_result(result): result = ReturnValue(result.json()) if 'media_id' in result: result['errcode'] = 0 else: for k in result: if 'media_id' in k: result['media_id'] = result[k] result['errcode'] = 0 break return result
def reply_msg_format(msg): ''' turns string reply to reply dict * if format failed, it will return a ReturnValue equals to False * if succeeded, it will return a dict equals to string * string content will be filled in MediaId key ''' if isinstance(msg, dict): r = msg elif hasattr(msg, 'capitalize'): msgType, content = msg[1:4], msg[5:] r = {} if not re.match('@[a-z]{3}@', msg[:5]): r['MsgType'] = TEXT r['MediaId'] = msg elif msgType == 'msc': return ReturnValue({ 'errcode': -10003, 'errmsg': 'msg for type MUSIC should be: {"MsgType": MUSIC, ' + '"musicurl" :MUSICURL, "hqmusicurl" :HQMUSICURL, ' + '"thumb_media_id": MEDIA_ID}' }) elif msgType not in ('img', 'voc', 'vid', 'txt', 'nws', 'cad'): return ReturnValue({ 'errcode': -10003, 'errmsg': 'send supports: img, voc, vid, txt, nws, cad' }) elif msgType == 'txt': r['MsgType'] = TEXT r['MediaId'] = content elif msgType in ('nws', 'cad'): r['MsgType'] = NEWS if msgType == 'nws' else CARD try: r.update(json.loads(content)) except: logger.warning('content of %s is not a valid json' % r['MsgType']) else: r['MsgType'] = {'img': IMAGE, 'voc': VOICE, 'vid': VIDEO}[msgType] if os.path.isfile(content): r['FileDir'] = content else: r['MediaId'] = content else: r = ReturnValue({ 'errcode': -10003, 'errmsg': 'msg should be string or dict' }) if 'Content' in r and not 'MediaId' in r and r.get('MsgType') == TEXT: r['MediaId'] = r['Content'] return r
def clear_notify(ownerId, chatId=None, userId=None, accessToken=None): data = { 'op_user': ownerId, 'chat': { 'type': 'group' if chatId else 'single', 'id': chatId or userId, }} data = encode_send_dict(data) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/chat/clearnotify?access_token=%s' % (COMPANY_URL, accessToken), data=data).json() return ReturnValue(r)
def update_news(mediaId, newsDict, index=0, accessToken=None): data = { 'media_id': mediaId, 'mpnews': newsDict, } data = encode_send_dict(data) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/material/update_mpnews?access_token=%s' % (COMPANY_URL, accessToken), data=data).json() return ReturnValue(r)
def get_image_url(openedFile, accessToken=None): try: r = requests.post('%s/cgi-bin/media/uploadimg?access_token=%s' % (SERVER_URL, accessToken), files={ 'file': openedFile }).json() if 'url' in r: r['errcode'] = 0 return ReturnValue(r) except Exception as e: return ReturnValue({'errcode': -10001, 'errmsg': e.message})
def create_tag(name, id=None, accessToken=None): ''' create_tag * id is for qy only ''' data = encode_send_dict({'tag': {'name': name}}) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/tags/create?access_token=%s' % (SERVER_URL, accessToken), data=data).json() if 'tag' in r: r['errcode'] = 0 return ReturnValue(r)
def create_department(name, parentId=1, order=None, id=None, accessToken=None): data = { 'name': name, 'parentid': parentId, } if order is not None: data['order'] = order if id is not None: data['id'] = id data = encode_send_dict(data) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/department/create?access_token=%s' % (COMPANY_URL, accessToken), data=data).json() return ReturnValue(r)
def quit(chatId, opUserId, accessToken=None): data = { 'chatid': chatId, 'op_user': opUserId, } data = encode_send_dict(data) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/chat/quit?access_token=%s' % (COMPANY_URL, accessToken), data=data).json() return ReturnValue(r)
def send_some(msgType, mediaId, additionalDict={}, targetIdList=[], partyIdList=[], tagIdList=[], agentId=None, accessToken=None): msgDict = __form_send_dict(msgType, mediaId, additionalDict) if not msgDict: return msgDict if not isinstance(targetIdList, list) or len(targetIdList) < 2: return ReturnValue({'errcode': 40130}) msgDict['touser'] = targetIdList r = requests.post('%s/cgi-bin/message/mass/send?access_token=%s' % (SERVER_URL, accessToken), data=encode_send_dict(msgDict)).json() return ReturnValue(r)
def create_news(newsDict, permanent=False, accessToken=None): if permanent: url = '%s/cgi-bin/material/add_news?access_token=%s' else: url = '%s/cgi-bin/media/uploadnews?access_token=%s' try: r = requests.post(url % (SERVER_URL, accessToken), data=encode_send_dict(newsDict)).json() if 'media_id' in r: r['errcode'] = 0 return ReturnValue(r) except Exception as e: return ReturnValue({'errcode': -10001, 'errmsg': e.message})
def _batchget_material(fileType, offset, count, accessToken=None): if not fileType in (IMAGE, VOICE, VIDEO, THUMB): return ReturnValue({'errcode': 40004,}) if 20 < count: count = 20 try: r = requests.post('%s/cgi-bin/material/batchget_material?access_token=%s' % (SERVER_URL, accessToken), json={'type': fileType, 'offset': offset, 'count': count}).json() if 'total_count' in r: r['errcode'] = 0 return ReturnValue(r) except Exception as e: return ReturnValue({'errcode': -10001, 'errmsg': e.message})
def _download_qrcode(ticket): params = {'ticket': ticket} r = requests.get('https://mp.weixin.qq.com/cgi-bin/showqrcode', params=params, stream=True) if 'application/json' in r.headers['Content-Type']: r = ReturnValue(r.json()) else: tempStorage = io.BytesIO() for block in r.iter_content(1024): tempStorage.write(block) r = ReturnValue({'File': tempStorage, 'errcode': 0}) return r
def _send_some(msgType, mediaId, additionalDict, targetIdList, accessToken=None): msgDict = __form_send_dict(msgType, mediaId, additionalDict) if not msgDict: return msgDict if not isinstance(targetIdList, list) or len(targetIdList) < 2: return ReturnValue({'errcode': 40130}) msgDict['touser'] = targetIdList try: r = requests.post('%s/cgi-bin/message/mass/send?access_token=%s' % (SERVER_URL, accessToken), data=encode_send_dict(msgDict)).json() return ReturnValue(r) except Exception as e: return ReturnValue({'errcode': -10001, 'errmsg': e.message})
def set_mute(muteList=[], cancelList=[], accessToken=None): l = [] for status, userIdList in enumerate((cancelList, muteList)): for userId in userIdList: l.append({'userid': userId, 'status': status, }) data = {'user_mute_list': l} data = encode_send_dict(data) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/chat/setmute?access_token=%s' % (COMPANY_URL, accessToken), data=data).json() return ReturnValue(r)
def download(mediaId, accessToken=None): params = { 'access_token': accessToken, 'media_id': mediaId, } r = requests.get('%s/cgi-bin/media/get' % COMPANY_URL, stream=True) if 'application/json' in r.headers['Content-Type']: return ReturnValue(r.json()) else: tempStorage = io.BytesIO() for block in r.iter_content(1024): tempStorage.write(block) return ReturnValue({'file': tempStorage, 'errcode': 0})
def _send(msgType, mediaId, additionalDict, toUserId, accessToken=None): msgDict = __form_send_dict(msgType, mediaId, additionalDict) if not msgDict: return msgDict msgDict['touser'] = toUserId data = encode_send_dict(msgDict) if data is None: return ReturnValue({'errcode': -10001}) try: r = requests.post('%s/cgi-bin/message/custom/send?access_token=%s' % (SERVER_URL, accessToken), data=data).json() return ReturnValue(r) except Exception as e: return ReturnValue({'errcode': -10001, 'errmsg': e.message})
def add_users_into_tag(id, userIdList=None, partyList=None, accessToken=None): if not userIdList: return ReturnValue({ 'errcode': 40035, 'errmsg': 'must have one userId' }) data = encode_send_dict({'openid_list': userIdList, 'tagid': id}) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/tags/members/batchtagging?access_token=%s' % (SERVER_URL, accessToken), data=data).json() return ReturnValue(r)
def create_qrcode(sceneData, expire=2592000): ''' create qrcode with specific data * qrcode can be perment, if so you need to set expire to False * sceneData can be string or integer if it's perment * but it can only be integer if it's not ''' data = {'action_info': {'scene': {}}} try: expire = int(expire) except ValueError: return ReturnValue({ 'errcode': -10003, 'errmsg': 'expire should be int' }) if not (isinstance(sceneData, int) or hasattr(sceneData, 'capitalize')): return ReturnValue({ 'errcode': -10003, 'errmsg': 'sceneData should be int or string' }) if expire: if not isinstance(sceneData, int): return ReturnValue({ 'errcode': -10003, 'errmsg': 'sceneData for tmp qrcode can only be int' }) if not 0 < expire < 2592000: expire = 2592000 data['expire_seconds'] = expire data['action_name'] = 'QR_SCENE' data['action_info']['scene']['scene_id'] = sceneData else: if isinstance(sceneData, int): data['action_name'] = 'QR_LIMIT_SCENE' data['action_info']['scene']['scene_id'] = sceneData else: data['action_name'] = 'QR_LIMIT_STR_SCENE' data['action_info']['scene']['scene_str'] = sceneData @retry(n=3, waitTime=3) @access_token def _create_qrcode(data, accessToken=None): data = encode_send_dict(data) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/qrcode/create?access_token=%s' % (SERVER_URL, accessToken), data=data).json() if 'ticket' in r: r['errcode'] = 0 return ReturnValue(r) return _create_qrcode(data)
def download_qrcode(ticket): params = {'ticket': ticket} r = requests.get('https://mp.weixin.qq.com/cgi-bin/showqrcode', params=params, stream=True) if 'application/json' in r.headers['Content-Type']: return ReturnValue(r.json()) else: tempStorage = io.BytesIO() for block in r.iter_content(1024): tempStorage.write(block) return ReturnValue({'file': tempStorage, 'errcode': 0})
def upload(fileType, fileDir, additionalDict={}, permanent=False, accessToken=None): if additionalDict: # format additionalDict for key in ('description',): if key in additionalDict and isinstance(additionalDict[key], dict): for k, v in additionalDict[key].items(): if k not in additionalDict: additionalDict[k] = v additionalDict = {k.lower().replace('_', ''): v for k, v in additionalDict.items()} if 'introduction' in additionalDict: additionalDict['description'] = additionalDict['introduction'] if not fileType in (IMAGE, VOICE, VIDEO, THUMB): return ReturnValue({'errcode': 40004,}) elif fileType == VIDEO and permanent and not ('title' in additionalDict and 'description' in additionalDict): return ReturnValue({'errcode': -10003, 'errmsg': 'additionalDict for type VIDEO should be: ' + "{'Title' : 'title', 'Description' :'des'}"}) try: with open(fileDir, 'rb') as f: file_ = f.read() except: return ReturnValue({'errcode': -10004,}) fileName = 'file' + os.path.splitext(fileDir)[1] if hasattr(fileName, 'decode'): fileName = fileName.decode('utf8', 'replace') fileMime = mimetypes.guess_type(fileName)[0] or 'application/octet-stream' if permanent: url = '%s/cgi-bin/material/add_material?access_token=%s&type=%s' else: url = '%s/cgi-bin/media/upload?access_token=%s&type=%s' files = {'media': (fileName, file_, fileMime), } if fileType == VIDEO and permanent: files['description'] = (None, encode_send_dict({ 'title': additionalDict['title'], 'introduction': additionalDict['description'], } ), 'application/json') r = requests.post(url % (SERVER_URL, accessToken, fileType), files=files) def _wrap_result(result): result = ReturnValue(result.json()) if 'media_id' in result: result['errcode'] = 0 else: for k in result: if 'media_id' in k: result['media_id'] = result[k] result['errcode'] = 0 break return result r._wrap_result = _wrap_result return r
def send(msgType, mediaId, additionalDict={}, senderId=None, userId=None, chatId=None, accessToken=None): msgDict = __form_send_dict(msgType, mediaId, additionalDict) if not msgDict: return msgDict msgDict['receiver'] = { 'type': 'single' if userId else 'group', 'id': userId or chatId, } msgDict['sender'] = senderId data = encode_send_dict(msgDict) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/chat/send?access_token=%s' % (COMPANY_URL, accessToken), data=data).json() return ReturnValue(r)
def batchget_material(fileType, offset=0, count=20, accessToken=None): if not fileType in (IMAGE, VOICE, VIDEO, THUMB): return ReturnValue({'errcode': 40004,}) if 20 < count: count = 20 data = {'type': fileType, 'offset': offset, 'count': count, } data = encode_send_dict(data) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/material/batchget?access_token=%s' % (SERVER_URL, accessToken), data=data).json() if 'total_count' in r: r['errcode'] = 0 return ReturnValue(r)
def send_all(msgType, mediaId, additionalDict={}, tagId=None, accessToken=None): msgDict = __form_send_dict(msgType, mediaId, additionalDict) if not msgDict: return msgDict msgDict['touser'] = '******' msgDict['toparty'] = '@all' msgDict['totag'] = '@all' msgDict['agentid'] = agentId msgDict['safe'] = 0 data = encode_send_dict(msgDict) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/message/send?access_token=%s' % (COMPANY_URL, accessToken), data=data).json() return ReturnValue(r)
def user_id_open_id_switch(userId=None, openId=None, agentId=None, accessToken=None): data = {} if userId: data['userid'] = userId if agentId: data['agentid'] = agentId url = '%s/cgi-bin/user/convert_to_openid?access_token=' + accessToken elif openId: data['openid'] = openId url = '%s/cgi-bin/user/convert_to_userid?access_token=' + accessToken data = encode_send_dict(data) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post(url % COMPANY_URL, data=data).json() return ReturnValue(r)
def addconditional(menuDict, accessToken=None): if not ('button' in menuDict and 'matchrule' in menuDict): return ReturnValue({'errcode': 40035}) data = encode_send_dict(menuDict) if data is None: return ReturnValue({'errcode': -10001}) r = requests.post('%s/cgi-bin/menu/addconditional?access_token=%s' % ( SERVER_URL, accessToken), data=data) def _wrap_result(result): result = ReturnValue(result.json()) if 'menuid' in result: result['errcode'] = 0 return result r._wrap_result = _wrap_result return r
def get_users(nextOpenId='', departmentId=None, fetchChild=False, status=4, accessToken=None): ''' get users of the department * nextOpenId is for mp api ''' if departmentId is None: return ReturnValue({'errcode': 40035, 'errmsg': 'departmentId must be set',}) params = { 'access_token' : accessToken, 'department_id' : departmentId, 'fetch_child' : int(fetchChild), 'status' : status, } r = requests.get('%s/cgi-bin/user/simplelist' % SERVER_URL, params=params).json() return ReturnValue(r)
def download(mediaId, accessToken=None): try: r = requests.get('%s/cgi-bin/media/get?access_token=%s&media_id=%s' % (SERVER_URL, accessToken, mediaId), stream=True) if 'application/json' in r.headers['Content-Type']: return ReturnValue(r.json()) else: tempStorage = io.BytesIO() for block in r.iter_content(1024): tempStorage.write(block) return ReturnValue({'file': tempStorage, 'errcode': 0}) except Exception as e: return ReturnValue({'errcode': -10001, 'errmsg': e.message})
def reply_msg_format(msg): ''' turns string reply to reply dict * if format failed, it will return a ReturnValue equals to False * if succeeded, it will return a dict equals to string ''' if isinstance(msg, dict): r = msg elif hasattr(msg, 'capitalize'): msgType, content, fileDir = msg[:5], msg[5:], None if not re.match('@[a-z]{3}@', msgType): content = msgType + content msgType = TEXT elif msgType[1:4] == 'msc': return ReturnValue({ 'errcode': -10003, 'errmsg': 'msg for type MUSIC should be: {"msgType": MUSIC, ' + '"musicurl" :MUSICURL, "hqmusicurl" :HQMUSICURL, ' + '"thumb_media_id": MEDIA_ID}' }) elif msgType[1:4] not in ('img', 'voc', 'vid', 'txt', 'nws', 'cad'): return ReturnValue({ 'errcode': -10003, 'errmsg': 'send supports: img, voc, vid, txt, nws, cad' }) else: msgType = { 'img': IMAGE, 'voc': VOICE, 'vid': VIDEO, 'txt': TEXT, 'nws': NEWS, 'cad': CARD }[msgType[1:4]] fileDir = content r = {'MsgType': msgType, 'MediaId': content} if fileDir: r['FileDir'] = fileDir else: r = ReturnValue({ 'errcode': -10003, 'errmsg': 'msg should be string or dict' }) if r and r.get('MsgType') == TEXT: if 'MediaId' not in r and 'Content' in r: r['MediaId'] = r['Content'] elif 'MediaId' in r and 'Content' not in r: r['Content'] = r['MediaId'] return r
def reply_msg_format(msg): ''' turns string reply to reply dict * if format failed, it will return a ReturnValue equals to False * if succeeded, it will return a dict equals to string * string content will be filled in MediaId key ''' if isinstance(msg, dict): r = msg elif hasattr(msg, 'capitalize'): msgType, content = msg[1:4], msg[5:] r = {} if not re.match('@[a-z]{3}@', msg[:5]): r['MsgType'] = TEXT r['MediaId'] = msg elif msgType == 'msc': return ReturnValue({'errcode': -10003, 'errmsg': 'msg for type MUSIC should be: {"MsgType": MUSIC, ' + '"musicurl" :MUSICURL, "hqmusicurl" :HQMUSICURL, ' + '"thumb_media_id": MEDIA_ID}'}) elif msgType not in ('img', 'voc', 'vid', 'txt', 'nws', 'cad'): return ReturnValue({'errcode': -10003, 'errmsg': 'send supports: img, voc, vid, txt, nws, cad'}) elif msgType == 'txt': r['MsgType'] = TEXT r['MediaId'] = content elif msgType in ('nws', 'cad'): r['MsgType'] = NEWS if msgType == 'nws' else CARD try: r.update(json.loads(content)) except: logger.warning('content of %s is not a valid json' % r['MsgType']) else: r['MsgType'] = {'img': IMAGE, 'voc': VOICE, 'vid': VIDEO}[msgType] if os.path.isfile(content): r['FileDir'] = content else: r['MediaId'] = content else: r = ReturnValue({'errcode': -10003, 'errmsg': 'msg should be string or dict'}) if 'Content' in r and not 'MediaId' in r and r.get('MsgType') == TEXT: r['MediaId'] = r['Content'] return r
def _wrap_result(result): result = ReturnValue(result.json()) if 'selfmenu_info' in result: result['errcode'] = 0 return result
def _wrap_result(result): result = ReturnValue(result.json()) if 'total_count' in result: result['errcode'] = 0 return result
def _wrap_result(result): result = ReturnValue(result.json()) if 'is_autoreply_open' in result: result['errcode'] = 0 return result
def _wrap_result(result): result = ReturnValue(result.json()) if 'menuid' in result: result['errcode'] = 0 return result
def _wrap_result(result): result = ReturnValue(result.json()) if 'kf_list' in result: result['errcode'] = 0 return result