def test_get_group(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.get_groups() # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.get_groups() self.assertEqual(resp['groups'][0]['id'], 0) self.assertEqual(resp['groups'][0]['name'], '未分组') self.assertEqual(resp['groups'][0]['count'], 72596) self.assertEqual(resp['groups'][1]['id'], 1) self.assertEqual(resp['groups'][1]['name'], '黑名单') self.assertEqual(resp['groups'][1]['count'], 36) self.assertEqual(resp['groups'][2]['id'], 2) self.assertEqual(resp['groups'][2]['name'], '星标组') self.assertEqual(resp['groups'][2]['count'], 8) self.assertEqual(resp['groups'][3]['id'], 104) self.assertEqual(resp['groups'][3]['name'], '华东媒') self.assertEqual(resp['groups'][3]['count'], 4) self.assertEqual(resp['groups'][4]['id'], 106) self.assertEqual(resp['groups'][4]['name'], '★不测试组★') self.assertEqual(resp['groups'][4]['count'], 1)
def init_wechat_sdk(): """初始化微信 SDK""" access_token = redis.get("wechat:access_token") jsapi_ticket = redis.get("wechat:jsapi_ticket") token_expires_at = redis.get("wechat:access_token_expires_at") ticket_expires_at = redis.get("wechat:jsapi_ticket_expires_at") if access_token and jsapi_ticket and token_expires_at and ticket_expires_at: wechat = WechatBasic(appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], token=app.config['TOKEN'], access_token=access_token, access_token_expires_at=int(token_expires_at), jsapi_ticket=jsapi_ticket, jsapi_ticket_expires_at=int(ticket_expires_at)) else: wechat = WechatBasic(appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], token=app.config['TOKEN']) access_token = wechat.get_access_token() redis.set("wechat:access_token", access_token['access_token'], 7000) redis.set("wechat:access_token_expires_at", access_token['access_token_expires_at'], 7000) jsapi_ticket = wechat.get_jsapi_ticket() redis.set("wechat:jsapi_ticket", jsapi_ticket['jsapi_ticket'], 7000) redis.set("wechat:jsapi_ticket_expires_at", jsapi_ticket['jsapi_ticket_expires_at'], 7000) return wechat
def test_get_user_info(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.get_user_info('123412412341234') # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.get_user_info('3253634563425234') self.assertEqual(resp['subscribe'], 1) self.assertEqual(resp['openid'], 'o6_bmjrPTlm6_2sgVt7hMZOPfL2M') self.assertEqual(resp['nickname'], 'Band') self.assertEqual(resp['sex'], 1) self.assertEqual(resp['language'], 'zh_CN') self.assertEqual(resp['city'], '广州') self.assertEqual(resp['province'], '广东') self.assertEqual(resp['country'], '中国') self.assertEqual( resp['headimgurl'], 'http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0' ) self.assertEqual(resp['subscribe_time'], 1382694957) self.assertEqual(resp['unionid'], 'o6_bmasdasdsad6_2sgVt7hMZOPfL') self.assertEqual(resp['remark'], '') self.assertEqual(resp['groupid'], 0)
def test_send_article_message(self): article_info = [{ 'title': '第一条新闻标题', 'description': '第一条新闻描述,这条新闻没有预览图', 'url': 'http://www.google.com.hk/', }, { 'title': '第二条新闻标题, 这条新闻无描述', 'picurl': 'http://doraemonext.oss-cn-hangzhou.aliyuncs.com/test/wechat-test.jpg', 'url': 'http://www.github.com/', }, { 'title': '第三条新闻标题', 'description': '第三条新闻描述', 'picurl': 'http://doraemonext.oss-cn-hangzhou.aliyuncs.com/test/wechat-test.jpg', 'url': 'http://www.v2ex.com/', }] # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.send_article_message('12341234234', article_info) # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.send_article_message('safasf', article_info) self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok')
def test_create_qrcode(self): data = { "action_name": "QR_LIMIT_STR_SCENE", "action_info": { "scene": { "scene_str": "123" } } } # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.create_qrcode(data) # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.create_qrcode(data) self.assertEqual( resp['ticket'], 'gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==' ) self.assertEqual(resp['expire_seconds'], 60) self.assertEqual(resp['url'], 'http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI')
def __init__(self, app_id=None, app_secret=None): self.redis = redis.StrictRedis(host='localhost', port=6379, db=2) self.app_id = app_id self.app_secret = app_secret if not app_id: self.wechat_admin = Area.objects.all().order_by('id')[0] self.wechat = WechatBasic(appid=self.wechat_admin.wx_app_id, appsecret=self.wechat_admin.wx_secret, token='123') self.app_id = self.wechat_admin.app_id self.app_secret = self.wechat_admin.app_secret else: self.wechat_admin = None self.wechat = WechatBasic(appid=app_id, appsecret=app_secret, token='123') self.get_token() def get_token(self): key = 'access_token_{0}'.format(self.app_id) token = self.redis.get(key) if not token: res = self.wechat.grant_token() token = res.get('access_token') self.redis.set(key, token, 3500) return token def get_js_ticket(self): key = 'js_ticket_{0}'.format(self.app_id) ticket = self.redis.get(key) if not ticket or ticket == 'None': res = self.wechat.get_jsapi_ticket() ticket = res.get('jsapi_ticket') self.redis.set(key, ticket, 3500) return ticket def get_random_str(self): return string.join( random.sample('ZYXWVUTSRQPONMLKJIHGFEDCBA1234567890zyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcba', 32)).replace(" ", "") def get_js_signature(self, url): timestamp = int(time.time()) nostr = self.get_random_str() ticket = self.get_js_ticket() signature = self.wechat.generate_jsapi_signature(timestamp, nostr, url, ticket) return {'timestamp': timestamp, 'ticket': ticket, 'noncestr': nostr, 'url': url, 'signature': signature} def send_message(self, open_id, message): token = self.get_token() req_url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}'.format(token) message = message.decode('utf-8') data = {'touser': open_id, 'msgtype': 'text', 'text': {'content': str('测试')}} result = requests.post(req_url, data=simplejson.dumps(data)) return json.loads(result.content)
def test_access_token(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): print(wechat.conf.access_token) # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): access_token = wechat.conf.access_token self.assertEqual(access_token, self.fixtures_access_token)
def test_get_group_by_id(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.get_group_by_id('13441123412341') # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.get_group_by_id('12554647777') self.assertEqual(resp['groupid'], 102)
def test_jsapi_ticket(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): print(wechat.conf.jsapi_ticket) # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): jsapi_ticket = wechat.conf.jsapi_ticket self.assertEqual(jsapi_ticket, self.fixtures_jsapi_ticket)
def test_create_group(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.create_group('测试组') # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.create_group('测试组') self.assertEqual(resp['group']['id'], 107) self.assertEqual(resp['group']['name'], 'test')
def test_update_group(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.update_group(23, 'asfff') # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.update_group(11, '113444') self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok')
def test_move_user(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.move_user("123412", 1241234) # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.update_group("21341", 12341234) self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok')
def test_send_text_message(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.send_text_message('asdfasdfdf', 'asdadsfd') # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.send_text_message('13412412341234242', '测试') self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok')
def test_send_video_message(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.send_video_message('asfasdfadsf', '123412342134') # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.send_video_message('safasf', '123412343423241') self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok')
def test_delete_menu(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.delete_menu() # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.delete_menu() self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok')
def test_get_template_id(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.get_template_id('aafeewr') # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.get_template_id('123412431234') self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok') self.assertEqual(resp['template_id'], 'Doclyl5uP7Aciu-qZ7mJNPtWkbkYnWBWVja26EGbNyk')
def test_grant_token(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.grant_token() # 测试有 appid 和 appsecret 初始化(覆盖已有 access_token,默认override=True即覆盖) wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.grant_token() self.assertEqual(resp['access_token'], self.fixtures_access_token) self.assertEqual(resp['expires_in'], 7200) self.assertEqual(wechat.conf.access_token, self.fixtures_access_token)
def test_get_followers(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.get_followers() # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.get_followers() self.assertEqual(resp['total'], 2) self.assertEqual(resp['count'], 2) self.assertEqual(resp['data'], {'openid': ['', 'OPENID1', 'OPENID2']}) self.assertEqual(resp['next_openid'], 'NEXT_OPENID')
def init_wechat(self): try: wechat_conf_cache = self.cache.get(self.WechatConfCachekey) if not wechat_conf_cache: token = self.get_param_value('mps_token') appid = self.get_param_value('mps_appid') appsecret = self.get_param_value('mps_apisecret') encrypt_mode = self.get_param_value('mps_encrypt_mode', 'normal') encoding_aes_key = self.get_param_value( 'mps_encoding_aes_key', '') wechat_conf_cache = dict(token=token, appid=appid, appsecret=appsecret, encrypt_mode=encrypt_mode, encoding_aes_key=encoding_aes_key) self.cache.set(self.WechatConfCachekey, wechat_conf_cache, expire=300) _c = wechat_conf_cache wechat_conf = WechatConf( token=_c['token'], appid=_c['appid'], appsecret=_c['appsecret'], encrypt_mode=_c['encrypt_mode'], encoding_aes_key=_c['encoding_aes_key'], access_token_getfunc=functools.partial( self.mpsapi.get_access_token, _c['appid'], _c['appsecret']), access_token_setfunc=self.mpsapi.set_access_token) self.wechat = WechatBasic(conf=wechat_conf) except Exception as err: logger.exception(err)
def test_send_music_message(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.send_music_message('231412341234', 'http://www.baidu.com', 'http://www.google.com', '12341234') # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.send_music_message('231412341234', 'http://www.baidu.com', 'http://www.google.com', '12341234') self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok')
def test_grant_jsapi_ticket(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.grant_jsapi_ticket() # 测试有 appid 和 appsecret 初始化(覆盖已有 jsapi_ticket,默认override=True即覆盖) wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.grant_jsapi_ticket() self.assertEqual(resp['errcode'], 0) self.assertEqual(resp['errmsg'], 'ok') self.assertEqual(resp['ticket'], self.fixtures_jsapi_ticket) self.assertEqual(resp['expires_in'], 7200) self.assertEqual(wechat.conf.jsapi_ticket, self.fixtures_jsapi_ticket)
def index(request): signature = request.GET['signature'] timestamp = request.GET['timestamp'] nonce = request.GET['nonce'] conf = WechatConf(token=TOKEN, appid=APP_ID, appsecret=APP_SECRET, encrypt_mode="normal") wechat = WechatBasic(conf=conf) if request.method == "GET": echostr = request.GET['echostr'] if wechat.check_signature(signature=signature, timestamp=timestamp, nonce=nonce): print 'Accept' else: print 'Wrong' return HttpResponse(echostr) elif request.method == "POST": print request.body return HttpResponse("%r" % request.POST)
def test_parse_data_location_message(self): message = """<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[location]]></MsgType> <Location_X>23.134521</Location_X> <Location_Y>113.358803</Location_Y> <Scale>20</Scale> <Label><![CDATA[位置信息]]></Label> <MsgId>1234567890123456</MsgId> </xml>""" wechat = WechatBasic() wechat.parse_data(data=message) message = wechat.message self.assertIsInstance(message, LocationMessage) self.assertEqual(message.id, 1234567890123456) self.assertEqual(message.target, 'toUser') self.assertEqual(message.source, 'fromUser') self.assertEqual(message.time, 1351776360) self.assertEqual(message.type, 'location') self.assertEqual(message.location, (23.134521, 113.358803)) self.assertEqual(message.scale, 20) self.assertEqual(message.label, '位置信息')
class WxApplication: AppID = "wxec1632d9ec8a5d95" AppSecret = "8b6bb7f5dad80ce0aa639e6db173b406" weConf = WechatConf(token='master_zy', appid=AppID, appsecret=AppSecret, encrypt_mode='safe', encoding_aes_key=None) wechat = WechatBasic(conf=weConf) def __init__(self): pass def __call__(self, **kwargs): pass #登陆授权验证 def check_signature(self): aa = '' return aa def user_info(self): try: # user = self.wechat.get_user_info(OPENID) token = self.wechat.grant_token() print(token) except Exception as e: print(e) resp = str(e) return resp
def set_menu(): wechat = WechatBasic(appid=APPID, appsecret=APPSECRET) wechat.create_menu({ 'button':[ { 'name':u'功能测试', 'sub_button':[ { 'type':'view', 'name':u'JS-SDK', 'url':'http://cms.olive-app.com/weixin/testjs/' } ] }, { 'name':u'菜单2', 'sub_button':[ { 'type':'view', 'name':u'个人中心', 'url':'http://xiande.olive-app.com/member/' }, { 'type':'view', 'name':u'个人资产', 'url':'http://xiande.olive-app.com/member/assets/' }, { 'type':'view', 'name':u'我要理财', 'url':'http://xiande.olive-app.com/member/join/' }, { 'type':'view', 'name':u'个人小金库', 'url':'http://xiande.olive-app.com/member/money/' } ] }, { 'name':u'菜单3', 'sub_button':[ { 'type':'click', 'name':u'热门活动', 'key':'event_hot' }, { 'type':'click', 'name':u'本月活动', 'key':'event_month' }, { 'type':'view', 'name':u'我要报名', 'url':'http://xiande.olive-app.com/event/join/' } ] } ]})
def cash(request): c = {} c['introducer'] = request.GET.get('u', '') openid = request.session.get("openid", '') if openid == "": return redirect("/oauth/?refer=/event/cash/?u=" + c['introducer']) has_cash = False user_num = UserProfile.objects.filter(wx_openid=openid).count() if user_num > 0: _user_profile = UserProfile.objects.filter(wx_openid=openid).first() _cash_record_num = CashEventInfo.objects.filter( user=_user_profile.user).count() if _cash_record_num > 0: _cash_record = CashEventInfo.objects.filter( user=_user_profile.user).first() has_cash = True c['has_cash'] = has_cash wechat = WechatBasic(token=WEIXIN_TOKEN, appid=APPID, appsecret=APPSECRET) ticket = getJsApiTicket(wechat) sign = Sign(ticket, "http://" + request.get_host() + request.get_full_path()) c['sign'] = sign.sign() c['appid'] = APPID c['openid'] = openid return render_to_response("event/cash.html", c, context_instance=RequestContext(request))
def test_response_text(self): wechat = WechatBasic() wechat.parse_data(data=self.test_message) response_xml_1 = wechat.response_text('test message') response_xml_2 = wechat.response_text('测试文本') response_xml_3 = wechat.response_text(u'测试文本') response_xml_4 = wechat.response_text('<h1>你好</h1>') response_xml_5 = wechat.response_text('<h1>你好</h1>', escape=True) response_1 = xmltodict.parse(response_xml_1) response_2 = xmltodict.parse(response_xml_2) response_3 = xmltodict.parse(response_xml_3) response_4 = xmltodict.parse(response_xml_4) response_5 = xmltodict.parse(response_xml_5) self.assertEqual(response_1['xml']['ToUserName'], 'fromUser') self.assertEqual(response_1['xml']['FromUserName'], 'toUser') self.assertEqual(response_1['xml']['MsgType'], 'text') self.assertEqual(response_1['xml']['Content'], 'test message') self.assertEqual(response_2['xml']['Content'], '测试文本') self.assertEqual(response_3['xml']['Content'], '测试文本') self.assertEqual(response_4['xml']['Content'], '<h1>你好</h1>') self.assertEqual(response_5['xml']['Content'], '<h1>你好</h1>')
def test_parse_data_link_message(self): message = """<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[link]]></MsgType> <Title><![CDATA[公众平台官网链接]]></Title> <Description><![CDATA[公众平台官网链接]]></Description> <Url><![CDATA[url]]></Url> <MsgId>1234567890123456</MsgId> </xml>""" wechat = WechatBasic() wechat.parse_data(data=message) message = wechat.message self.assertIsInstance(message, LinkMessage) self.assertEqual(message.id, 1234567890123456) self.assertEqual(message.target, 'toUser') self.assertEqual(message.source, 'fromUser') self.assertEqual(message.time, 1351776360) self.assertEqual(message.type, 'link') self.assertEqual(message.title, '公众平台官网链接') self.assertEqual(message.description, '公众平台官网链接') self.assertEqual(message.url, 'url')
def getbasic(): access_token = None access_token_expires_at = None accesstoken = db.session.query(AccessToken).order_by( AccessToken.id.desc()).first() if accesstoken is not None: access_token = accesstoken.accesstoken access_token_expires_at = accesstoken.expires conf = WechatConf( token=os.environ.get('WECHAT_TOKEN'), appid=os.getenv('appid') or 'wx2fa77d7048b61431', appsecret=os.getenv('appsecret') or 'd9dd89550c7c221d44ccd581a6558fd6', encrypt_mode='normal', access_token=access_token, access_token_expires_at=access_token_expires_at, ) basic = WechatBasic(conf=conf) now = time() if access_token_expires_at - now < 60: token = basic.get_access_token() db.session.add( AccessToken(accesstoken=token['access_token'], expires=token['access_token_expires_at'])) return basic
def test_parse_data_voice_recognition(self): message = """<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <Format><![CDATA[Format]]></Format> <Recognition><![CDATA[腾讯微信团队]]></Recognition> <MsgId>1234567890123456</MsgId> </xml>""" wechat = WechatBasic() wechat.parse_data(data=message) message = wechat.message self.assertIsInstance(message, VoiceMessage) self.assertEqual(message.id, 1234567890123456) self.assertEqual(message.target, 'toUser') self.assertEqual(message.source, 'fromUser') self.assertEqual(message.time, 1357290913) self.assertEqual(message.type, 'voice') self.assertEqual(message.media_id, 'media_id') self.assertEqual(message.format, 'Format') self.assertEqual(message.recognition, '腾讯微信团队')