diff --git a/PyMicroChat.zip b/PyMicroChat.zip new file mode 100644 index 0000000..2b05858 Binary files /dev/null and b/PyMicroChat.zip differ diff --git a/README.md b/README.md index d1086ca..0950c32 100644 --- a/README.md +++ b/README.md @@ -22,4 +22,8 @@ Windows环境 >> (PyMicroChat) D:\VSCODE\PyMicroChat>python run.py > 退出 ->> (PyMicroChat) D:\VSCODE\PyMicroChat>deactivate \ No newline at end of file +>> (PyMicroChat) D:\VSCODE\PyMicroChat>deactivate + +### 工程中的dll文件源码地址:https://github.com/InfiniteTsukuyomi/MicroChat/tree/master/test/ecdh + +##### QQ交流群:306804262 diff --git a/microchat/Util.py b/microchat/Util.py index 730c36b..5c7ad3a 100644 --- a/microchat/Util.py +++ b/microchat/Util.py @@ -12,18 +12,16 @@ import subprocess import sqlite3 from . import define -from Crypto.Cipher import AES +from . import dns_ip +from Crypto.Cipher import AES, DES3 from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 from google.protobuf.internal import decoder, encoder from ctypes import * from .plugin.logger_wrapper import logger +from .ecdh import ecdh ################################全局变量################################ -# 日志级别(INFO级别不输出debug信息) -# __LOG_LEVEL__ = logging.INFO -# logger = logging.getLogger("mmTest") - # cgi http头 headers = { "Accept": "*/*", @@ -41,9 +39,6 @@ CONTACT_TYPE_BLACKLIST = 8 # 黑名单中的好友 CONTACT_TYPE_DELETED = 16 # 已删除的好友 -# 长短链接默认地址;调用GetDNS()接口后会存放服务器解析的长短链接ip -ip = {'longip': 'long.weixin.qq.com', 'shortip': 'short.weixin.qq.com'} - # ECDH key EcdhPriKey = b'' EcdhPubKey = b'' @@ -66,20 +61,6 @@ ######################################################################## -# 日志初始化 -# def initLog(): -# logger.setLevel(__LOG_LEVEL__) -# hterm = logging.StreamHandler() -# hterm.setLevel(__LOG_LEVEL__) -# hfile = logging.FileHandler(time.strftime( -# "%Y-%m-%d", time.localtime()) + ".log") -# hfile.setLevel(__LOG_LEVEL__) -# formatter = logging.Formatter('[%(asctime)s][%(levelname)s]: %(message)s') -# hterm.setFormatter(formatter) -# hfile.setFormatter(formatter) -# logger.addHandler(hterm) -# logger.addHandler(hfile) - # md5 def GetMd5(src): m1 = hashlib.md5() @@ -107,16 +88,14 @@ def aes(src, key): # 先压缩后RSA加密 def compress_and_rsa(src): compressData = zlib.compress(src) - rsakey = RSA.construct( - (int(define.__LOGIN_RSA_VER158_KEY_N__, 16), define.__LOGIN_RSA_VER158_KEY_E__)) + rsakey = RSA.construct((int(define.__LOGIN_RSA_VER158_KEY_N__, 16), define.__LOGIN_RSA_VER158_KEY_E__)) cipher = Cipher_pkcs1_v1_5.new(rsakey) encrypt_buf = cipher.encrypt(compressData) return encrypt_buf # 不压缩RSA2048加密 def rsa(src): - rsakey = RSA.construct( - (int(define.__LOGIN_RSA_VER158_KEY_N__, 16), define.__LOGIN_RSA_VER158_KEY_E__)) + rsakey = RSA.construct((int(define.__LOGIN_RSA_VER158_KEY_N__, 16), define.__LOGIN_RSA_VER158_KEY_E__)) cipher = Cipher_pkcs1_v1_5.new(rsakey) encrypt_buf = cipher.encrypt(src) return encrypt_buf @@ -135,22 +114,39 @@ def aesDecrypt(src, key): # HTTP短链接发包 def mmPost(cgi, data): - conn = http.client.HTTPConnection(ip['shortip'], timeout=10) - conn.request("POST", cgi, data, headers) - response = conn.getresponse().read() - conn.close() + ret = False + retry = 3 + response = b'' + while not ret and retry > 0: + retry = retry - 1 + try: + conn = http.client.HTTPConnection(dns_ip.fetch_shortlink_ip(), timeout=3) + conn.request("POST", cgi, data, headers) + response = conn.getresponse().read() + conn.close() + ret = True + except Exception as e: + if 'timed out' == str(e): + logger.info('{}请求超时,正在尝试重新发起请求,剩余尝试次数{}次'.format(cgi, retry), 11) + else: + raise RuntimeError('mmPost Error!!!') return response # HTTP短链接发包 def post(host, api, data, head=''): - conn = http.client.HTTPConnection(host, timeout=2) - if head: - conn.request("POST", api, data, head) - else: - conn.request("POST", api, data) - response = conn.getresponse().read() - conn.close() - return response + try: + conn = http.client.HTTPConnection(host, timeout=2) + if head: + conn.request("POST", api, data, head) + else: + conn.request("POST", api, data) + response = conn.getresponse().read() + conn.close() + return response + except: + logger.info('{}请求失败!'.format(api) ,11) + return b'' + # 退出程序 def ExitProcess(): @@ -163,60 +159,78 @@ def OpenIE(url): subprocess.call('python ./microchat/plugin/browser.py {}'.format(url)) # 使用c接口生成ECDH本地密钥对 -def GenEcdhKey(): +def GenEcdhKey(old=False): global EcdhPriKey, EcdhPubKey - # 载入c模块 - loader = ctypes.cdll.LoadLibrary - if platform.architecture()[0] == '64bit': - lib = loader("./microchat/dll/ecdh_x64.dll") + if old: + # 载入c模块 + loader = ctypes.cdll.LoadLibrary + if platform.architecture()[0] == '64bit': + lib = loader("./microchat/dll/ecdh_x64.dll") + else: + lib = loader("./microchat/dll/ecdh_x32.dll") + # 申请内存 + priKey = bytes(bytearray(2048)) # 存放本地DH私钥 + pubKey = bytes(bytearray(2048)) # 存放本地DH公钥 + lenPri = c_int(0) # 存放本地DH私钥长度 + lenPub = c_int(0) # 存放本地DH公钥长度 + # 转成c指针传参 + pri = c_char_p(priKey) + pub = c_char_p(pubKey) + pLenPri = pointer(lenPri) + pLenPub = pointer(lenPub) + # secp224r1 ECC算法 + nid = 713 + # c函数原型:bool GenEcdh(int nid, unsigned char *szPriKey, int *pLenPri, unsigned char *szPubKey, int *pLenPub); + bRet = lib.GenEcdh(nid, pri, pLenPri, pub, pLenPub) + if bRet: + # 从c指针取结果 + EcdhPriKey = priKey[:lenPri.value] + EcdhPubKey = pubKey[:lenPub.value] + return bRet else: - lib = loader("../microchat/dll/ecdh_x32.dll") - # 申请内存 - priKey = bytes(bytearray(2048)) # 存放本地DH私钥 - pubKey = bytes(bytearray(2048)) # 存放本地DH公钥 - lenPri = c_int(0) # 存放本地DH私钥长度 - lenPub = c_int(0) # 存放本地DH公钥长度 - # 转成c指针传参 - pri = c_char_p(priKey) - pub = c_char_p(pubKey) - pLenPri = pointer(lenPri) - pLenPub = pointer(lenPub) - # secp224r1 ECC算法 - nid = 713 - # c函数原型:bool GenEcdh(int nid, unsigned char *szPriKey, int *pLenPri, unsigned char *szPubKey, int *pLenPub); - bRet = lib.GenEcdh(nid, pri, pLenPri, pub, pLenPub) - if bRet: - # 从c指针取结果 - EcdhPriKey = priKey[:lenPri.value] - EcdhPubKey = pubKey[:lenPub.value] - return bRet + try: + pub_key, len_pub, pri_key, len_pri = ecdh.gen_ecdh(713) + EcdhPubKey = pub_key[:len_pub] + EcdhPriKey = pri_key[:len_pri] + return True + except Exception as e: + print(e) + return False # 密钥协商 -def DoEcdh(serverEcdhPubKey): - EcdhShareKey = b'' - # 载入c模块 - loader = ctypes.cdll.LoadLibrary - if platform.architecture()[0] == '64bit': - lib = loader("./microchat/dll/ecdh_x64.dll") +def DoEcdh(serverEcdhPubKey, old=False): + if old: + EcdhShareKey = b'' + # 载入c模块 + loader = ctypes.cdll.LoadLibrary + if platform.architecture()[0] == '64bit': + lib = loader("./microchat/dll/ecdh_x64.dll") + else: + lib = loader("./microchat/dll/ecdh_x32.dll") #修改在32环境下找不到ecdh_x32.dll文件 by luckyfish 2018-04-02 + # 申请内存 + shareKey = bytes(bytearray(2048)) # 存放密钥协商结果 + lenShareKey = c_int(0) # 存放共享密钥长度 + # 转成c指针传参 + pShareKey = c_char_p(shareKey) + pLenShareKey = pointer(lenShareKey) + pri = c_char_p(EcdhPriKey) + pub = c_char_p(serverEcdhPubKey) + # secp224r1 ECC算法 + nid = 713 + # c函数原型:bool DoEcdh(int nid, unsigned char * szServerPubKey, int nLenServerPub, unsigned char * szLocalPriKey, int nLenLocalPri, unsigned char * szShareKey, int *pLenShareKey); + bRet = lib.DoEcdh(nid, pub, len(serverEcdhPubKey), pri,len(EcdhPriKey), pShareKey, pLenShareKey) + if bRet: + # 从c指针取结果 + EcdhShareKey = shareKey[:lenShareKey.value] + return EcdhShareKey else: - lib = loader("./microchat/dll/ecdh_x32.dll") #修改在32环境下找不到ecdh_x32.dll文件 by luckyfish 2018-04-02 - # 申请内存 - shareKey = bytes(bytearray(2048)) # 存放密钥协商结果 - lenShareKey = c_int(0) # 存放共享密钥长度 - # 转成c指针传参 - pShareKey = c_char_p(shareKey) - pLenShareKey = pointer(lenShareKey) - pri = c_char_p(EcdhPriKey) - pub = c_char_p(serverEcdhPubKey) - # secp224r1 ECC算法 - nid = 713 - # c函数原型:bool DoEcdh(int nid, unsigned char * szServerPubKey, int nLenServerPub, unsigned char * szLocalPriKey, int nLenLocalPri, unsigned char * szShareKey, int *pLenShareKey); - bRet = lib.DoEcdh(nid, pub, len(serverEcdhPubKey), pri,len(EcdhPriKey), pShareKey, pLenShareKey) - if bRet: - # 从c指针取结果 - EcdhShareKey = shareKey[:lenShareKey.value] - return EcdhShareKey - + try: + _, EcdhShareKey = ecdh.do_ecdh(713, serverEcdhPubKey, EcdhPriKey) + return EcdhShareKey + except Exception as e: + print(e) + return b'' + # bytes转hex输出 def b2hex(s): return ''.join(["%02X " % x for x in s]).strip() @@ -224,11 +238,14 @@ def b2hex(s): return ''.join(["%02X " % x for x in s]).strip() # sqlite3数据库初始化 def init_db(): global conn + # 建db文件夹 + if not os.path.exists(os.getcwd() + '/db'): + os.mkdir(os.getcwd() + '/db') # 建库 - conn = sqlite3.connect('mm_{}.db'.format(wxid)) + conn = sqlite3.connect('./db/mm_{}.db'.format(wxid)) cur = conn.cursor() # 建消息表 - cur.execute('create table if not exists msg(svrid bigint unique,utc integer,createtime varchar(1024),fromWxid varchar(1024),toWxid varchar(1024),type integer,content text(65535))') + cur.execute('create table if not exists msg(svrid bigint unique,clientMsgId varchar(1024),utc integer,createtime varchar(1024),fromWxid varchar(1024),toWxid varchar(1024),type integer,content text(65535))') # 建联系人表 cur.execute('create table if not exists contact(wxid varchar(1024) unique,nick_name varchar(1024),remark_name varchar(1024),alias varchar(1024),avatar_big varchar(1024),v1_name varchar(1024),type integer default(0),sex integer,country varchar(1024),sheng varchar(1024),shi varchar(1024),qianming varchar(2048),register_body varchar(1024),src integer,chatroom_owner varchar(1024),chatroom_serverVer integer,chatroom_max_member integer,chatroom_member_cnt integer)') # 建sync key表 @@ -253,11 +270,11 @@ def set_sync_key(key): return # 保存消息 -def insert_msg_to_db(svrid, utc, from_wxid, to_wxid, type, content): +def insert_msg_to_db(svrid, utc, from_wxid, to_wxid, type, content, client_msg_id = ''): cur = conn.cursor() try: - cur.execute("insert into msg(svrid,utc,createtime,fromWxid,toWxid,type,content) values('{}','{}','{}','{}','{}','{}','{}')".format( - svrid, utc, utc_to_local_time(utc), from_wxid, to_wxid, type, content)) + cur.execute("insert into msg(svrid, clientMsgId, utc, createtime, fromWxid, toWxid, type, content) values('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}')".format( + svrid, client_msg_id, utc, utc_to_local_time(utc), from_wxid, to_wxid, type, content)) conn.commit() except Exception as e: logger.info('insert_msg_to_db error:{}'.format(str(e))) @@ -307,12 +324,12 @@ def get_frient_type(wxid): else: return 0 -# 好友是否已删除 -def is_deleted(type): - # type的最后一bit是0表示已被删除 - return 0 == (type & 1) +# 是否在我的好友列表中 +def is_in_my_friend_list(type): + # type的最后一bit是1表示对方在我的好友列表中 + return (type & 1) -# 好友是否在黑名单中 +# 对方是否在我的黑名单中 def is_in_blacklist(type): return (type & (1 << 3)) @@ -321,18 +338,18 @@ def get_contact(contact_type): cur = conn.cursor() rows = [] if contact_type & CONTACT_TYPE_FRIEND: # 返回好友列表 - cur.execute("select wxid,nick_name,remark_name,alias,v1_name,avatar_big from contact where wxid not like '%%@chatroom' and wxid not like 'gh_%%' and (type & 8) = 0") + cur.execute("select wxid,nick_name,remark_name,alias,v1_name,avatar_big from contact where wxid not like '%%@chatroom' and wxid not like 'gh_%%' and (type & 8) = 0 and (type & 1)") rows = rows + cur.fetchall() if contact_type & CONTACT_TYPE_CHATROOM: # 返回群聊列表 - cur.execute("select wxid,nick_name,remark_name,alias,v1_name,avatar_big from contact where wxid like '%%@chatroom'") + cur.execute("select wxid,nick_name,remark_name,alias,v1_name,avatar_big from contact where wxid like '%%@chatroom' and (type & 1)") rows = rows + cur.fetchall() if contact_type & CONTACT_TYPE_OFFICAL: # 返回公众号列表 - cur.execute("select wxid,nick_name,remark_name,alias,v1_name,avatar_big from contact where wxid like 'gh_%%'") + cur.execute("select wxid,nick_name,remark_name,alias,v1_name,avatar_big from contact where wxid like 'gh_%%' and (type & 1)") rows = rows + cur.fetchall() if contact_type & CONTACT_TYPE_BLACKLIST: # 返回黑名单列表 cur.execute("select wxid,nick_name,remark_name,alias,v1_name,avatar_big from contact where wxid not like '%%@chatroom' and wxid not like 'gh_%%' and (type & 8)") rows = rows + cur.fetchall() - if contact_type & CONTACT_TYPE_DELETED: # 返回已删除好友列表 + if contact_type & CONTACT_TYPE_DELETED: # 返回已删除好友列表(非主动删除对方?) cur.execute("select wxid,nick_name,remark_name,alias,v1_name,avatar_big from contact where wxid not like '%%@chatroom' and wxid not like 'gh_%%' and (type & 1) = 0") rows = rows + cur.fetchall() return rows @@ -350,3 +367,33 @@ def find_str(src,start,end): except: pass return '' + +# 转账相关请求参数签名算法 +def SignWith3Des(src): + # 首先对字符串取MD5 + raw_buf = hashlib.md5(src.encode()).digest() + # 对16字节的md5做bcd2ascii + bcd_to_ascii = bytearray(32) + for i in range(len(raw_buf)): + bcd_to_ascii[2*i] = raw_buf[i]>>4 + bcd_to_ascii[2*i+1] = raw_buf[i] & 0xf + # hex_to_bin转换加密key + key = bytes.fromhex('3ECA2F6FFA6D4952ABBACA5A7B067D23') + # 对32字节的bcd_to_ascii做Triple DES加密(3DES/ECB/NoPadding) + des3 = DES3.new(key, DES3.MODE_ECB) + enc_bytes = des3.encrypt(bcd_to_ascii) + # bin_to_hex得到最终加密结果 + enc_buf = ''.join(["%02X" % x for x in enc_bytes]).strip() + return enc_buf + +# 根据svrid查询client_msg_id +def get_client_msg_id(svrid): + try: + cur = conn.cursor() + cur.execute("select clientMsgId from msg where svrid = '{}'".format(svrid)) + row = cur.fetchone() + if row: + return row[0] + except: + pass + return '' \ No newline at end of file diff --git a/microchat/business.py b/microchat/business.py index a796ecb..0d878fc 100644 --- a/microchat/business.py +++ b/microchat/business.py @@ -8,6 +8,7 @@ import xmltodict import zlib from . import define +from . import dns_ip from . import mm_pb2 from .plugin import plugin from . import Util @@ -33,7 +34,7 @@ def pack(src, cgi_type, use_compress=0): header += bytes([((0x5 << 4) + 0xf)]) # 05:AES加密算法 0xf:cookie长度(默认使用15字节长的cookie) header += struct.pack(">I", define.__CLIENT_VERSION__) # 客户端版本号 网络字节序 header += struct.pack(">i", Util.uin) # uin - header += Util.cookie # coockie + header += Util.cookie # cookie header += encoder._VarintBytes(cgi_type) # cgi type header += encoder._VarintBytes(len(src)) # body proto压缩前长度 header += encoder._VarintBytes(len_proto_compressed) # body proto压缩后长度 @@ -47,7 +48,7 @@ def pack(src, cgi_type, use_compress=0): # 解包 def UnPack(src, key=b''): if len(src) < 0x20: - raise RuntimeError('Unpack Error!Please check mm protocol!') # 协议需要更新 + raise RuntimeError('Unpack Error!Please check mm protocol!') # 协议需要更新 return b'' if not key: key = Util.sessionKey @@ -182,9 +183,26 @@ def login_buf2Resp(buf, login_aes_key): loginRes.result.code = -1 loginRes.ParseFromString(UnPack(buf, login_aes_key)) + # 更新DNS信息 + for dns_info in loginRes.dns.redirect.real_host: + if dns_info.host == 'long.weixin.qq.com': # 更新长链接信息 + dns_ip.long_ip = [] # 清空旧的长链接ip池 + for ip_info in loginRes.dns.ip.longlink: + if dns_info.redirect == ip_info.host.replace('\x00', ''): + logger.debug('更新长链接DNS:[{}:{}]'.format(dns_info.redirect, ip_info.ip.replace('\x00', ''))) + dns_ip.long_ip.append(ip_info.ip.replace('\x00', '')) # 保存长链接ip + elif dns_info.host == 'short.weixin.qq.com': # 更新短链接信息 + dns_ip.short_ip = [] # 清空旧的短链接ip池 + for ip_info in loginRes.dns.ip.shortlink: + if dns_info.redirect == ip_info.host.replace('\x00', ''): + logger.debug('更新短链接DNS:[{}:{}]'.format(dns_info.redirect, ip_info.ip.replace('\x00', ''))) + dns_ip.short_ip.append(ip_info.ip.replace('\x00', '')) # 保存短链接ip + # 保存dns到db + dns_ip.save_dns() + # 登录异常处理 if -301 == loginRes.result.code: # DNS解析失败,请尝试更换idc - logger.error('登陆结果:\ncode:{}\n请尝试更换DNS重新登陆!'.format(loginRes.result.code)) + logger.error('登陆结果:\ncode:{}\n即将尝试切换DNS重新登陆!'.format(loginRes.result.code)) elif -106 == loginRes.result.code: # 需要在IE浏览器中滑动操作解除环境异常/扫码、短信、好友授权(滑动解除异常后需要重新登录一次) logger.error('登陆结果:\ncode:{}\nError msg:{}\n'.format(loginRes.result.code, loginRes.result.err_msg.msg[loginRes.result.err_msg.msg.find('')])) # 打开IE,完成授权 @@ -226,6 +244,26 @@ def new_init_req2buf(cur=b'', max=b''): # 组包 return pack(new_init_request.SerializeToString(), 139) +# 更新好友信息 +def update_contact_info(friend,update = True): + tag = '[更新好友信息]' if update else '[查询好友信息]' + is_friend = '<好友>' if (friend.type & 1) else '<非好友>' + # 过滤系统wxid + if friend.wxid.id in define.MM_DEFAULT_WXID: + logger.info('{}:跳过默认wxid[{}]'.format(tag, friend.wxid.id), 6) + return + # 好友分类 + if friend.wxid.id.endswith('@chatroom'): # 群聊 + logger.info('{}{}:群聊名:{} 群聊wxid:{} chatroom_serverVer:{} chatroom_max_member:{} 群主:{} 群成员数量:{}'.format(tag, is_friend, friend.nickname.name, friend.wxid.id, friend.chatroom_serverVer, friend.chatroom_max_member, friend.chatroomOwnerWxid, friend.group_member_list.cnt), 6) + elif friend.wxid.id.startswith('gh_'): # 公众号 + logger.info('{}{}:公众号:{} 公众号wxid:{} alias:{} 注册主体:{}'.format(tag, is_friend, friend.nickname.name, friend.wxid.id, friend.alias, friend.register_body if friend.register_body_type == 24 else '个人'), 6) + else: # 好友 + logger.info('{}{}:昵称:{} 备注名:{} wxid:{} alias:{} 性别:{} 好友来源:{} 个性签名:{}'.format(tag, is_friend, friend.nickname.name, friend.remark_name.name, friend.wxid.id, friend.alias, friend.sex, Util.get_way(friend.src), friend.qianming), 6) + if update or friend.wxid.id.endswith('@chatroom'): + # 将好友信息存入数据库 + Util.insert_contact_info_to_db(friend.wxid.id, friend.nickname.name, friend.remark_name.name, friend.alias, friend.avatar_big, friend.v1_name, friend.type, friend.sex, friend.country,friend.sheng, friend.shi, friend.qianming, friend.register_body, friend.src, friend.chatroomOwnerWxid, friend.chatroom_serverVer, friend.chatroom_max_member, friend.group_member_list.cnt) + return + # 首次登录设备初始化解包函数 def new_init_buf2resp(buf): # 解包 @@ -254,19 +292,8 @@ def new_init_buf2resp(buf): elif 2 == res.tag7[i].type: # 好友列表 friend = mm_pb2.contact_info() friend.ParseFromString(res.tag7[i].data.data) - # 过滤系统wxid - if friend.wxid.id in define.MM_DEFAULT_WXID: - logger.info('更新好友信息:跳过默认wxid[{}]'.format(friend.wxid.id)) - continue - # 好友分类 - if friend.wxid.id.endswith('@chatroom'): # 群聊 - logger.info('更新好友信息:群聊名:{} 群聊wxid:{} chatroom_serverVer:{} chatroom_max_member:{} 群主:{} 群成员数量:{}'.format(friend.nickname.name, friend.wxid.id, friend.chatroom_serverVer, friend.chatroom_max_member, friend.chatroomOwnerWxid, friend.group_member_list.cnt)) - elif friend.wxid.id.startswith('gh_'): # 公众号 - logger.info('更新好友信息:公众号:{} 公众号wxid:{} alias:{} 注册主体:{}'.format(friend.nickname.name, friend.wxid.id, friend.alias, friend.register_body if friend.register_body_type == 24 else '个人')) - else: # 好友 - logger.info('更新好友信息:昵称:{} 备注名:{} wxid:{} alias:{} 性别:{} 好友来源:{} 个性签名:{}'.format(friend.nickname.name, friend.remark_name.name, friend.wxid.id, friend.alias, friend.sex, Util.get_way(friend.src), friend.qianming)) - # 将好友信息存入数据库 - Util.insert_contact_info_to_db(friend.wxid.id, friend.nickname.name, friend.remark_name.name, friend.alias, friend.avatar_big, friend.v1_name, friend.type, friend.sex, friend.country,friend.sheng, friend.shi, friend.qianming, friend.register_body, friend.src, friend.chatroomOwnerWxid, friend.chatroom_serverVer, friend.chatroom_max_member, friend.group_member_list.cnt) + # 更新好友信息到数据库 + update_contact_info(friend) return (res.continue_flag, res.sync_key_cur, res.sync_key_max) # 同步消息组包函数 @@ -300,14 +327,21 @@ def new_sync_buf2resp(buf): if 5 == res.msg.tag2[i].type: # 未读消息 msg = mm_pb2.Msg() msg.ParseFromString(res.msg.tag2[i].data.data) - if 10002 == msg.type or 9999 == msg.type: # 过滤系统垃圾消息 + if 9999 == msg.type: # 过滤系统垃圾消息 continue + if 10002 == msg.type and 'weixin' == msg.from_id.id: # 过滤系统垃圾消息 + continue else: # 将消息存入数据库 Util.insert_msg_to_db(msg.serverid, msg.createTime, msg.from_id.id, msg.to_id.id, msg.type, msg.raw.content) logger.info('收到新消息:\ncreate utc time:{}\ntype:{}\nfrom:{}\nto:{}\nraw data:{}\nxml data:{}'.format(Util.utc_to_local_time(msg.createTime), msg.type, msg.from_id.id, msg.to_id.id, msg.raw.content, msg.xmlContent)) # 接入插件 plugin.dispatch(msg) + elif 2 == res.msg.tag2[i].type: # 更新好友消息 + friend = mm_pb2.contact_info() + friend.ParseFromString(res.msg.tag2[i].data.data) + # 更新好友信息到数据库 + update_contact_info(friend) return # 通知服务器消息已接收(无返回数据)(仅用于长链接) @@ -325,7 +359,7 @@ def sync_done_req2buf(): return send_data # 发送文字消息请求(名片和小表情[微笑]) -def new_send_msg_req2buf(to_wxid, msg_content, msg_type=1): +def new_send_msg_req2buf(to_wxid, msg_content, at_user_list = [], msg_type=1): # protobuf组包 req = mm_pb2.new_send_msg_req( cnt=1, # 本次发送消息数量(默认1条) @@ -337,6 +371,10 @@ def new_send_msg_req2buf(to_wxid, msg_content, msg_type=1): client_id=Util.get_utc() + random.randint(0, 0xFFFF) # 确保不重复 ) ) + # 群聊at功能 + if len(at_user_list): + user_list = ''.join(["{},".format(x) for x in at_user_list]).strip(',') + req.msg.at_list = ''.format(user_list) # 组包 return pack(req.SerializeToString(), 522) @@ -386,7 +424,7 @@ def send_app_msg_req2buf(wxid, title, des, link_url, thumb_url): tag10=0, ) # 组包 - return (pack(req.SerializeToString(), 222), req.info.content) + return pack(req.SerializeToString(), 222), req.info.content, req.info.client_id # 分享链接解包函数 def send_app_msg_buf2resp(buf): @@ -502,3 +540,385 @@ def open_wxhb_buf2resp(buf): logger.debug('[红包领取结果]错误码={},详细信息:{}'.format(res.ret_code,res.res.str)) return (res.ret_code,res.res.str) +# 查看红包信息请求 +def qry_detail_wxhb_req2buf(nativeUrl, sendId, limit = 11, offset = 0, ver='v1.0'): + #protobuf组包 + wxhb_info = 'limit={}&nativeUrl={}&offset={}&sendId={}&ver={}'.format(limit, urllib.parse.quote(nativeUrl), offset, sendId, ver) + req = mm_pb2.qry_detail_wxhb_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + cmd = -1, + tag3 = 1, + info = mm_pb2.mmStr( + len = len(wxhb_info), + str = wxhb_info, + ) + ) + return pack(req.SerializeToString(),1585) + +# 查看红包信息响应 +def qry_detail_wxhb_buf2resp(buf): + res = mm_pb2.qry_detail_wxhb_resp() + res.ParseFromString(UnPack(buf)) + logger.debug('[红包领取信息]错误码={},详细信息:{}'.format(res.ret_code,res.res.str)) + return (res.ret_code,res.res.str) + +# 发送emoji表情 +def send_emoji_req2buf(wxid, file_name, game_type, content): + #protobuf组包 + req = mm_pb2.send_emoji_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + tag2 = 1, + emoji = mm_pb2.send_emoji_req.emoji_info( + animation_id = file_name, # emoji 加密文件名 + tag2 = 0, + tag3 = random.randint(1, 9999), + tag4 = mm_pb2.send_emoji_req.emoji_info.TAG4(tag1 = 0), + tag5 = 1, + to_wxid = wxid, + game_ext = ''.format(game_type, content), + tag8 = '', + utc = '{}'.format(Util.get_utc() * 1000 + random.randint(1, 999)), + tag11 = 0, + ), + tag4 = 0, + ) + #组包 + return pack(req.SerializeToString(), 175), req.emoji.utc + +# 发送emoji表情响应 +def send_emoji_buf2resp(buf): + res = mm_pb2.send_emoji_resp() + res.ParseFromString(UnPack(buf)) + if res.res.code: # emoji发送失败 + logger.info('emoji发送失败, 错误码={}'.format(res.res.code), 11) + return res.res.code, res.res.svrid + +# 收款请求 +def transfer_operation_req2buf(invalid_time, trans_id, transaction_id, user_name): + #protobuf组包 + transfer_operation = 'invalid_time={}&op=confirm&total_fee=0&trans_id={}&transaction_id={}&username={}'.format(invalid_time, trans_id, transaction_id, user_name) + transfer_operation_with_sign = 'invalid_time={}&op=confirm&total_fee=0&trans_id={}&transaction_id={}&username={}&WCPaySign={}'.format(invalid_time, trans_id, transaction_id, user_name, Util.SignWith3Des(transfer_operation)) + req = mm_pb2.transfer_operation_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + tag2 = 0, + tag3 = 1, + info = mm_pb2.mmStr( + len = len(transfer_operation_with_sign), + str = transfer_operation_with_sign, + ) + ) + #组包 + return pack(req.SerializeToString(), 385) + +# 收款结果 +def transfer_operation_buf2resp(buf): + res = mm_pb2.transfer_operation_resp() + res.ParseFromString(UnPack(buf)) + logger.debug('[收款结果]错误码={},详细信息:{}'.format(res.ret_code,res.res.str)) + return (res.ret_code,res.res.str) + +# 查询转账记录请求 +def transfer_query_req2buf(invalid_time, trans_id, transfer_id): + #protobuf组包 + transfer_info = 'invalid_time={}&trans_id={}&transfer_id={}'.format(invalid_time, trans_id, transfer_id) + transfer_info_with_sign = 'invalid_time={}&trans_id={}&transfer_id={}&WCPaySign={}'.format(invalid_time, trans_id, transfer_id, Util.SignWith3Des(transfer_info)) + req = mm_pb2.transfer_query_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + tag2 = 0, + tag3 = 1, + info = mm_pb2.mmStr( + len = len(transfer_info_with_sign), + str = transfer_info_with_sign, + ) + ) + #组包 + return pack(req.SerializeToString(), 385) + +# 查询转账记录结果 +def transfer_query_buf2resp(buf): + res = mm_pb2.transfer_query_resp() + res.ParseFromString(UnPack(buf)) + logger.debug('[查询转账记录]错误码={},详细信息:{}'.format(res.ret_code,res.res.str)) + return (res.ret_code,res.res.str) + +# 获取好友信息请求 +def get_contact_req2buf(wxid): + #protobuf组包 + req = mm_pb2.get_contact_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + tag2 = 1, + wxid = mm_pb2.Wxid(id = wxid), + tag4 = 0, + tag6 = 1, + tag7 = mm_pb2.get_contact_req.TAG7(), + tag8 = 0, + ) + # 组包 + return pack(req.SerializeToString(), 182) + +# 获取好友信息响应 +def get_contact_buf2resp(buf): + res = mm_pb2.get_contact_resp() + res.ParseFromString(UnPack(buf)) + # 显示好友信息 + update_contact_info(res.info, False) + return res.info, res.ticket + +# 建群聊请求 +def create_chatroom_req2buf(group_member_list): + #protobuf组包 + req = mm_pb2.create_chatroom_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + tag2 = mm_pb2.create_chatroom_req.TAG2(), + member_cnt = len(group_member_list), + tag5 = 0, + ) + # 添加群成员 + for wxid in group_member_list: + member = req.member.add() + member.wxid.id = wxid + # 组包 + return pack(req.SerializeToString(), 119) + +# 建群聊响应 +def create_chatroom_buf2resp(buf): + res = mm_pb2.create_chatroom_resp() + res.ParseFromString(UnPack(buf)) + if not res.res.code and res.chatroom_wxid.id: + logger.info('建群成功!群聊wxid:{}'.format(res.chatroom_wxid.id), 11) + else: + logger.info('建群失败!\n错误码:{}\n错误信息:{}'.format(res.res.code, res.res.msg.msg), 5) + return res.chatroom_wxid.id + +# 面对面建群请求 +def mm_facing_create_chatroom_req2buf(op_code, pwd = '9999', lon = 116.39, lat = 39.90): + #protobuf组包 + req = mm_pb2.mm_facing_create_chatroom_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + op_code = op_code, + chatroom_pwd = pwd, + lon = lon, + lat = lat, + tag6 = 1, + tag9 = 0, + ) + # 组包 + return pack(req.SerializeToString(), 653) + +# 面对面建群响应 +def mm_facing_create_chatroom_buf2resp(buf, op_code): + res = mm_pb2.mm_facing_create_chatroom_resp() + res.ParseFromString(UnPack(buf)) + if 0 == op_code: + if res.res.code: + logger.info('面对面建群步骤1失败!\n错误码:{}\n错误信息:{}'.format(res.res.code, res.res.msg.msg), 5) + return res.res.code, '' + else: + if not res.res.code and res.wxid: + logger.info('面对面建群成功! {} 面对面群聊wxid:{}'.format(res.res.msg.msg, res.wxid), 11) + else: + logger.info('面对面建群步骤2失败!\n错误码:{}\n错误信息:{}'.format(res.res.code, res.res.msg.msg), 5) + return res.res.code, res.wxid + +# 群聊拉人请求 +def add_chatroom_member_req2buf(chatroom_wxid, member_list): + #protobuf组包 + req = mm_pb2.add_chatroom_member_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + member_cnt = len(member_list), + chatroom_wxid = mm_pb2.add_chatroom_member_req.chatroom_info(wxid = chatroom_wxid), + tag5 = 0, + ) + # 添加群成员 + for wxid in member_list: + member = req.member.add() + member.wxid.id = wxid + # 组包 + return pack(req.SerializeToString(), 120) + +# 群聊拉人响应 +def add_chatroom_member_buf2resp(buf): + res = mm_pb2.mm_facing_create_chatroom_resp() + res.ParseFromString(UnPack(buf)) + return (res.res.code, res.res.msg.msg) + +# 设置群聊昵称请求 +def set_group_nick_name_req2buf(chatroom_wxid, nick_name): + # protobuf组包 + req = mm_pb2.oplog_req( + tag1 = mm_pb2.oplog_req.TAG1( + tag1 = 1, + cmd = mm_pb2.oplog_req.TAG1.CMD( + cmd_id = 48, + option = mm_pb2.oplog_req.TAG1.CMD.OPTION( + data = mm_pb2.op_set_group_nick_name( + tag1 = chatroom_wxid, + tag2 = Util.wxid, + tag3 = nick_name, + ).SerializeToString(), + ), + ), + ), + ) + req.tag1.cmd.option.len = len(req.tag1.cmd.option.data) + # 组包 + return pack(req.SerializeToString(), 681) + +# 设置群聊昵称响应 +def set_group_nick_name_buf2resp(buf): + res = mm_pb2.oplog_resp() + res.ParseFromString(UnPack(buf)) + try: + code,__ = decoder._DecodeVarint(res.res.code, 0) + if code: + logger.info('设置群昵称失败,错误码:0x{:x},错误信息:{}'.format(code, res.res.msg), 11) + except: + code = -1 + logger.info('设置群昵称失败!', 11) + return code + +# 消息撤回请求 +def revoke_msg_req2buf(wxid, svrid): + # 在数据库中查询svrid对应的client_msg_id + client_msg_id = Util.get_client_msg_id(svrid) + #protobuf组包 + req = mm_pb2.revoke_msg_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + client_id = client_msg_id, + new_client_id = 0, + utc = Util.get_utc(), + tag5 = 0, + from_wxid = Util.wxid, + to_wxid = wxid, + index_of_request = 0, # 自增1 + svrid = svrid, + ) + # 组包 + return pack(req.SerializeToString(), 594) + +# 消息撤回响应 +def revoke_msg_buf2resp(buf): + res = mm_pb2.revoke_msg_resp() + res.ParseFromString(UnPack(buf)) + logger.info('[消息撤回]错误码:{},提示信息:{}'.format(res.res.code, res.response_sys_wording), 11) + return res.res.code + +# 好友(群聊)操作请求:删除/保存/拉黑/恢复/设置群昵称/设置好友备注名 +def op_friend_req2buf(friend_info, cmd = 2): + #protobuf组包 + req = mm_pb2.oplog_req( + tag1 = mm_pb2.oplog_req.TAG1( + tag1 = 1, + cmd = mm_pb2.oplog_req.TAG1.CMD( + cmd_id = cmd, + option = mm_pb2.oplog_req.TAG1.CMD.OPTION( + data = friend_info, + ), + ), + ), + ) + req.tag1.cmd.option.len = len(req.tag1.cmd.option.data) + # 组包 + return pack(req.SerializeToString(), 681) + +# 好友(群聊)操作结果 +def op_friend_buf2resp(buf): + res = mm_pb2.oplog_resp() + res.ParseFromString(UnPack(buf)) + try: + code,__ = decoder._DecodeVarint(res.res.code, 0) + if code: + logger.info('好友操作失败,错误码:0x{:x},错误信息:{}'.format(code, res.res.msg), 11) + except: + code = -1 + logger.info('好友操作失败!', 11) + return code + +# 发布群公告请求(仅限群主;自动@所有人) +def set_chatroom_announcement_req2buf(wxid, text): + #protobuf组包 + req = mm_pb2.set_chatroom_announcement_req( + login = mm_pb2.LoginInfo( + aesKey = Util.sessionKey, + uin = Util.uin, + guid = define.__GUID__ + '\0', #guid以\0结尾 + clientVer = define.__CLIENT_VERSION__, + androidVer = define.__ANDROID_VER__, + unknown = 0, + ), + chatroom_wxid = wxid, + content = text, + ) + # 组包 + return pack(req.SerializeToString(), 993) + +# 发布群公告响应 +def set_chatroom_announcement_buf2resp(buf): + res = mm_pb2.set_chatroom_announcement_resp() + res.ParseFromString(UnPack(buf)) + if res.res.code: + logger.info('发布群公告失败!错误码:{},提示信息:{}'.format(res.res.code, res.res.message), 11) + return res.res.code \ No newline at end of file diff --git a/microchat/client_tornado.py b/microchat/client_tornado.py index f902777..beb7e6e 100644 --- a/microchat/client_tornado.py +++ b/microchat/client_tornado.py @@ -1,9 +1,9 @@ -from tornado import gen +from tornado import gen, iostream from tornado.tcpclient import TCPClient from tornado.ioloop import IOLoop from tornado.ioloop import PeriodicCallback import struct -from .dns_ip import get_ips +from . import dns_ip from . import interface from . import Util from . import business @@ -29,6 +29,7 @@ CMDID_REPORT_KV_REQ = 1000000190 #通知服务器消息已接收 #解包结果 +UNPACK_NEED_RESTART = -2 # 需要切换DNS重新登陆 UNPACK_FAIL = -1 #解包失败 UNPACK_CONTINUE = 0 #封包不完整,继续接收数据 UNPACK_OK = 1 #解包成功 @@ -59,36 +60,57 @@ def __init__(self, ioloop, recv_cb, host, port, usr_name, passwd): self.seq = 1 self.login_aes_key = b'' self.recv_data = b'' + self.heartbeat_callback = None @gen.coroutine def start(self): - self.stream = yield TCPClient().connect(self.host, self.port) + wait_sec = 10 + while True: + try: + self.stream = yield TCPClient().connect(self.host, self.port) + break + except iostream.StreamClosedError: + logger.error("connect error and again") + yield gen.sleep(wait_sec) + wait_sec = (wait_sec if (wait_sec >= 60) else (wait_sec * 2)) + self.send_heart_beat() - # self.stream.read_until(b'\n', self.__recv) - self.longin() + self.heartbeat_callback = PeriodicCallback(self.send_heart_beat, 1000 * HEARTBEAT_TIMEOUT) + self.heartbeat_callback.start() # start scheduler + self.login() self.stream.read_bytes(16, self.__recv_header) + @gen.coroutine + def restart(self, host, port): + if self.heartbeat_callback: + # 停止心跳 + self.heartbeat_callback.stop() + self.host = host + self.port = port + self.stream.set_close_callback(self.__closed) + yield self.stream.close() + + def __closed(self): + self.start() + def send_heart_beat(self): - logger.debug( - 'last_heartbeat_time={},Util.get_utc() - last_heartbeat_time = {}'. - format(self.last_heartbeat_time, - Util.get_utc() - self.last_heartbeat_time)) + logger.debug('last_heartbeat_time = {}, elapsed_time = {}'.format(self.last_heartbeat_time, Util.get_utc() - self.last_heartbeat_time)) #判断是否需要发送心跳包 - if (Util.get_utc() - self.last_heartbeat_time) > HEARTBEAT_TIMEOUT: + if (Util.get_utc() - self.last_heartbeat_time) >= HEARTBEAT_TIMEOUT: #长链接发包 send_data = self.pack(CMDID_NOOP_REQ) - self.stream.write(send_data) + self.send(send_data) #记录本次发送心跳时间 self.last_heartbeat_time = Util.get_utc() return True else: return False - def longin(self): + def login(self): (login_buf, self.login_aes_key) = business.login_req2buf( self.usr_name, self.passwd) send_data = self.pack(CMDID_MANUALAUTH_REQ, login_buf) - self.stream.write(send_data) + self.send(send_data) @gen.coroutine def __recv_header(self, data): @@ -98,9 +120,12 @@ def __recv_header(self, data): (len_ack, _, _) = struct.unpack('>I4xII', data) if self.recv_cb: self.recv_cb(data) - # yield self.stream.read_until(b'\n', self.__recv) - yield self.stream.read_bytes(len_ack - 16, self.__recv_payload) - + try: + yield self.stream.read_bytes(len_ack - 16, self.__recv_payload) + except iostream.StreamClosedError: + logger.error("stream read error, TCP disconnect and restart") + self.restart(dns_ip.fetch_longlink_ip(), 443) + @gen.coroutine def __recv_payload(self, data): logger.debug('recive from the server', data) @@ -110,17 +135,29 @@ def __recv_payload(self, data): if data != b'': (ret, buf) = self.unpack(self.recv_data) if UNPACK_OK == ret: - (ret, buf) = self.unpack(buf) while UNPACK_OK == ret: (ret, buf) = self.unpack(buf) #刷新心跳 self.send_heart_beat() - # yield self.stream.read_until(b'\n', self.__recv) - yield self.stream.read_bytes(16, self.__recv_header) - - @gen.coroutine + if UNPACK_NEED_RESTART == ret: # 需要切换DNS重新登陆 + if dns_ip.dns_retry_times > 0: + self.restart(dns_ip.fetch_longlink_ip(),443) + return + else: + logger.error('切换DNS尝试次数已用尽,程序即将退出............') + self.stop() + try: + yield self.stream.read_bytes(16, self.__recv_header) + except iostream.StreamClosedError: + logger.error("stream read error, TCP disconnect and restart") + self.restart(dns_ip.fetch_longlink_ip(), 443) + def send(self, data): - yield self.stream.write(data.encode('utf-8')) + try: + self.stream.write(data) + except iostream.StreamClosedError: + logger.error("stream write error, TCP disconnect and restart") + self.restart(dns_ip.fetch_longlink_ip(), 443) def stop(self): self.ioloop.stop() @@ -170,7 +207,7 @@ def unpack(self, buf): self.ioloop.stop() return (UNPACK_FAIL, b'') - self.stream.write( + self.send( self.pack(CMDID_REPORT_KV_REQ, business.sync_done_req2buf())) #通知服务器消息已接收 else: #sync key不存在 @@ -182,10 +219,12 @@ def unpack(self, buf): elif CMDID_MANUALAUTH_REQ == cmd_id: #登录响应 code = business.login_buf2Resp(buf[16:len_ack],self.login_aes_key) if -106 == code: - #logger.error('请再次登录!') - # 授权后,尝试自动重新登陆 - logger.info('正在重新登陆........................',14) - self.longin() + # 授权后,尝试自动重新登陆 + logger.info('正在重新登陆........................', 14) + self.login() + elif -301 == code: + logger.info('正在重新登陆........................', 14) + return (UNPACK_NEED_RESTART, b'') elif code: # raise RuntimeError('登录失败!') #登录失败 self.ioloop.stop() @@ -196,11 +235,9 @@ def unpack(self, buf): def start(wechat_usrname, wechat_passwd): + interface.init_all() ioloop = IOLoop.instance() - _, szlong_ip = get_ips() - interface.InitAll() tcp_client = ChatClient(ioloop=ioloop, usr_name=wechat_usrname, passwd=wechat_passwd, recv_cb=recv_data_handler, - host=szlong_ip[0], port=443) + host=dns_ip.fetch_longlink_ip(), port=443) tcp_client.start() - PeriodicCallback(tcp_client.send_heart_beat, 1000*60).start() # start scheduler ioloop.start() diff --git a/microchat/define.py b/microchat/define.py index 7abdf96..e67482c 100644 --- a/microchat/define.py +++ b/microchat/define.py @@ -1,10 +1,11 @@ __CLIENT_VERSION__ = 637927472 -__GUID__ = "A31d1d52a153928" -__CLIENT_SEQID__ = __GUID__ + "_1520395200010" -__CLIENT_SEQID_SIGN__ = "e89b245e12c398afbf39eb65f9978e19" -__IMEI__ = "865310173290678" -__ANDROID_ID__ = "eabc1f251716a49f" -__ANDROID_VER__ = "android-26" +GUID = "Aff0aef642a31fc2" +__GUID__ = GUID[:15] +__CLIENT_SEQID__ = GUID + "_1522827110765" +__CLIENT_SEQID_SIGN__ = "e89b158e4bcf988ebd09eb83f5378e87" +__IMEI__ = "865166024671219" +__ANDROID_ID__ = "d3151233cfbb4fd4" +__ANDROID_VER__ = "android-22" __MANUFACTURER__ = "iPhone" __MODELNAME__ = "X" __MOBILE_WIFI_MAC_ADDRESS__ = "01:61:19:58:78:d3" diff --git a/microchat/dns_ip.py b/microchat/dns_ip.py index 75a27d5..0a565a9 100644 --- a/microchat/dns_ip.py +++ b/microchat/dns_ip.py @@ -3,24 +3,85 @@ ''' import requests +import os +import sqlite3 from bs4 import BeautifulSoup +from random import choice +# 登录返回-301自动切换DNS +dns_retry_times = 3 + +# 短链接ip池 +short_ip = [] + +# 长链接ip池 +long_ip = [] + +# dns db +conn_dns = None def get_ips(): '''访问'http://dns.weixin.qq.com/cgi-bin/micromsg-bin/newgetdns', - 返回短ip列表szshort_ip,长ip列表szlong_ip. + 返回短链接ip列表short_ip,长链接ip列表long_ip. ''' - szshort_ip = [] - szlong_ip = [] ret = requests.get( 'http://dns.weixin.qq.com/cgi-bin/micromsg-bin/newgetdns') soup = BeautifulSoup(ret.text, "html.parser") - szshort_weixin = soup.find( - 'domain', attrs={'name': 'szshort.weixin.qq.com'}) - [szshort_ip.append(ip.get_text()) for ip in szshort_weixin.select('ip')] - szlong_weixin = soup.find( - 'domain', attrs={'name': 'szlong.weixin.qq.com'}) - [szlong_ip.append(ip.get_text()) for ip in szlong_weixin.select('ip')] - - return szshort_ip, szlong_ip + short_weixin = soup.find( + 'domain', attrs={'name': 'short.weixin.qq.com'}) + [short_ip.append(ip.get_text()) for ip in short_weixin.select('ip')] + long_weixin = soup.find( + 'domain', attrs={'name': 'long.weixin.qq.com'}) + [long_ip.append(ip.get_text()) for ip in long_weixin.select('ip')] + + return short_ip, long_ip + +# 随机取出一个长链接ip地址 +def fetch_longlink_ip(): + if not long_ip: + get_ips() + return choice(long_ip) + +# 随机取出一个短链接ip地址 +def fetch_shortlink_ip(): + if not short_ip: + get_ips() + return choice(short_ip) + +# 尝试从db加载dns +def load_dns(): + global conn_dns,short_ip,long_ip + # 建db文件夹 + if not os.path.exists(os.getcwd() + '/db'): + os.mkdir(os.getcwd() + '/db') + # 建库 + conn_dns = sqlite3.connect('./db/dns.db') + cur = conn_dns.cursor() + # 建dns表(保存上次登录时的dns) + cur.execute('create table if not exists dns(host varchar(1024) unique, ip varchar(1024))') + # 加载dns + try: + cur.execute('select ip from dns where host = "short.weixin.qq.com"') + row = cur.fetchone() + if row: + short_ip = row[0].split(',') + cur.execute('select ip from dns where host = "long.weixin.qq.com"') + row = cur.fetchone() + if row: + long_ip = row[0].split(',') + except: + pass + return + +# 保存dns到db +def save_dns(): + try: + conn_dns.commit() + conn_dns.execute('delete from dns') + conn_dns.execute('insert into dns(host,ip) values("{}","{}")'.format('short.weixin.qq.com', ','.join(short_ip))) + conn_dns.execute('insert into dns(host,ip) values("{}","{}")'.format('long.weixin.qq.com', ','.join(long_ip))) + conn_dns.commit() + except: + pass + return \ No newline at end of file diff --git a/microchat/ecdh/__init__.py b/microchat/ecdh/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/microchat/ecdh/ecdh.py b/microchat/ecdh/ecdh.py new file mode 100644 index 0000000..6218ed7 --- /dev/null +++ b/microchat/ecdh/ecdh.py @@ -0,0 +1,117 @@ +from .openssl import OpenSSL +import ctypes +import sys +import hashlib + +MD5_DIGEST_LENGTH = 16 + +def int_to_bytes(x): + return x.to_bytes((x.bit_length() + 7) // 8, sys.byteorder) + +def int_from_bytes(xbytes): + return int.from_bytes(xbytes, sys.byteorder) + +# 使用c接口生成ECDH本地密钥对 +def gen_ecdh(curve=713): + # EC_KEY *ec_key = EC_KEY_new_by_curve_name(nid); + ec_key = OpenSSL.EC_KEY_new_by_curve_name(curve) + if ec_key == 0: + raise Exception("[OpenSSL] EC_KEY_new_by_curve_name FAIL ... " + OpenSSL.get_error()) + + # int ret = EC_KEY_generate_key(ec_key); + if (OpenSSL.EC_KEY_generate_key(ec_key)) == 0: + OpenSSL.EC_KEY_free(ec_key) + raise Exception("[OpenSSL] EC_KEY_generate_key FAIL ... " + OpenSSL.get_error()) + + if (OpenSSL.EC_KEY_check_key(ec_key)) == 0: + OpenSSL.EC_KEY_free(ec_key) + raise Exception("[OpenSSL] EC_KEY_check_key FAIL ... " + OpenSSL.get_error()) + + # int nLenPub = i2o_ECPublicKey(ec_key, NULL); + len_pub = OpenSSL.i2o_ECPublicKey(ec_key, None) + out_pub_key = ctypes.POINTER(ctypes.c_ubyte)() + if (OpenSSL.i2o_ECPublicKey(ec_key, ctypes.byref(out_pub_key))) == 0: + OpenSSL.EC_KEY_free(ec_key) + raise Exception("[OpenSSL] i2o_ECPublicKey FAIL ... " + OpenSSL.get_error()) + + lpub_key = [0]*len_pub + for x in range(len_pub): + lpub_key[x] = out_pub_key[x] + pub_key = bytes(bytearray(lpub_key)) + OpenSSL.OPENSSL_free(out_pub_key, None, 0) + + # int nLenPub = i2d_ECPrivateKey(ec_key, NULL); + len_pri = OpenSSL.i2d_ECPrivateKey(ec_key, None) + out_pri_key = ctypes.POINTER(ctypes.c_ubyte)() + if (OpenSSL.i2d_ECPrivateKey(ec_key, ctypes.byref(out_pri_key))) == 0: + OpenSSL.EC_KEY_free(ec_key) + raise Exception("[OpenSSL] i2d_ECPrivateKey FAIL ... " + OpenSSL.get_error()) + + lpri_key = [0]*len_pri + for y in range(len_pri): + lpri_key[y] = out_pri_key[y] + pri_key = bytes(bytearray(lpri_key)) + OpenSSL.OPENSSL_free(out_pri_key, None, 0) + + OpenSSL.EC_KEY_free(ec_key) + + return pub_key, len_pub, pri_key, len_pri + +# void *KDF_MD5(const void *in, size_t inlen, void *out, size_t *outlen) +def kdf_md5(arr_in, in_len, arr_out, out_len): + p_arr_in = ctypes.c_char_p(arr_in) + p_arr_out = ctypes.c_char_p(arr_out) + p_out_len = ctypes.POINTER(ctypes.c_long)(out_len) + src = p_arr_in.value + m = hashlib.md5() + m.update(src) + digest_m = m.digest() + p_out_len.value = MD5_DIGEST_LENGTH + p_arr_out.value = digest_m[:] + return arr_out + +# 密钥协商 +def do_ecdh(curve, server_pub_key, local_pri_key): + + pub_ec_key = OpenSSL.EC_KEY_new_by_curve_name(curve) + if pub_ec_key == 0: + raise Exception("[OpenSSL] o2i_ECPublicKey FAIL ... " + OpenSSL.get_error()) + public_material = ctypes.c_char_p(server_pub_key) + p_pub_ec_key = ctypes.c_void_p(pub_ec_key) + pub_ec_key = OpenSSL.o2i_ECPublicKey(ctypes.byref(p_pub_ec_key), ctypes.byref(public_material), len(server_pub_key)) + if pub_ec_key == 0: + OpenSSL.EC_KEY_free(pub_ec_key) + raise Exception("[OpenSSL] o2i_ECPublicKey FAIL ... " + OpenSSL.get_error()) + + pri_ec_key = OpenSSL.EC_KEY_new_by_curve_name(curve) + if pri_ec_key == 0: + OpenSSL.EC_KEY_free(pub_ec_key) + raise Exception("[OpenSSL] d2i_ECPrivateKey FAIL ... " + OpenSSL.get_error()) + private_material = ctypes.c_char_p(local_pri_key) + p_pri_ec_key = ctypes.c_void_p(pri_ec_key) + pri_ec_key = OpenSSL.d2i_ECPrivateKey(ctypes.byref(p_pri_ec_key), ctypes.byref(private_material), len(local_pri_key)) + if pri_ec_key == 0: + OpenSSL.EC_KEY_free(pub_ec_key) + OpenSSL.EC_KEY_free(pri_ec_key) + raise Exception("[OpenSSL] d2i_ECPrivateKey FAIL ... " + OpenSSL.get_error()) + + share_key = ctypes.create_string_buffer(2048) + + # 回调函数 + # void *KDF_MD5(const void *in, size_t inlen, void *out, size_t *outlen) + # KD_MD5 = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_long, ctypes.c_void_p, ctypes.POINTER(ctypes.c_long)) + # cb = KD_MD5(kdf_md5) + + ret = OpenSSL.ECDH_compute_key(share_key, 28, OpenSSL.EC_KEY_get0_public_key(pub_ec_key), pri_ec_key, 0) + + OpenSSL.EC_KEY_free(pub_ec_key) + OpenSSL.EC_KEY_free(pri_ec_key) + + if ret: + # 对share_key取md5 + m = hashlib.md5() + m.update(share_key.value) + digest_m = m.digest() + + return MD5_DIGEST_LENGTH, digest_m + return 0, None diff --git a/microchat/ecdh/openssl.py b/microchat/ecdh/openssl.py new file mode 100644 index 0000000..f991ef1 --- /dev/null +++ b/microchat/ecdh/openssl.py @@ -0,0 +1,526 @@ +import sys +import os +import ctypes +import ctypes.util +import platform + +OpenSSL = None + + +class CipherName: + def __init__(self, name, pointer, blocksize): + self._name = name + self._pointer = pointer + self._blocksize = blocksize + + def __str__(self): + return ("Cipher : %s | Blocksize : %s | Fonction pointer : %s" % + (self._name, str(self._blocksize), str(self._pointer))) + + def get_pointer(self): + return self._pointer() + + def get_name(self): + return self._name + + def get_blocksize(self): + return self._blocksize + + +class _OpenSSL: + """ + Wrapper for OpenSSL using ctypes + """ + def __init__(self, library): + """ + Build the wrapper + """ + self._lib = ctypes.CDLL(library) + + self.pointer = ctypes.pointer + self.c_int = ctypes.c_int + self.byref = ctypes.byref + self.create_string_buffer = ctypes.create_string_buffer + + self.ERR_error_string = self._lib.ERR_error_string + self.ERR_error_string.restype = ctypes.c_char_p + self.ERR_error_string.argtypes = [ctypes.c_ulong, ctypes.c_char_p] + + self.ERR_get_error = self._lib.ERR_get_error + self.ERR_get_error.restype = ctypes.c_ulong + self.ERR_get_error.argtypes = [] + + self.BN_new = self._lib.BN_new + self.BN_new.restype = ctypes.c_void_p + self.BN_new.argtypes = [] + + self.BN_free = self._lib.BN_free + self.BN_free.restype = None + self.BN_free.argtypes = [ctypes.c_void_p] + + self.OPENSSL_free = self._lib.CRYPTO_free + self.OPENSSL_free.restype = None + self.OPENSSL_free.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int] + + self.BN_num_bits = self._lib.BN_num_bits + self.BN_num_bits.restype = ctypes.c_int + self.BN_num_bits.argtypes = [ctypes.c_void_p] + + self.BN_bn2bin = self._lib.BN_bn2bin + self.BN_bn2bin.restype = ctypes.c_int + self.BN_bn2bin.argtypes = [ctypes.c_void_p, ctypes.c_void_p] + + self.BN_bin2bn = self._lib.BN_bin2bn + self.BN_bin2bn.restype = ctypes.c_void_p + self.BN_bin2bn.argtypes = [ctypes.c_void_p, ctypes.c_int, + ctypes.c_void_p] + + self.EC_GROUP_get_degree = self._lib.EC_GROUP_get_degree + self.EC_GROUP_get_degree.restype = ctypes.c_int + self.EC_GROUP_get_degree.argtypes = [ctypes.c_void_p] + + self.EC_KEY_free = self._lib.EC_KEY_free + self.EC_KEY_free.restype = None + self.EC_KEY_free.argtypes = [ctypes.c_void_p] + + self.EC_KEY_new_by_curve_name = self._lib.EC_KEY_new_by_curve_name + self.EC_KEY_new_by_curve_name.restype = ctypes.c_void_p + self.EC_KEY_new_by_curve_name.argtypes = [ctypes.c_int] + + self.EC_KEY_generate_key = self._lib.EC_KEY_generate_key + self.EC_KEY_generate_key.restype = ctypes.c_int + self.EC_KEY_generate_key.argtypes = [ctypes.c_void_p] + + self.EC_KEY_check_key = self._lib.EC_KEY_check_key + self.EC_KEY_check_key.restype = ctypes.c_int + self.EC_KEY_check_key.argtypes = [ctypes.c_void_p] + + self.EC_KEY_get0_private_key = self._lib.EC_KEY_get0_private_key + self.EC_KEY_get0_private_key.restype = ctypes.c_void_p + self.EC_KEY_get0_private_key.argtypes = [ctypes.c_void_p] + + self.EC_KEY_get0_public_key = self._lib.EC_KEY_get0_public_key + self.EC_KEY_get0_public_key.restype = ctypes.c_void_p + self.EC_KEY_get0_public_key.argtypes = [ctypes.c_void_p] + + self.EC_KEY_get0_group = self._lib.EC_KEY_get0_group + self.EC_KEY_get0_group.restype = ctypes.c_void_p + self.EC_KEY_get0_group.argtypes = [ctypes.c_void_p] + + self.EC_POINT_get_affine_coordinates_GFp = self._lib.EC_POINT_get_affine_coordinates_GFp + self.EC_POINT_get_affine_coordinates_GFp.restype = ctypes.c_int + self.EC_POINT_get_affine_coordinates_GFp.argtypes = 5 * [ctypes.c_void_p] + + self.EC_KEY_set_private_key = self._lib.EC_KEY_set_private_key + self.EC_KEY_set_private_key.restype = ctypes.c_int + self.EC_KEY_set_private_key.argtypes = [ctypes.c_void_p, + ctypes.c_void_p] + + self.EC_KEY_set_public_key = self._lib.EC_KEY_set_public_key + self.EC_KEY_set_public_key.restype = ctypes.c_int + self.EC_KEY_set_public_key.argtypes = [ctypes.c_void_p, + ctypes.c_void_p] + + self.EC_KEY_set_group = self._lib.EC_KEY_set_group + self.EC_KEY_set_group.restype = ctypes.c_int + self.EC_KEY_set_group.argtypes = [ctypes.c_void_p, ctypes.c_void_p] + + self.EC_POINT_set_affine_coordinates_GFp = self._lib.EC_POINT_set_affine_coordinates_GFp + self.EC_POINT_set_affine_coordinates_GFp.restype = ctypes.c_int + self.EC_POINT_set_affine_coordinates_GFp.argtypes = 5 * [ctypes.c_void_p] + + self.EC_POINT_new = self._lib.EC_POINT_new + self.EC_POINT_new.restype = ctypes.c_void_p + self.EC_POINT_new.argtypes = [ctypes.c_void_p] + + self.EC_POINT_free = self._lib.EC_POINT_free + self.EC_POINT_free.restype = None + self.EC_POINT_free.argtypes = [ctypes.c_void_p] + + self.BN_CTX_free = self._lib.BN_CTX_free + self.BN_CTX_free.restype = None + self.BN_CTX_free.argtypes = [ctypes.c_void_p] + + self.EC_POINT_mul = self._lib.EC_POINT_mul + self.EC_POINT_mul.restype = ctypes.c_int + self.EC_POINT_mul.argtypes = [ctypes.c_void_p, ctypes.c_void_p, + ctypes.c_void_p, ctypes.c_void_p, + ctypes.c_void_p, ctypes.c_void_p] + + self.EC_KEY_set_private_key = self._lib.EC_KEY_set_private_key + self.EC_KEY_set_private_key.restype = ctypes.c_int + self.EC_KEY_set_private_key.argtypes = [ctypes.c_void_p, + ctypes.c_void_p] + + # self.ECDH_OpenSSL = self._lib.ECDH_OpenSSL + # self._lib.ECDH_OpenSSL.restype = ctypes.c_void_p + # self._lib.ECDH_OpenSSL.argtypes = [] + + self.BN_CTX_new = self._lib.BN_CTX_new + self._lib.BN_CTX_new.restype = ctypes.c_void_p + self._lib.BN_CTX_new.argtypes = [] + + # self.ECDH_set_method = self._lib.ECDH_set_method + # self._lib.ECDH_set_method.restype = ctypes.c_int + # self._lib.ECDH_set_method.argtypes = [ctypes.c_void_p, ctypes.c_void_p] + + self.ECDH_compute_key = self._lib.ECDH_compute_key + self.ECDH_compute_key.restype = ctypes.c_int + self.ECDH_compute_key.argtypes = [ctypes.c_void_p, + ctypes.c_int, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p] + + self.EVP_CipherInit_ex = self._lib.EVP_CipherInit_ex + self.EVP_CipherInit_ex.restype = ctypes.c_int + self.EVP_CipherInit_ex.argtypes = [ctypes.c_void_p, + ctypes.c_void_p, ctypes.c_void_p] + + self.EVP_CIPHER_CTX_new = self._lib.EVP_CIPHER_CTX_new + self.EVP_CIPHER_CTX_new.restype = ctypes.c_void_p + self.EVP_CIPHER_CTX_new.argtypes = [] + + # Cipher + self.EVP_aes_128_cfb128 = self._lib.EVP_aes_128_cfb128 + self.EVP_aes_128_cfb128.restype = ctypes.c_void_p + self.EVP_aes_128_cfb128.argtypes = [] + + self.EVP_aes_256_cfb128 = self._lib.EVP_aes_256_cfb128 + self.EVP_aes_256_cfb128.restype = ctypes.c_void_p + self.EVP_aes_256_cfb128.argtypes = [] + + self.EVP_aes_128_cbc = self._lib.EVP_aes_128_cbc + self.EVP_aes_128_cbc.restype = ctypes.c_void_p + self.EVP_aes_128_cbc.argtypes = [] + + self.EVP_aes_256_cbc = self._lib.EVP_aes_256_cbc + self.EVP_aes_256_cbc.restype = ctypes.c_void_p + self.EVP_aes_256_cbc.argtypes = [] + + try: + self.EVP_aes_128_ctr = self._lib.EVP_aes_128_ctr + except AttributeError: + pass + else: + self.EVP_aes_128_ctr.restype = ctypes.c_void_p + self.EVP_aes_128_ctr.argtypes = [] + + try: + self.EVP_aes_256_ctr = self._lib.EVP_aes_256_ctr + except AttributeError: + pass + else: + self.EVP_aes_256_ctr.restype = ctypes.c_void_p + self.EVP_aes_256_ctr.argtypes = [] + + self.EVP_aes_128_ofb = self._lib.EVP_aes_128_ofb + self.EVP_aes_128_ofb.restype = ctypes.c_void_p + self.EVP_aes_128_ofb.argtypes = [] + + self.EVP_aes_256_ofb = self._lib.EVP_aes_256_ofb + self.EVP_aes_256_ofb.restype = ctypes.c_void_p + self.EVP_aes_256_ofb.argtypes = [] + + self.EVP_bf_cbc = self._lib.EVP_bf_cbc + self.EVP_bf_cbc.restype = ctypes.c_void_p + self.EVP_bf_cbc.argtypes = [] + + self.EVP_bf_cfb64 = self._lib.EVP_bf_cfb64 + self.EVP_bf_cfb64.restype = ctypes.c_void_p + self.EVP_bf_cfb64.argtypes = [] + + self.EVP_rc4 = self._lib.EVP_rc4 + self.EVP_rc4.restype = ctypes.c_void_p + self.EVP_rc4.argtypes = [] + + # self.EVP_CIPHER_CTX_cleanup = self._lib.EVP_CIPHER_CTX_cleanup + # self.EVP_CIPHER_CTX_cleanup.restype = ctypes.c_int + # self.EVP_CIPHER_CTX_cleanup.argtypes = [ctypes.c_void_p] + + self.EVP_CIPHER_CTX_free = self._lib.EVP_CIPHER_CTX_free + self.EVP_CIPHER_CTX_free.restype = None + self.EVP_CIPHER_CTX_free.argtypes = [ctypes.c_void_p] + + self.EVP_CipherUpdate = self._lib.EVP_CipherUpdate + self.EVP_CipherUpdate.restype = ctypes.c_int + self.EVP_CipherUpdate.argtypes = [ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_int] + + self.EVP_CipherFinal_ex = self._lib.EVP_CipherFinal_ex + self.EVP_CipherFinal_ex.restype = ctypes.c_int + self.EVP_CipherFinal_ex.argtypes = 3 * [ctypes.c_void_p] + + self.EVP_DigestInit = self._lib.EVP_DigestInit + self.EVP_DigestInit.restype = ctypes.c_int + self._lib.EVP_DigestInit.argtypes = 2 * [ctypes.c_void_p] + + self.EVP_DigestInit_ex = self._lib.EVP_DigestInit_ex + self.EVP_DigestInit_ex.restype = ctypes.c_int + self._lib.EVP_DigestInit_ex.argtypes = 3 * [ctypes.c_void_p] + + self.EVP_DigestUpdate = self._lib.EVP_DigestUpdate + self.EVP_DigestUpdate.restype = ctypes.c_int + self.EVP_DigestUpdate.argtypes = [ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_int] + + self.EVP_DigestFinal = self._lib.EVP_DigestFinal + self.EVP_DigestFinal.restype = ctypes.c_int + self.EVP_DigestFinal.argtypes = [ctypes.c_void_p, + ctypes.c_void_p, ctypes.c_void_p] + + self.EVP_DigestFinal_ex = self._lib.EVP_DigestFinal_ex + self.EVP_DigestFinal_ex.restype = ctypes.c_int + self.EVP_DigestFinal_ex.argtypes = [ctypes.c_void_p, + ctypes.c_void_p, ctypes.c_void_p] + + # self.EVP_ecdsa = self._lib.EVP_ecdsa + # self._lib.EVP_ecdsa.restype = ctypes.c_void_p + # self._lib.EVP_ecdsa.argtypes = [] + + self.ECDSA_sign = self._lib.ECDSA_sign + self.ECDSA_sign.restype = ctypes.c_int + self.ECDSA_sign.argtypes = [ctypes.c_int, + ctypes.c_void_p, + ctypes.c_int, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p] + + self.ECDSA_verify = self._lib.ECDSA_verify + self.ECDSA_verify.restype = ctypes.c_int + self.ECDSA_verify.argtypes = [ctypes.c_int, + ctypes.c_void_p, + ctypes.c_int, + ctypes.c_void_p, + ctypes.c_int, + ctypes.c_void_p] + + # self.EVP_MD_CTX_create = self._lib.EVP_MD_CTX_create + # self.EVP_MD_CTX_create.restype = ctypes.c_void_p + # self.EVP_MD_CTX_create.argtypes = [] + + # self.EVP_MD_CTX_init = self._lib.EVP_MD_CTX_init + # self.EVP_MD_CTX_init.restype = None + # self.EVP_MD_CTX_init.argtypes = [ctypes.c_void_p] + + # self.EVP_MD_CTX_destroy = self._lib.EVP_MD_CTX_destroy + # self.EVP_MD_CTX_destroy.restype = None + # self.EVP_MD_CTX_destroy.argtypes = [ctypes.c_void_p] + + self.RAND_bytes = self._lib.RAND_bytes + self.RAND_bytes.restype = ctypes.c_int + self.RAND_bytes.argtypes = [ctypes.c_void_p, ctypes.c_int] + + self.EVP_sha256 = self._lib.EVP_sha256 + self.EVP_sha256.restype = ctypes.c_void_p + self.EVP_sha256.argtypes = [] + + self.i2o_ECPublicKey = self._lib.i2o_ECPublicKey + self.i2o_ECPublicKey.restype = ctypes.c_int + # self.i2o_ECPublicKey.argtypes = [ctypes.c_void_p, ctypes.c_void_p] + self.i2o_ECPublicKey.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.POINTER(ctypes.c_ubyte))] + + self.i2d_ECPrivateKey = self._lib.i2d_ECPrivateKey + self.i2d_ECPrivateKey.restype = ctypes.c_int + # self.i2d_ECPrivateKey.argtypes = [ctypes.c_void_p, ctypes.c_void_p] + self.i2d_ECPrivateKey.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.POINTER(ctypes.c_ubyte))] + + self.o2i_ECPublicKey = self._lib.o2i_ECPublicKey + self.o2i_ECPublicKey.restype = ctypes.c_void_p + self.o2i_ECPublicKey.argtypes = [ctypes.POINTER(ctypes.c_void_p), ctypes.POINTER(ctypes.c_char_p), ctypes.c_long] + + self.d2i_ECPrivateKey = self._lib.d2i_ECPrivateKey + self.d2i_ECPrivateKey.restype = ctypes.c_void_p + self.d2i_ECPrivateKey.argtypes = [ctypes.POINTER(ctypes.c_void_p), ctypes.POINTER(ctypes.c_char_p), ctypes.c_long] + + self.EVP_sha512 = self._lib.EVP_sha512 + self.EVP_sha512.restype = ctypes.c_void_p + self.EVP_sha512.argtypes = [] + + self.HMAC = self._lib.HMAC + self.HMAC.restype = ctypes.c_void_p + self.HMAC.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int, + ctypes.c_void_p, ctypes.c_int, + ctypes.c_void_p, ctypes.c_void_p] + + try: + self.PKCS5_PBKDF2_HMAC = self._lib.PKCS5_PBKDF2_HMAC + except: + # The above is not compatible with all versions of OSX. + self.PKCS5_PBKDF2_HMAC = self._lib.PKCS5_PBKDF2_HMAC_SHA1 + self.PKCS5_PBKDF2_HMAC.restype = ctypes.c_int + self.PKCS5_PBKDF2_HMAC.argtypes = [ctypes.c_void_p, ctypes.c_int, + ctypes.c_void_p, ctypes.c_int, + ctypes.c_int, ctypes.c_void_p, + ctypes.c_int, ctypes.c_void_p] + + self._set_ciphers() + self._set_curves() + + def _set_ciphers(self): + self.cipher_algo = { + 'aes-128-cbc': CipherName('aes-128-cbc', + self.EVP_aes_128_cbc, + 16), + 'aes-256-cbc': CipherName('aes-256-cbc', + self.EVP_aes_256_cbc, + 16), + 'aes-128-cfb': CipherName('aes-128-cfb', + self.EVP_aes_128_cfb128, + 16), + 'aes-256-cfb': CipherName('aes-256-cfb', + self.EVP_aes_256_cfb128, + 16), + 'aes-128-ofb': CipherName('aes-128-ofb', + self._lib.EVP_aes_128_ofb, + 16), + 'aes-256-ofb': CipherName('aes-256-ofb', + self._lib.EVP_aes_256_ofb, + 16), + # 'aes-128-ctr': CipherName('aes-128-ctr', + # self._lib.EVP_aes_128_ctr, + # 16), + # 'aes-256-ctr': CipherName('aes-256-ctr', + # self._lib.EVP_aes_256_ctr, + # 16), + 'bf-cfb': CipherName('bf-cfb', + self.EVP_bf_cfb64, + 8), + 'bf-cbc': CipherName('bf-cbc', + self.EVP_bf_cbc, + 8), + 'rc4': CipherName('rc4', + self.EVP_rc4, + # 128 is the initialisation size not block size + 128), + } + + if hasattr(self, 'EVP_aes_128_ctr'): + self.cipher_algo['aes-128-ctr'] = CipherName( + 'aes-128-ctr', + self._lib.EVP_aes_128_ctr, + 16 + ) + if hasattr(self, 'EVP_aes_256_ctr'): + self.cipher_algo['aes-256-ctr'] = CipherName( + 'aes-256-ctr', + self._lib.EVP_aes_256_ctr, + 16 + ) + + def _set_curves(self): + self.curves = { + 'secp112r1': 704, + 'secp112r2': 705, + 'secp128r1': 706, + 'secp128r2': 707, + 'secp160k1': 708, + 'secp160r1': 709, + 'secp160r2': 710, + 'secp192k1': 711, + 'secp224k1': 712, + 'secp224r1': 713, + 'secp256k1': 714, + 'secp384r1': 715, + 'secp521r1': 716, + 'sect113r1': 717, + 'sect113r2': 718, + 'sect131r1': 719, + 'sect131r2': 720, + 'sect163k1': 721, + 'sect163r1': 722, + 'sect163r2': 723, + 'sect193r1': 724, + 'sect193r2': 725, + 'sect233k1': 726, + 'sect233r1': 727, + 'sect239k1': 728, + 'sect283k1': 729, + 'sect283r1': 730, + 'sect409k1': 731, + 'sect409r1': 732, + 'sect571k1': 733, + 'sect571r1': 734, + 'prime256v1': 415, + } + + def BN_num_bytes(self, x): + """ + returns the length of a BN (OpenSSl API) + """ + return int((self.BN_num_bits(x) + 7) / 8) + + def get_cipher(self, name): + """ + returns the OpenSSL cipher instance + """ + if name not in self.cipher_algo: + raise Exception("Unknown cipher") + return self.cipher_algo[name] + + def get_curve(self, name): + """ + returns the id of a elliptic curve + """ + if name not in self.curves: + raise Exception("Unknown curve") + return self.curves[name] + + def get_curve_by_id(self, id): + """ + returns the name of a elliptic curve with his id + """ + res = None + for i in self.curves: + if self.curves[i] == id: + res = i + break + if res is None: + raise Exception("Unknown curve") + return res + + def rand(self, size): + """ + OpenSSL random function + """ + buffer = self.malloc(0, size) + if self.RAND_bytes(buffer, size) != 1: + raise RuntimeError("OpenSSL RAND_bytes failed") + return buffer.raw + + def malloc(self, data, size): + """ + returns a create_string_buffer (ctypes) + """ + buffer = None + if data != 0: + if sys.version_info.major == 3 and isinstance(data, type('')): + data = data.encode() + buffer = self.create_string_buffer(data, size) + else: + buffer = self.create_string_buffer(size) + return buffer + + def get_error(self): + return OpenSSL.ERR_error_string(OpenSSL.ERR_get_error(), None) + +# libname = ctypes.util.find_library('crypto') + +def load_opensll_dll(): + # path = os.getcwd() + '/libeay32.dll' + path = os.getcwd() + if platform.architecture()[0] == '64bit': + path += '/microchat/ecdh/x64/libeay32.dll' + else: + path += '/microchat/ecdh/x86/libeay32.dll' + libname = ctypes.util.find_library(path) + if libname is None: + raise Exception("Couldn't load OpenSSL lib ...") + return libname + +OpenSSL = _OpenSSL(load_opensll_dll()) diff --git a/microchat/ecdh/x64/libeay32.dll b/microchat/ecdh/x64/libeay32.dll new file mode 100644 index 0000000..4ca52ca Binary files /dev/null and b/microchat/ecdh/x64/libeay32.dll differ diff --git a/microchat/ecdh/x86/libeay32.dll b/microchat/ecdh/x86/libeay32.dll new file mode 100644 index 0000000..685d19e Binary files /dev/null and b/microchat/ecdh/x86/libeay32.dll differ diff --git a/microchat/interface.py b/microchat/interface.py index 767b105..d68e82b 100644 --- a/microchat/interface.py +++ b/microchat/interface.py @@ -12,15 +12,11 @@ from . import business from . import Util from . import mm_pb2 -from .plugin.logger_wrapper import logger +from .plugin.logger_wrapper import logger, ColorDefine from google.protobuf.internal import decoder, encoder +from . import logo_bingo -# 获取长短链接Ip -def GetDns(): - (ipShort,ipLong) = dns_ip.get_ips() - return {'longip':ipLong[0], 'shortip':ipShort[0]} - # 登录,参数为账号,密码 def Login(name, password): # 组包 @@ -56,10 +52,10 @@ def new_sync(): # 解包 return business.new_sync_buf2resp(ret_bytes) -# 发消息(Utf-8编码) -def new_send_msg(to_wxid, msg_content, msg_type=1): +# 发消息(Utf-8编码)(使用at功能时消息内容必须至少有相同数量的@符号,允许不以\u2005结尾) +def new_send_msg(to_wxid, msg_content, at_user_list = [], msg_type=1): # 组包 - send_data = business.new_send_msg_req2buf(to_wxid, msg_content, msg_type) + send_data = business.new_send_msg_req2buf(to_wxid, msg_content, at_user_list, msg_type) # 发包 ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/newsendmsg', send_data) logger.debug('new_send_msg返回数据:' + Util.b2hex(ret_bytes)) @@ -68,21 +64,21 @@ def new_send_msg(to_wxid, msg_content, msg_type=1): # 消息记录存入数据库 Util.insert_msg_to_db(svrid, Util.get_utc(), Util.wxid,to_wxid, msg_type, msg_content.decode()) # 返回发送消息结果 - return ret_code + return ret_code, svrid # 分享链接 def send_app_msg(to_wxid, title, des, link_url, thumb_url=''): # 组包 - (send_data, msg_content) = business.send_app_msg_req2buf(to_wxid, title, des, link_url, thumb_url) + send_data, msg_content, client_msg_id = business.send_app_msg_req2buf(to_wxid, title, des, link_url, thumb_url) # 发包 ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/sendappmsg', send_data) logger.debug('send_app_msg返回数据:' + Util.b2hex(ret_bytes)) # 解包 (ret_code, svrid) = business.send_app_msg_buf2resp(ret_bytes) # 消息记录存入数据库 - Util.insert_msg_to_db(svrid, Util.get_utc(),Util.wxid, to_wxid, 5, msg_content) + Util.insert_msg_to_db(svrid, Util.get_utc(),Util.wxid, to_wxid, 5, msg_content, client_msg_id) # 返回发送消息结果 - return ret_code + return ret_code, svrid # 获取好友列表(wxid,昵称,备注,alias,v1_name,头像) def get_contact_list(contact_type=Util.CONTACT_TYPE_FRIEND): @@ -117,11 +113,219 @@ def receive_and_open_wxhb(channelId,msgType,nativeUrl,sendId,inWay = 1,ver='v1.0 return business.open_wxhb_buf2resp(ret_bytes) return (-1,'') +# 查看红包详情(limit,offset参数设置本次请求返回领取红包人数区间) +def qry_detail_wxhb(nativeUrl, sendId, limit = 11, offset = 0, ver='v1.0'): + # 组包 + send_data = business.qry_detail_wxhb_req2buf(nativeUrl, sendId, limit, offset, ver) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/mmpay-bin/qrydetailwxhb', send_data) + logger.debug('qrydetailwxhb返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.qry_detail_wxhb_buf2resp(ret_bytes) + +# 发emoji表情:file_name为emoji加密文件名; game_type=0直接发送emoji; game_type=1无视file_name参数,接收方播放石头剪刀布动画;其余game_type值均为投骰子动画; +# content只在game_type不为0即发送游戏表情时有效;content取1-3代表剪刀、石头、布;content取4-9代表投骰子1-6点; +def send_emoji(wxid, file_name, game_type, content): + # 组包 + send_data, client_msg_id = business.send_emoji_req2buf(wxid, file_name, game_type, content) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/sendemoji', send_data) + logger.debug('send_emoji返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + ret_code, svrid = business.send_emoji_buf2resp(ret_bytes) + # 消息记录存入数据库 + Util.insert_msg_to_db(svrid, Util.get_utc(), Util.wxid, wxid, 47, file_name, client_msg_id) + return ret_code, svrid + +# 收款 +def transfer_operation(invalid_time, trans_id, transaction_id, user_name): + # 组包 + send_data = business.transfer_operation_req2buf(invalid_time, trans_id, transaction_id, user_name) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/mmpay-bin/transferoperation', send_data) + logger.debug('transfer_operation返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.transfer_operation_buf2resp(ret_bytes) + +# 查询转账结果 +def transfer_query(invalid_time, trans_id, transfer_id): + # 组包 + send_data = business.transfer_query_req2buf(invalid_time, trans_id, transfer_id) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/mmpay-bin/transferquery', send_data) + logger.debug('transfer_query返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.transfer_query_buf2resp(ret_bytes) + +# 刷新好友信息(通讯录中的好友或群聊可以获取详细信息;陌生人仅可获取昵称和头像) +def get_contact(wxid): + # 组包 + send_data = business.get_contact_req2buf(wxid) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/getcontact', send_data) + logger.debug('get_contact返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.get_contact_buf2resp(ret_bytes) + +# 获取群成员列表 +def get_chatroom_member_list(wxid): + friend, __ = get_contact(wxid) + return [member.wxid for member in friend.group_member_list.member] + +# 建群聊(参数group_member_list为群成员wxid)(建群成功返回新建群聊的wxid) +def create_chatroom(group_member_list): + # 组包 + send_data = business.create_chatroom_req2buf(group_member_list) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/createchatroom', send_data) + logger.debug('createchatroom返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.create_chatroom_buf2resp(ret_bytes) + +# 面对面建群(参数为群密码,建群地点经纬度)(无需好友建群方便测试) +# 建群成功返回新建群聊的wxid;系统会发10000消息通知群创建成功;使用相同密码短时间内会返回同一群聊 +def mm_facing_create_chatroom(pwd = '9999', lon = 116.39, lat = 38.90): + # 面对面建群步骤1组包 + send_data = business.mm_facing_create_chatroom_req2buf(0, pwd, lon, lat) + # 面对面建群步骤1发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/mmfacingcreatechatroom', send_data) + logger.debug('mmfacingcreatechatroom返回数据:' + Util.b2hex(ret_bytes)) + # 面对面建群步骤1解包 + ret, wxid = business.mm_facing_create_chatroom_buf2resp(ret_bytes, 0) + if not ret: + # 面对面建群步骤2组包 + send_data = business.mm_facing_create_chatroom_req2buf(1, pwd, lon, lat) + # 面对面建群步骤2发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/mmfacingcreatechatroom', send_data) + logger.debug('mmfacingcreatechatroom返回数据:' + Util.b2hex(ret_bytes)) + # 面对面建群步骤2解包 + ret, wxid = business.mm_facing_create_chatroom_buf2resp(ret_bytes, 1) + return wxid + return '' + +# 群聊拉人 +def add_chatroom_member(chatroom_wxid, member_list): + # 组包 + send_data = business.add_chatroom_member_req2buf(chatroom_wxid, member_list) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/addchatroommember', send_data) + logger.debug('addchatroommember返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.add_chatroom_member_buf2resp(ret_bytes) + +# 群聊中at所有人(每100人一条消息)(最后发送文字消息) +def at_all_in_group(chatroom_wxid, send_text): + group, __ = get_contact(chatroom_wxid) + at_text = '' + at_list = [] + for i in range(group.group_member_list.cnt): + if i and i%100 == 0: + #每at100人发送一次消息 + new_send_msg(chatroom_wxid,at_text.encode(encoding = 'utf-8'), at_list) + at_text = '' + at_list = [] + at_text += '@{}'.format(group.group_member_list.member[i].nick_name) + at_list.append(group.group_member_list.member[i].wxid) + if at_text and at_list: + new_send_msg(chatroom_wxid,at_text.encode(encoding = 'utf-8'), at_list) + # 发送文字消息 + if send_text: + new_send_msg(chatroom_wxid,send_text.encode(encoding = 'utf-8')) + return + +# 设置群聊中自己昵称(utf-8) +def set_group_nick_name(chatroom_wxid, nick_name): + # 组包 + send_data = business.set_group_nick_name_req2buf(chatroom_wxid, nick_name) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/oplog', send_data) + logger.debug('oplog返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.set_group_nick_name_buf2resp(ret_bytes) + +# 消息撤回 +def revoke_msg(wxid, svrid): + # 组包 + send_data = business.revoke_msg_req2buf(wxid, svrid) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/revokemsg', send_data) + logger.debug('revokemsg返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.revoke_msg_buf2resp(ret_bytes) + +# 从通讯录中删除好友/恢复好友(删除对方后可以用此接口再添加对方) +# 群聊使用此接口可以保存到通讯录 +def delete_friend(wxid, delete = True): + # 获取好友(群聊)详细信息 + friend, __ = get_contact(wxid) + # 设置保存通讯录标志位 + if delete: + friend.type = (friend.type>>1)<<1 # 清零 + else: + friend.type |= 1 # 置1 + # 组包 + send_data = business.op_friend_req2buf(friend.SerializeToString()) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/oplog', send_data) + logger.debug('oplog返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.op_friend_buf2resp(ret_bytes) + +# 拉黑/恢复 好友关系 +def ban_friend(wxid, ban = True): + # 获取好友(群聊)详细信息 + friend, __ = get_contact(wxid) + # 设置黑名单标志位 + if ban: + friend.type |= 1<<3 # 置1 + else: + friend.type = ((friend.type>>4)<<4) + (friend.type&7) # 清零 + # 组包 + send_data = business.op_friend_req2buf(friend.SerializeToString()) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/oplog', send_data) + logger.debug('oplog返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.op_friend_buf2resp(ret_bytes) + +# 设置好友备注名/群聊名 +def set_friend_name(wxid, name): + cmd_id = 2 + # 获取好友(群聊)详细信息 + friend, __ = get_contact(wxid) + if wxid.endswith('@chatroom'): + # 群聊: 设置群聊名/cmd_id + friend.nickname.name = name + cmd_id = 27 + else: + # 好友: 设置备注名 + friend.remark_name.name = name + # 组包 + send_data = business.op_friend_req2buf(friend.SerializeToString(), cmd_id) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/oplog', send_data) + logger.debug('oplog返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.op_friend_buf2resp(ret_bytes) + +# 发布群公告(仅限群主;自动@所有人) +def set_chatroom_announcement(wxid, text): + # 组包 + send_data = business.set_chatroom_announcement_req2buf(wxid, text) + # 发包 + ret_bytes = Util.mmPost('/cgi-bin/micromsg-bin/setchatroomannouncement', send_data) + logger.debug('setchatroomannouncement返回数据:' + Util.b2hex(ret_bytes)) + # 解包 + return business.set_chatroom_announcement_buf2resp(ret_bytes) + # 初始化python模块 -def InitAll(): - # Util.initLog() - Util.ip = GetDns() +def init_all(): + #配置logger + logger.config("microchat", out=2) + logo_bingo() # 初始化ECC key if not Util.GenEcdhKey(): - logger.info('初始化ECC Key失败!') + logger.error('初始化ECC Key失败!') Util.ExitProcess() + # 从db加载dns + dns_ip.load_dns() diff --git a/microchat/mm.proto b/microchat/mm.proto index 59a893f..a2df72c 100644 --- a/microchat/mm.proto +++ b/microchat/mm.proto @@ -73,7 +73,7 @@ message Msg optional int32 tag7 = 7; optional bytes tag8 = 8; optional int32 createTime = 9; //消息发送时间 - optional string anticlient = 10; + optional string ex_info = 10; //消息附加内容(群是否屏蔽,群人数,群at功能) optional string xmlContent = 11; //推送内容(xml格式) optional int64 svrId = 12; //每条消息的唯一id optional int32 msgKey = 13; //sync key中的id @@ -101,7 +101,7 @@ message contact_info optional int32 sex = 5; //性别:0=>未知,1=>男,2=>女 optional string tag6 = 6; optional int32 tag7 = 7; - optional int32 type = 8; //好友状态:11=>拉黑 + optional int32 type = 8; //好友状态: optional int32 tag9 = 9; message BeiZhu { @@ -162,7 +162,9 @@ message contact_info message MemberInfo { optional string wxid = 1; + optional string nick_name = 2; //昵称(非群昵称) optional int32 tag6 = 6; + optional string inviteer_wxid = 7; //邀请入群wxid optional int32 tag8 = 8; } repeated MemberInfo member = 2; @@ -226,7 +228,12 @@ message ManualAuthDeviceRequest optional mmStr tag4 = 4; } optional __Tag2 tag2 = 2; - optional mmStr tag3 = 3; + message TAG3 + { + optional string tag1 = 1; + optional string tag2 = 2; + } + optional TAG3 tag3 = 3; optional mmStr tag4 = 4; optional mmStr tag5 = 5; optional int32 tag6 = 6; @@ -313,7 +320,39 @@ message ManualAuthResponse } optional AccountInfo accountInfo = 4; //登录成功后返回账号信息 - optional bytes dnsInfo = 5; //dns信息 + message dns_info + { + message redirect_info + { + optional int32 cnt = 1; //host cnt + message real_host_info + { + optional string host = 1; //host + optional string redirect = 2; //redirect_host + } + repeated real_host_info real_host = 2; + } + optional redirect_info redirect = 1; //域名重定向信息 + message ip_info + { + optional int32 longlink_ip_cnt = 1; //长链接ip池数量 + optional int32 shortlink_ip_cnt = 2; //短链接ip池数量 + message longlink_ip_info + { + optional string ip = 3; //ip + optional string host = 4; //host + } + repeated longlink_ip_info longlink = 3; //长链接ip池 + message shortlink_ip_info + { + optional string ip = 3; //ip + optional string host = 4; //host + } + repeated shortlink_ip_info shortlink = 4; //短链接ip池 + } + optional ip_info ip = 3; //长短链接ip + } + optional dns_info dns = 5; //dns信息 } //新设备第一次登录初始化请求 @@ -380,6 +419,7 @@ message new_send_msg_req optional int32 type = 3; //消息类型: 文字消息=>1,名片=>42, optional int32 utc = 4; optional int32 client_id = 5; //不同消息的utc与client_id必须至少有1个不相同 + optional string at_list = 6; //群聊at功能 } optional msg_info msg = 2; //这里可以是repeated,允许一次发送多条消息 } @@ -412,7 +452,7 @@ message new_send_app_msg_req optional int32 type = 5; //app_msg type == 5 optional string content = 6; //appmsg具体信息 optional int32 utc = 7; - optional string client_id = 8; //to_wxid+randomin+T+utc + optional string client_id = 8; //to_wxid+randomint+T+utc optional int32 tag10 = 10; //unknown just set 3 optional int32 tag11 = 11; //unknown just set 0 } @@ -519,3 +559,330 @@ message open_wxhb_resp optional int32 ret_code = 6; //错误码 416:需要实名认证 optional string ret_msg = 7; //错误信息 } + +//获取红包详细信息请求 +message qry_detail_wxhb_req +{ + optional LoginInfo login = 1; //登录信息 + optional int32 cmd = 2; + optional int32 tag3 = 3; + optional mmStr info = 4; //红包信息:需要nativeUrl和sendid +} + +//获取红包详细信息响应 +message qry_detail_wxhb_resp +{ + message TAG1 + { + optional int32 tag1 = 1; + message TAG1 + { + optional string tag1 = 1; + } + } + optional TAG1 tag1 = 1; //没啥用 + optional mmStr res = 2; //红包领取信息 + optional int32 cmd = 5; + optional int32 ret_code = 6; //错误码 416:需要实名认证 + optional string ret_msg = 7; //错误信息 +} + +//发送emoji请求 +message send_emoji_req +{ + optional LoginInfo login = 1; //登录信息 + optional int32 tag2 = 2; + message emoji_info + { + optional string animation_id = 1; //emoji加密文件名;发送游戏emoji时该参数无效 + optional int32 tag2 = 2; + optional int32 tag3 = 3; + message TAG4 + { + optional int32 tag1 = 1; + } + optional TAG4 tag4 = 4; + optional int32 tag5 = 5; + optional string to_wxid = 6; + optional string game_ext = 7; //游戏参数: + optional string tag8 = 8; + optional string utc = 9; //ms + optional int32 tag11 = 11; + } + optional emoji_info emoji = 3; //发送表情详细信息 + optional int32 tag4 = 4; +} + +//发送emoji响应 +message send_emoji_resp +{ + message result + { + optional int32 code = 1; //错误码;返回0表示发送成功 + optional int32 tag2 = 2; //小游戏随机种子? + optional int32 tag3 = 3; //小游戏随机种子? + optional string file_name = 4; + optional int32 svrid = 5; //服务器唯一id + optional int32 tag6 = 6; + } + optional result res = 3; //发送结果 +} + +//收款请求 +message transfer_operation_req +{ + optional LoginInfo login = 1; //登录信息 + optional int32 tag2 = 2; + optional int32 tag3 = 3; + optional mmStr info = 4; //转账信息:需要op_code, invalid_time, trans_id, 转账人wxid和transfer_id, 签名使用TDES加密算法(可不签) +} + +//收款结果 +message transfer_operation_resp +{ + optional mmStr res = 2; //收款结果详细信息 + optional int32 ret_code = 6; //错误码 + optional string ret_msg = 7; //错误信息 +} + +//查询转账记录请求 +message transfer_query_req +{ + optional LoginInfo login = 1; //登录信息 + optional int32 tag2 = 2; + optional int32 tag3 = 3; + optional mmStr info = 4; //转账信息:需要invalid_time, trans_id和transfer_id, 签名使用TDES加密算法(可不签) +} + +//查询转账记录结果 +message transfer_query_resp +{ + optional mmStr res = 2; //收款结果详细信息 + optional int32 ret_code = 6; //错误码 + optional string ret_msg = 7; //错误信息 +} + +//获取好友详细信息请求 +message get_contact_req +{ + optional LoginInfo login = 1; //登录信息 + optional int32 tag2 = 2; + optional Wxid wxid = 3; //要查询的 好友/群聊 wxid + optional int32 tag4 = 4; + optional int32 tag6 = 6; + message TAG7 + { + optional string tag1 = 1; + } + optional TAG7 tag7 = 7; + optional int32 tag8 = 8; +} + +//获取好友详细信息响应 +message get_contact_resp +{ + optional contact_info info = 3; //好友详细信息 + message ticket_info + { + optional string wxid = 1; //查询好友的wxid + optional string ticket = 2; //v2_ticket + } + optional ticket_info ticket = 5; //对方删除/拉黑我 返回v2_name;正常好友该字段为空 +} + +//建群聊请求 +message create_chatroom_req +{ + optional LoginInfo login = 1; //登录信息 + message TAG2 + { + optional string tag1 = 1; + } + optional TAG2 tag2 = 2; + optional int32 member_cnt = 3; //群成员数量 + message member_info + { + optional Wxid wxid = 1; + } + repeated member_info member = 4; //群成员信息 + optional int32 tag5 = 5; +} + +//建群聊响应 +message create_chatroom_resp +{ + message result + { + optional int32 code = 1; //错误码 + message err_msg + { + optional string msg = 1; //错误信息 + } + optional err_msg msg = 2; + } + optional result res = 1; //建群结果 + optional int32 member_cnt = 5; //群成员数量 + message member_info + { + optional Wxid wxid = 1; //wxid + message nick_name_info + { + optional string name = 1; //昵称 + } + optional nick_name_info nick_name = 3; + optional string qianming = 15; //签名 + } + repeated member_info member = 6; + optional Wxid chatroom_wxid = 7; //新建群聊wxid + message chatroom_avatar + { + optional int32 len = 1; //群头像raw data大小 + optional bytes data = 2; //群头像 jpg格式 raw data + } + optional chatroom_avatar avatar = 8; //群头像 +} + +//面对面建群请求 +message mm_facing_create_chatroom_req +{ + optional LoginInfo login = 1; //登录信息 + optional int32 op_code = 2; //op_code=0:建群等人(未生成群wxid,只返回群成员信息) op_code=1:进群(返回群wxid) + optional string chatroom_pwd = 3; //面对面建群密码(4位;不能是1234) + optional float lon = 4; //面对面建群坐标经度 + optional float lat = 5; //面对面建群坐标纬度 + optional int32 tag6 = 6; + optional int32 tag9 = 9; + optional string tag10 = 10; +} + +//面对面建群响应 +message mm_facing_create_chatroom_resp +{ + message result + { + optional int32 code = 1; //错误码 + message err_msg + { + optional string msg = 1; //错误信息 + } + optional err_msg msg = 2; + } + optional result res = 1; //面对面建群结果 + optional int32 member_cnt = 3; //群成员数量(op_code=0阶段) + message member_info + { + optional string msg = 1; //wxid + optional string nick_name = 3; //nick_name + } + repeated member_info member = 4; //群成员信息(op_code=0阶段) + optional string wxid = 5; //面对面群id(op_code=1阶段) +} + +//群聊拉人请求 +message add_chatroom_member_req +{ + optional LoginInfo login = 1; //登录信息 + optional int32 member_cnt = 2; //本次邀请加入群聊的好友数量 + message member_info + { + optional Wxid wxid = 1; + } + repeated member_info member = 3; //本次邀请加入群聊的好友信息 + message chatroom_info + { + optional string wxid = 1; + } + optional chatroom_info chatroom_wxid = 4; //群聊wxid + optional int32 tag5 = 5; +} + +//群聊拉人响应 +message add_chatroom_member_resp +{ + message result + { + optional int32 code = 1; //错误码 + message err_msg + { + optional string msg = 1; //错误信息 + } + optional err_msg msg = 2; + } + optional result res = 1; //群聊拉人结果 +} + +//oplog:cmd_id=48 设置群昵称 +message op_set_group_nick_name +{ + optional string tag1 = 1; + optional string tag2 = 2; + optional bytes tag3 = 3; +} + +//操作请求 +message oplog_req +{ + message TAG1 + { + optional int32 tag1 = 1; //cnt? + message CMD + { + optional int32 cmd_id = 1; //操作类型 + message OPTION + { + optional int32 len = 1; + optional bytes data = 2; //不同cmd_id使用不同结构体填充该字段 + } + optional OPTION option = 2; + } + optional CMD cmd = 2; + } + optional TAG1 tag1 = 1; +} + +//操作响应 +message oplog_resp +{ + message result + { + optional bytes code = 2; //错误码 varint + optional string msg = 3; //错误信息 + } + optional result res = 2; //结果 +} + +//消息撤回请求 +message revoke_msg_req +{ + optional LoginInfo login = 1; //登录信息 + optional string client_id = 2; //客户端发送的消息id + optional int64 new_client_id = 3; //新的客户端消息id + optional int32 utc = 4; + optional int32 tag5 = 5; + optional string from_wxid = 6; + optional string to_wxid = 7; + optional int32 index_of_request = 8; + optional int64 svrid = 9; //撤回消息的svrid +} + +//消息撤回响应 +message revoke_msg_resp +{ + optional mmRes res = 1; //错误码 + optional string response_sys_wording = 3; //消息撤回提示(已撤回或撤回失败原因) +} + +//发布群公告请求 +message set_chatroom_announcement_req +{ + optional LoginInfo login = 1; //登录信息 + optional string chatroom_wxid = 2; //群聊wxid + optional string content = 3; //群公告内容 +} + +//发布群公告响应 +message set_chatroom_announcement_resp +{ + optional mmRes res = 1; //发布群公告结果 +} + diff --git a/microchat/mm_pb2.py b/microchat/mm_pb2.py index da1ec3e..f1a8552 100644 --- a/microchat/mm_pb2.py +++ b/microchat/mm_pb2.py @@ -19,7 +19,7 @@ name='mm.proto', package='', syntax='proto2', - serialized_pb=_b('\n\x08mm.proto\"!\n\x05mmStr\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x0b\n\x03str\x18\x02 \x01(\t\"&\n\x05mmRes\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"n\n\tLoginInfo\x12\x0e\n\x06\x61\x65sKey\x18\x01 \x01(\x0c\x12\x0b\n\x03uin\x18\x02 \x01(\x05\x12\x0c\n\x04guid\x18\x03 \x01(\t\x12\x11\n\tclientVer\x18\x04 \x01(\x05\x12\x12\n\nandroidVer\x18\x05 \x01(\t\x12\x0f\n\x07unknown\x18\x06 \x01(\x05\"\x92\x01\n\x07SyncKey\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x1f\n\x06msgkey\x18\x02 \x01(\x0b\x32\x0f.SyncKey.MsgKey\x1aY\n\x06MsgKey\x12\x0b\n\x03\x63nt\x18\x01 \x01(\x05\x12 \n\x03key\x18\x02 \x03(\x0b\x32\x13.SyncKey.MsgKey.Key\x1a \n\x03Key\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x0b\n\x03key\x18\x02 \x01(\x03\"]\n\ncommon_msg\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x1e\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x10.common_msg.Data\x1a!\n\x04\x44\x61ta\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x12\n\x04Wxid\x12\n\n\x02id\x18\x01 \x01(\t\"\x97\x02\n\x03Msg\x12\x10\n\x08serverid\x18\x01 \x01(\x03\x12\x16\n\x07\x66rom_id\x18\x02 \x01(\x0b\x32\x05.Wxid\x12\x14\n\x05to_id\x18\x03 \x01(\x0b\x32\x05.Wxid\x12\x0c\n\x04type\x18\x04 \x01(\x05\x12\x1c\n\x03raw\x18\x05 \x01(\x0b\x32\x0f.Msg.RawContent\x12\x0e\n\x06status\x18\x06 \x01(\x05\x12\x0c\n\x04tag7\x18\x07 \x01(\x05\x12\x0c\n\x04tag8\x18\x08 \x01(\x0c\x12\x12\n\ncreateTime\x18\t \x01(\x05\x12\x12\n\nanticlient\x18\n \x01(\t\x12\x12\n\nxmlContent\x18\x0b \x01(\t\x12\r\n\x05svrId\x18\x0c \x01(\x03\x12\x0e\n\x06msgKey\x18\r \x01(\x05\x1a\x1d\n\nRawContent\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\"\xef\n\n\x0c\x63ontact_info\x12\x13\n\x04wxid\x18\x01 \x01(\x0b\x32\x05.Wxid\x12(\n\x08nickname\x18\x02 \x01(\x0b\x32\x16.contact_info.NickName\x12\'\n\x07shortPy\x18\x03 \x01(\x0b\x32\x16.contact_info.PY_SHORT\x12&\n\x07quanpin\x18\x04 \x01(\x0b\x32\x15.contact_info.QuanPin\x12\x0b\n\x03sex\x18\x05 \x01(\x05\x12\x0c\n\x04tag6\x18\x06 \x01(\t\x12\x0c\n\x04tag7\x18\x07 \x01(\x05\x12\x0c\n\x04type\x18\x08 \x01(\x05\x12\x0c\n\x04tag9\x18\t \x01(\x05\x12)\n\x0bremark_name\x18\n \x01(\x0b\x32\x14.contact_info.BeiZhu\x12\x31\n\x0creal_shortPy\x18\x0b \x01(\x0b\x32\x1b.contact_info.REAL_PY_SHORT\x12\x30\n\x0creal_quanpin\x18\x0c \x01(\x0b\x32\x1a.contact_info.REAL_QuanPin\x12\r\n\x05tag13\x18\r \x01(\x05\x12\r\n\x05tag14\x18\x0e \x01(\x05\x12\r\n\x05tag16\x18\x10 \x01(\t\x12\x11\n\tbChatRoom\x18\x11 \x01(\x05\x12\r\n\x05tag18\x18\x12 \x01(\x05\x12\r\n\x05sheng\x18\x13 \x01(\t\x12\x0b\n\x03shi\x18\x14 \x01(\t\x12\x10\n\x08qianming\x18\x15 \x01(\t\x12\r\n\x05tag22\x18\x16 \x01(\x05\x12\r\n\x05tag23\x18\x17 \x01(\x05\x12\x1a\n\x12register_body_type\x18\x18 \x01(\x05\x12\x15\n\rregister_body\x18\x19 \x01(\t\x12\r\n\x05tag26\x18\x1a \x01(\x05\x12\x0b\n\x03src\x18\x1b \x01(\x05\x12\x13\n\x0blastMsgTime\x18\x1d \x01(\t\x12\r\n\x05\x61lias\x18\x1e \x01(\t\x12\x19\n\x11\x63hatroomOwnerWxid\x18\x1f \x01(\t\x12\r\n\x05tag33\x18! \x01(\x05\x12\r\n\x05tag34\x18\" \x01(\x05\x12\r\n\x05tag35\x18# \x01(\x05\x12\r\n\x05tag37\x18% \x01(\x0c\x12\x0f\n\x07\x63ountry\x18& \x01(\t\x12\x12\n\navatar_big\x18\' \x01(\t\x12\x14\n\x0c\x61vatar_small\x18( \x01(\t\x12\r\n\x05tag42\x18* \x01(\x0c\x12\x0f\n\x07v1_name\x18- \x01(\t\x12\r\n\x05tag50\x18\x32 \x01(\x0c\x12\x1a\n\x12\x63hatroom_serverVer\x18\x35 \x01(\x05\x12\x1b\n\x13\x63hatroom_max_member\x18\x37 \x01(\x05\x12\r\n\x05tag56\x18\x38 \x01(\x05\x12\x38\n\x11group_member_list\x18\x39 \x01(\x0b\x32\x1d.contact_info.GroupMemberList\x12\r\n\x05tag58\x18: \x01(\x05\x12\r\n\x05tag62\x18> \x01(\x0c\x12\r\n\x05tag64\x18@ \x01(\x05\x12\r\n\x05tag65\x18\x41 \x01(\x05\x12\r\n\x05tag66\x18\x42 \x01(\x05\x12\r\n\x05tag67\x18\x43 \x01(\x05\x1a\x18\n\x08NickName\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x18\n\x08PY_SHORT\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x17\n\x07QuanPin\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x16\n\x06\x42\x65iZhu\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x1d\n\rREAL_PY_SHORT\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x1c\n\x0cREAL_QuanPin\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\xac\x01\n\x0fGroupMemberList\x12\x0b\n\x03\x63nt\x18\x01 \x01(\x05\x12\x38\n\x06member\x18\x02 \x03(\x0b\x32(.contact_info.GroupMemberList.MemberInfo\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x0c\n\x04tag4\x18\x04 \x01(\t\x1a\x36\n\nMemberInfo\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\x0c\n\x04tag8\x18\x08 \x01(\x05\"\xc6\x02\n\x18ManualAuthAccountRequest\x12-\n\x03\x61\x65s\x18\x01 \x02(\x0b\x32 .ManualAuthAccountRequest.AesKey\x12,\n\x04\x65\x63\x64h\x18\x02 \x02(\x0b\x32\x1e.ManualAuthAccountRequest.Ecdh\x12\x10\n\x08userName\x18\x03 \x02(\t\x12\x11\n\tpassword1\x18\x04 \x02(\t\x12\x11\n\tpassword2\x18\x05 \x02(\t\x1a\"\n\x06\x41\x65sKey\x12\x0b\n\x03len\x18\x01 \x02(\x05\x12\x0b\n\x03key\x18\x02 \x02(\x0c\x1aq\n\x04\x45\x63\x64h\x12\x0b\n\x03nid\x18\x01 \x02(\x05\x12\x37\n\x07\x65\x63\x64hKey\x18\x02 \x02(\x0b\x32&.ManualAuthAccountRequest.Ecdh.EcdhKey\x1a#\n\x07\x45\x63\x64hKey\x12\x0b\n\x03len\x18\x01 \x02(\x05\x12\x0b\n\x03key\x18\x02 \x02(\x0c\"\x91\x05\n\x17ManualAuthDeviceRequest\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12,\n\x04tag2\x18\x02 \x01(\x0b\x32\x1e.ManualAuthDeviceRequest._Tag2\x12\x0c\n\x04imei\x18\x03 \x01(\t\x12\x13\n\x0bsoftInfoXml\x18\x04 \x01(\t\x12\x10\n\x08unknown5\x18\x05 \x01(\x05\x12\x13\n\x0b\x63lientSeqID\x18\x06 \x01(\t\x12\x18\n\x10\x63lientSeqID_sign\x18\x07 \x01(\t\x12\x17\n\x0floginDeviceName\x18\x08 \x01(\t\x12\x15\n\rdeviceInfoXml\x18\t \x01(\t\x12\x10\n\x08language\x18\n \x01(\t\x12\x10\n\x08timeZone\x18\x0b \x01(\t\x12\x11\n\tunknown13\x18\r \x01(\x05\x12\x11\n\tunknown14\x18\x0e \x01(\x05\x12\x13\n\x0b\x64\x65viceBrand\x18\x0f \x01(\t\x12\x13\n\x0b\x64\x65viceModel\x18\x10 \x01(\t\x12\x0e\n\x06osType\x18\x11 \x01(\t\x12\x13\n\x0brealCountry\x18\x12 \x01(\t\x12\x11\n\tunknown22\x18\x16 \x01(\x05\x1a\xec\x01\n\x05_Tag2\x12\x14\n\x04tag1\x18\x01 \x01(\x0b\x32\x06.mmStr\x12\x33\n\x04tag2\x18\x02 \x01(\x0b\x32%.ManualAuthDeviceRequest._Tag2.__Tag2\x12\x14\n\x04tag3\x18\x03 \x01(\x0b\x32\x06.mmStr\x12\x14\n\x04tag4\x18\x04 \x01(\x0b\x32\x06.mmStr\x12\x14\n\x04tag5\x18\x05 \x01(\x0b\x32\x06.mmStr\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x1aH\n\x06__Tag2\x12\x0c\n\x04tag1\x18\x01 \x01(\t\x12\x0c\n\x04tag2\x18\x02 \x01(\t\x12\x0c\n\x04tag3\x18\x03 \x01(\t\x12\x14\n\x04tag4\x18\x04 \x01(\x0b\x32\x06.mmStr\"\xd3\x07\n\x12ManualAuthResponse\x12.\n\x06result\x18\x01 \x02(\x0b\x32\x1e.ManualAuthResponse.AuthResult\x12\x11\n\tunifyFlag\x18\x02 \x02(\x05\x12\x30\n\tauthParam\x18\x03 \x02(\x0b\x32\x1d.ManualAuthResponse.AuthParam\x12\x34\n\x0b\x61\x63\x63ountInfo\x18\x04 \x01(\x0b\x32\x1f.ManualAuthResponse.AccountInfo\x12\x0f\n\x07\x64nsInfo\x18\x05 \x01(\x0c\x1ai\n\nAuthResult\x12\x0c\n\x04\x63ode\x18\x01 \x02(\x05\x12\x36\n\x07\x65rr_msg\x18\x02 \x02(\x0b\x32%.ManualAuthResponse.AuthResult.ErrMsg\x1a\x15\n\x06\x45rrMsg\x12\x0b\n\x03msg\x18\x01 \x01(\t\x1a\xe5\x02\n\tAuthParam\x12\x0b\n\x03uin\x18\x01 \x02(\x05\x12\x30\n\x04\x65\x63\x64h\x18\x02 \x02(\x0b\x32\".ManualAuthResponse.AuthParam.Ecdh\x12\x39\n\x07session\x18\x03 \x02(\x0b\x32(.ManualAuthResponse.AuthParam.SessionKey\x12\x11\n\tSmsTicket\x18\x10 \x01(\x0c\x12\x18\n\x10\x62indMailLoginUrl\x18\x14 \x01(\t\x12\x12\n\nserverTime\x18\x16 \x01(\x05\x1au\n\x04\x45\x63\x64h\x12\x0b\n\x03nid\x18\x01 \x02(\x05\x12;\n\x07\x65\x63\x64hKey\x18\x02 \x01(\x0b\x32*.ManualAuthResponse.AuthParam.Ecdh.EcdhKey\x1a#\n\x07\x45\x63\x64hKey\x12\x0b\n\x03len\x18\x01 \x02(\x05\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x1a&\n\nSessionKey\x12\x0b\n\x03len\x18\x01 \x02(\x05\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x1a\xad\x02\n\x0b\x41\x63\x63ountInfo\x12\x0c\n\x04wxId\x18\x01 \x01(\t\x12\x10\n\x08nickName\x18\x02 \x01(\t\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x10\n\x08\x62indMail\x18\x04 \x01(\t\x12\x12\n\nbindMobile\x18\x05 \x01(\t\x12\r\n\x05\x41lias\x18\x06 \x01(\t\x12\x0c\n\x04tag7\x18\x07 \x01(\t\x12\x0e\n\x06status\x18\x08 \x01(\x05\x12\x12\n\npluginFlag\x18\t \x01(\x05\x12\x14\n\x0cregisterType\x18\n \x01(\x05\x12\r\n\x05tag11\x18\x0b \x01(\t\x12\x12\n\nsafeDevice\x18\x0c \x01(\x05\x12\x1a\n\x12officialNamePinyin\x18\r \x01(\t\x12\x16\n\x0eofficialNameZh\x18\x0e \x01(\t\x12\r\n\x05tag15\x18\x0f \x01(\t\x12\r\n\x05\x66sUrl\x18\x10 \x01(\t\"w\n\x0eNewInitRequest\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0c\n\x04wxid\x18\x02 \x01(\t\x12\x14\n\x0csync_key_cur\x18\x03 \x01(\x0c\x12\x14\n\x0csync_key_max\x18\x04 \x01(\x0c\x12\x10\n\x08language\x18\x05 \x01(\t\"\x8e\x01\n\x0fNewInitResponse\x12\x0c\n\x04tag1\x18\x01 \x01(\t\x12\x14\n\x0csync_key_cur\x18\x02 \x01(\x0c\x12\x14\n\x0csync_key_max\x18\x03 \x01(\x0c\x12\x15\n\rcontinue_flag\x18\x04 \x01(\x05\x12\x0f\n\x07\x63ntList\x18\x06 \x01(\x05\x12\x19\n\x04tag7\x18\x07 \x03(\x0b\x32\x0b.common_msg\"\xb4\x01\n\x0cnew_sync_req\x12)\n\x04\x66lag\x18\x01 \x01(\x0b\x32\x1b.new_sync_req.continue_flag\x12\x10\n\x08selector\x18\x02 \x01(\x05\x12\x10\n\x08sync_Key\x18\x03 \x01(\x0c\x12\r\n\x05scene\x18\x04 \x01(\x05\x12\x0e\n\x06\x64\x65vice\x18\x05 \x01(\t\x12\x17\n\x0fsync_msg_digest\x18\x06 \x01(\x05\x1a\x1d\n\rcontinue_flag\x12\x0c\n\x04\x66lag\x18\x01 \x01(\x05\"\xc2\x01\n\rnew_sync_resp\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\x12#\n\x03msg\x18\x02 \x01(\x0b\x32\x16.new_sync_resp.new_msg\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x10\n\x08sync_key\x18\x04 \x01(\x0c\x12\x0c\n\x04tag5\x18\x05 \x01(\x05\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\x0b\n\x03utc\x18\x07 \x01(\x05\x1a\x35\n\x07new_msg\x12\x0f\n\x07\x63ntList\x18\x01 \x01(\x05\x12\x19\n\x04tag2\x18\x02 \x03(\x0b\x32\x0b.common_msg\"\xa6\x01\n\x10new_send_msg_req\x12\x0b\n\x03\x63nt\x18\x01 \x01(\x05\x12\'\n\x03msg\x18\x02 \x01(\x0b\x32\x1a.new_send_msg_req.msg_info\x1a\\\n\x08msg_info\x12\x11\n\x02to\x18\x01 \x01(\x0b\x32\x05.Wxid\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x0b\n\x03utc\x18\x04 \x01(\x05\x12\x11\n\tclient_id\x18\x05 \x01(\x05\"\xa6\x01\n\x11new_send_msg_resp\x12\x14\n\x04tag1\x18\x01 \x01(\x0b\x32\x06.mmStr\x12\x0b\n\x03\x63nt\x18\x02 \x01(\x05\x12&\n\x03res\x18\x03 \x01(\x0b\x32\x19.new_send_msg_resp.result\x1a\x46\n\x06result\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x11\n\x02to\x18\x02 \x01(\x0b\x32\x05.Wxid\x12\x0c\n\x04type\x18\x07 \x01(\x05\x12\r\n\x05svrid\x18\x08 \x01(\x03\"\xed\x02\n\x14new_send_app_msg_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12/\n\x04info\x18\x02 \x01(\x0b\x32!.new_send_app_msg_req.appmsg_info\x12\x0c\n\x04tag4\x18\x04 \x01(\x05\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\x0c\n\x04tag7\x18\x07 \x01(\t\x12\x11\n\tfromScene\x18\x08 \x01(\t\x12\x0c\n\x04tag9\x18\t \x01(\x05\x12\r\n\x05tag10\x18\n \x01(\x05\x1a\xae\x01\n\x0b\x61ppmsg_info\x12\x11\n\tfrom_wxid\x18\x01 \x01(\t\x12\x10\n\x08\x61pp_wxid\x18\x02 \x01(\t\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x0f\n\x07to_wxid\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\x05\x12\x0f\n\x07\x63ontent\x18\x06 \x01(\t\x12\x0b\n\x03utc\x18\x07 \x01(\x05\x12\x11\n\tclient_id\x18\x08 \x01(\t\x12\r\n\x05tag10\x18\n \x01(\x05\x12\r\n\x05tag11\x18\x0b \x01(\x05\"\xa3\x01\n\x15new_send_app_msg_resp\x12\x14\n\x04tag1\x18\x01 \x01(\x0b\x32\x06.mmStr\x12\x11\n\tfrom_wxid\x18\x03 \x01(\t\x12\x0f\n\x07to_wxid\x18\x04 \x01(\t\x12\x13\n\x0bsync_key_id\x18\x05 \x01(\x05\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x0b\n\x03utc\x18\x07 \x01(\x05\x12\x0c\n\x04type\x18\x08 \x01(\x05\x12\r\n\x05svrid\x18\t \x01(\x03\"\x9c\x02\n\x0fverify_user_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0f\n\x07op_code\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12(\n\x04user\x18\x04 \x01(\x0b\x32\x1a.verify_user_req.user_info\x12\x0f\n\x07\x63ontent\x18\x05 \x01(\t\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\r\n\x05scene\x18\x07 \x01(\t\x12\x1b\n\x0b\x64\x65vice_info\x18\x08 \x01(\x0b\x32\x06.mmStr\x1aZ\n\tuser_info\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0e\n\x06ticket\x18\x02 \x01(\t\x12\x13\n\x0b\x61nti_ticket\x18\x03 \x01(\t\x12\x0c\n\x04tag4\x18\x04 \x01(\x05\x12\x0c\n\x04tag8\x18\x08 \x01(\x05\"5\n\x10verify_user_resp\x12\x13\n\x03res\x18\x01 \x01(\x0b\x32\x06.mmRes\x12\x0c\n\x04wxid\x18\x02 \x01(\t\"^\n\x10receive_wxhb_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0b\n\x03\x63md\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x14\n\x04info\x18\x04 \x01(\x0b\x32\x06.mmStr\"\xaf\x01\n\x11receive_wxhb_resp\x12%\n\x04tag1\x18\x01 \x01(\x0b\x32\x17.receive_wxhb_resp.TAG1\x12\x17\n\x07hb_info\x18\x02 \x01(\x0b\x32\x06.mmStr\x12\x0b\n\x03\x63md\x18\x05 \x01(\x05\x12\x10\n\x08ret_code\x18\x06 \x01(\x05\x12\x0f\n\x07ret_msg\x18\x07 \x01(\t\x1a*\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\x1a\x14\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\t\"[\n\ropen_wxhb_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0b\n\x03\x63md\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x14\n\x04info\x18\x04 \x01(\x0b\x32\x06.mmStr\"\xa5\x01\n\x0eopen_wxhb_resp\x12\"\n\x04tag1\x18\x01 \x01(\x0b\x32\x14.open_wxhb_resp.TAG1\x12\x13\n\x03res\x18\x02 \x01(\x0b\x32\x06.mmStr\x12\x0b\n\x03\x63md\x18\x05 \x01(\x05\x12\x10\n\x08ret_code\x18\x06 \x01(\x05\x12\x0f\n\x07ret_msg\x18\x07 \x01(\t\x1a*\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\x1a\x14\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\t') + serialized_pb=_b('\n\x08mm.proto\"!\n\x05mmStr\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x0b\n\x03str\x18\x02 \x01(\t\"&\n\x05mmRes\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"n\n\tLoginInfo\x12\x0e\n\x06\x61\x65sKey\x18\x01 \x01(\x0c\x12\x0b\n\x03uin\x18\x02 \x01(\x05\x12\x0c\n\x04guid\x18\x03 \x01(\t\x12\x11\n\tclientVer\x18\x04 \x01(\x05\x12\x12\n\nandroidVer\x18\x05 \x01(\t\x12\x0f\n\x07unknown\x18\x06 \x01(\x05\"\x92\x01\n\x07SyncKey\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x1f\n\x06msgkey\x18\x02 \x01(\x0b\x32\x0f.SyncKey.MsgKey\x1aY\n\x06MsgKey\x12\x0b\n\x03\x63nt\x18\x01 \x01(\x05\x12 \n\x03key\x18\x02 \x03(\x0b\x32\x13.SyncKey.MsgKey.Key\x1a \n\x03Key\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x0b\n\x03key\x18\x02 \x01(\x03\"]\n\ncommon_msg\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x1e\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x10.common_msg.Data\x1a!\n\x04\x44\x61ta\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x12\n\x04Wxid\x12\n\n\x02id\x18\x01 \x01(\t\"\x94\x02\n\x03Msg\x12\x10\n\x08serverid\x18\x01 \x01(\x03\x12\x16\n\x07\x66rom_id\x18\x02 \x01(\x0b\x32\x05.Wxid\x12\x14\n\x05to_id\x18\x03 \x01(\x0b\x32\x05.Wxid\x12\x0c\n\x04type\x18\x04 \x01(\x05\x12\x1c\n\x03raw\x18\x05 \x01(\x0b\x32\x0f.Msg.RawContent\x12\x0e\n\x06status\x18\x06 \x01(\x05\x12\x0c\n\x04tag7\x18\x07 \x01(\x05\x12\x0c\n\x04tag8\x18\x08 \x01(\x0c\x12\x12\n\ncreateTime\x18\t \x01(\x05\x12\x0f\n\x07\x65x_info\x18\n \x01(\t\x12\x12\n\nxmlContent\x18\x0b \x01(\t\x12\r\n\x05svrId\x18\x0c \x01(\x03\x12\x0e\n\x06msgKey\x18\r \x01(\x05\x1a\x1d\n\nRawContent\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\"\x99\x0b\n\x0c\x63ontact_info\x12\x13\n\x04wxid\x18\x01 \x01(\x0b\x32\x05.Wxid\x12(\n\x08nickname\x18\x02 \x01(\x0b\x32\x16.contact_info.NickName\x12\'\n\x07shortPy\x18\x03 \x01(\x0b\x32\x16.contact_info.PY_SHORT\x12&\n\x07quanpin\x18\x04 \x01(\x0b\x32\x15.contact_info.QuanPin\x12\x0b\n\x03sex\x18\x05 \x01(\x05\x12\x0c\n\x04tag6\x18\x06 \x01(\t\x12\x0c\n\x04tag7\x18\x07 \x01(\x05\x12\x0c\n\x04type\x18\x08 \x01(\x05\x12\x0c\n\x04tag9\x18\t \x01(\x05\x12)\n\x0bremark_name\x18\n \x01(\x0b\x32\x14.contact_info.BeiZhu\x12\x31\n\x0creal_shortPy\x18\x0b \x01(\x0b\x32\x1b.contact_info.REAL_PY_SHORT\x12\x30\n\x0creal_quanpin\x18\x0c \x01(\x0b\x32\x1a.contact_info.REAL_QuanPin\x12\r\n\x05tag13\x18\r \x01(\x05\x12\r\n\x05tag14\x18\x0e \x01(\x05\x12\r\n\x05tag16\x18\x10 \x01(\t\x12\x11\n\tbChatRoom\x18\x11 \x01(\x05\x12\r\n\x05tag18\x18\x12 \x01(\x05\x12\r\n\x05sheng\x18\x13 \x01(\t\x12\x0b\n\x03shi\x18\x14 \x01(\t\x12\x10\n\x08qianming\x18\x15 \x01(\t\x12\r\n\x05tag22\x18\x16 \x01(\x05\x12\r\n\x05tag23\x18\x17 \x01(\x05\x12\x1a\n\x12register_body_type\x18\x18 \x01(\x05\x12\x15\n\rregister_body\x18\x19 \x01(\t\x12\r\n\x05tag26\x18\x1a \x01(\x05\x12\x0b\n\x03src\x18\x1b \x01(\x05\x12\x13\n\x0blastMsgTime\x18\x1d \x01(\t\x12\r\n\x05\x61lias\x18\x1e \x01(\t\x12\x19\n\x11\x63hatroomOwnerWxid\x18\x1f \x01(\t\x12\r\n\x05tag33\x18! \x01(\x05\x12\r\n\x05tag34\x18\" \x01(\x05\x12\r\n\x05tag35\x18# \x01(\x05\x12\r\n\x05tag37\x18% \x01(\x0c\x12\x0f\n\x07\x63ountry\x18& \x01(\t\x12\x12\n\navatar_big\x18\' \x01(\t\x12\x14\n\x0c\x61vatar_small\x18( \x01(\t\x12\r\n\x05tag42\x18* \x01(\x0c\x12\x0f\n\x07v1_name\x18- \x01(\t\x12\r\n\x05tag50\x18\x32 \x01(\x0c\x12\x1a\n\x12\x63hatroom_serverVer\x18\x35 \x01(\x05\x12\x1b\n\x13\x63hatroom_max_member\x18\x37 \x01(\x05\x12\r\n\x05tag56\x18\x38 \x01(\x05\x12\x38\n\x11group_member_list\x18\x39 \x01(\x0b\x32\x1d.contact_info.GroupMemberList\x12\r\n\x05tag58\x18: \x01(\x05\x12\r\n\x05tag62\x18> \x01(\x0c\x12\r\n\x05tag64\x18@ \x01(\x05\x12\r\n\x05tag65\x18\x41 \x01(\x05\x12\r\n\x05tag66\x18\x42 \x01(\x05\x12\r\n\x05tag67\x18\x43 \x01(\x05\x1a\x18\n\x08NickName\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x18\n\x08PY_SHORT\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x17\n\x07QuanPin\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x16\n\x06\x42\x65iZhu\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x1d\n\rREAL_PY_SHORT\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x1c\n\x0cREAL_QuanPin\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\xd6\x01\n\x0fGroupMemberList\x12\x0b\n\x03\x63nt\x18\x01 \x01(\x05\x12\x38\n\x06member\x18\x02 \x03(\x0b\x32(.contact_info.GroupMemberList.MemberInfo\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x0c\n\x04tag4\x18\x04 \x01(\t\x1a`\n\nMemberInfo\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x11\n\tnick_name\x18\x02 \x01(\t\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\x15\n\rinviteer_wxid\x18\x07 \x01(\t\x12\x0c\n\x04tag8\x18\x08 \x01(\x05\"\xc6\x02\n\x18ManualAuthAccountRequest\x12-\n\x03\x61\x65s\x18\x01 \x02(\x0b\x32 .ManualAuthAccountRequest.AesKey\x12,\n\x04\x65\x63\x64h\x18\x02 \x02(\x0b\x32\x1e.ManualAuthAccountRequest.Ecdh\x12\x10\n\x08userName\x18\x03 \x02(\t\x12\x11\n\tpassword1\x18\x04 \x02(\t\x12\x11\n\tpassword2\x18\x05 \x02(\t\x1a\"\n\x06\x41\x65sKey\x12\x0b\n\x03len\x18\x01 \x02(\x05\x12\x0b\n\x03key\x18\x02 \x02(\x0c\x1aq\n\x04\x45\x63\x64h\x12\x0b\n\x03nid\x18\x01 \x02(\x05\x12\x37\n\x07\x65\x63\x64hKey\x18\x02 \x02(\x0b\x32&.ManualAuthAccountRequest.Ecdh.EcdhKey\x1a#\n\x07\x45\x63\x64hKey\x12\x0b\n\x03len\x18\x01 \x02(\x05\x12\x0b\n\x03key\x18\x02 \x02(\x0c\"\xd2\x05\n\x17ManualAuthDeviceRequest\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12,\n\x04tag2\x18\x02 \x01(\x0b\x32\x1e.ManualAuthDeviceRequest._Tag2\x12\x0c\n\x04imei\x18\x03 \x01(\t\x12\x13\n\x0bsoftInfoXml\x18\x04 \x01(\t\x12\x10\n\x08unknown5\x18\x05 \x01(\x05\x12\x13\n\x0b\x63lientSeqID\x18\x06 \x01(\t\x12\x18\n\x10\x63lientSeqID_sign\x18\x07 \x01(\t\x12\x17\n\x0floginDeviceName\x18\x08 \x01(\t\x12\x15\n\rdeviceInfoXml\x18\t \x01(\t\x12\x10\n\x08language\x18\n \x01(\t\x12\x10\n\x08timeZone\x18\x0b \x01(\t\x12\x11\n\tunknown13\x18\r \x01(\x05\x12\x11\n\tunknown14\x18\x0e \x01(\x05\x12\x13\n\x0b\x64\x65viceBrand\x18\x0f \x01(\t\x12\x13\n\x0b\x64\x65viceModel\x18\x10 \x01(\t\x12\x0e\n\x06osType\x18\x11 \x01(\t\x12\x13\n\x0brealCountry\x18\x12 \x01(\t\x12\x11\n\tunknown22\x18\x16 \x01(\x05\x1a\xad\x02\n\x05_Tag2\x12\x14\n\x04tag1\x18\x01 \x01(\x0b\x32\x06.mmStr\x12\x33\n\x04tag2\x18\x02 \x01(\x0b\x32%.ManualAuthDeviceRequest._Tag2.__Tag2\x12\x31\n\x04tag3\x18\x03 \x01(\x0b\x32#.ManualAuthDeviceRequest._Tag2.TAG3\x12\x14\n\x04tag4\x18\x04 \x01(\x0b\x32\x06.mmStr\x12\x14\n\x04tag5\x18\x05 \x01(\x0b\x32\x06.mmStr\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x1aH\n\x06__Tag2\x12\x0c\n\x04tag1\x18\x01 \x01(\t\x12\x0c\n\x04tag2\x18\x02 \x01(\t\x12\x0c\n\x04tag3\x18\x03 \x01(\t\x12\x14\n\x04tag4\x18\x04 \x01(\x0b\x32\x06.mmStr\x1a\"\n\x04TAG3\x12\x0c\n\x04tag1\x18\x01 \x01(\t\x12\x0c\n\x04tag2\x18\x02 \x01(\t\"\xb9\x0c\n\x12ManualAuthResponse\x12.\n\x06result\x18\x01 \x02(\x0b\x32\x1e.ManualAuthResponse.AuthResult\x12\x11\n\tunifyFlag\x18\x02 \x02(\x05\x12\x30\n\tauthParam\x18\x03 \x02(\x0b\x32\x1d.ManualAuthResponse.AuthParam\x12\x34\n\x0b\x61\x63\x63ountInfo\x18\x04 \x01(\x0b\x32\x1f.ManualAuthResponse.AccountInfo\x12)\n\x03\x64ns\x18\x05 \x01(\x0b\x32\x1c.ManualAuthResponse.dns_info\x1ai\n\nAuthResult\x12\x0c\n\x04\x63ode\x18\x01 \x02(\x05\x12\x36\n\x07\x65rr_msg\x18\x02 \x02(\x0b\x32%.ManualAuthResponse.AuthResult.ErrMsg\x1a\x15\n\x06\x45rrMsg\x12\x0b\n\x03msg\x18\x01 \x01(\t\x1a\xe5\x02\n\tAuthParam\x12\x0b\n\x03uin\x18\x01 \x02(\x05\x12\x30\n\x04\x65\x63\x64h\x18\x02 \x02(\x0b\x32\".ManualAuthResponse.AuthParam.Ecdh\x12\x39\n\x07session\x18\x03 \x02(\x0b\x32(.ManualAuthResponse.AuthParam.SessionKey\x12\x11\n\tSmsTicket\x18\x10 \x01(\x0c\x12\x18\n\x10\x62indMailLoginUrl\x18\x14 \x01(\t\x12\x12\n\nserverTime\x18\x16 \x01(\x05\x1au\n\x04\x45\x63\x64h\x12\x0b\n\x03nid\x18\x01 \x02(\x05\x12;\n\x07\x65\x63\x64hKey\x18\x02 \x01(\x0b\x32*.ManualAuthResponse.AuthParam.Ecdh.EcdhKey\x1a#\n\x07\x45\x63\x64hKey\x12\x0b\n\x03len\x18\x01 \x02(\x05\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x1a&\n\nSessionKey\x12\x0b\n\x03len\x18\x01 \x02(\x05\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x1a\xad\x02\n\x0b\x41\x63\x63ountInfo\x12\x0c\n\x04wxId\x18\x01 \x01(\t\x12\x10\n\x08nickName\x18\x02 \x01(\t\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x10\n\x08\x62indMail\x18\x04 \x01(\t\x12\x12\n\nbindMobile\x18\x05 \x01(\t\x12\r\n\x05\x41lias\x18\x06 \x01(\t\x12\x0c\n\x04tag7\x18\x07 \x01(\t\x12\x0e\n\x06status\x18\x08 \x01(\x05\x12\x12\n\npluginFlag\x18\t \x01(\x05\x12\x14\n\x0cregisterType\x18\n \x01(\x05\x12\r\n\x05tag11\x18\x0b \x01(\t\x12\x12\n\nsafeDevice\x18\x0c \x01(\x05\x12\x1a\n\x12officialNamePinyin\x18\r \x01(\t\x12\x16\n\x0eofficialNameZh\x18\x0e \x01(\t\x12\r\n\x05tag15\x18\x0f \x01(\t\x12\r\n\x05\x66sUrl\x18\x10 \x01(\t\x1a\xc9\x04\n\x08\x64ns_info\x12<\n\x08redirect\x18\x01 \x01(\x0b\x32*.ManualAuthResponse.dns_info.redirect_info\x12\x30\n\x02ip\x18\x03 \x01(\x0b\x32$.ManualAuthResponse.dns_info.ip_info\x1a\x9c\x01\n\rredirect_info\x12\x0b\n\x03\x63nt\x18\x01 \x01(\x05\x12L\n\treal_host\x18\x02 \x03(\x0b\x32\x39.ManualAuthResponse.dns_info.redirect_info.real_host_info\x1a\x30\n\x0ereal_host_info\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x10\n\x08redirect\x18\x02 \x01(\t\x1a\xad\x02\n\x07ip_info\x12\x17\n\x0flonglink_ip_cnt\x18\x01 \x01(\x05\x12\x18\n\x10shortlink_ip_cnt\x18\x02 \x01(\x05\x12G\n\x08longlink\x18\x03 \x03(\x0b\x32\x35.ManualAuthResponse.dns_info.ip_info.longlink_ip_info\x12I\n\tshortlink\x18\x04 \x03(\x0b\x32\x36.ManualAuthResponse.dns_info.ip_info.shortlink_ip_info\x1a,\n\x10longlink_ip_info\x12\n\n\x02ip\x18\x03 \x01(\t\x12\x0c\n\x04host\x18\x04 \x01(\t\x1a-\n\x11shortlink_ip_info\x12\n\n\x02ip\x18\x03 \x01(\t\x12\x0c\n\x04host\x18\x04 \x01(\t\"w\n\x0eNewInitRequest\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0c\n\x04wxid\x18\x02 \x01(\t\x12\x14\n\x0csync_key_cur\x18\x03 \x01(\x0c\x12\x14\n\x0csync_key_max\x18\x04 \x01(\x0c\x12\x10\n\x08language\x18\x05 \x01(\t\"\x8e\x01\n\x0fNewInitResponse\x12\x0c\n\x04tag1\x18\x01 \x01(\t\x12\x14\n\x0csync_key_cur\x18\x02 \x01(\x0c\x12\x14\n\x0csync_key_max\x18\x03 \x01(\x0c\x12\x15\n\rcontinue_flag\x18\x04 \x01(\x05\x12\x0f\n\x07\x63ntList\x18\x06 \x01(\x05\x12\x19\n\x04tag7\x18\x07 \x03(\x0b\x32\x0b.common_msg\"\xb4\x01\n\x0cnew_sync_req\x12)\n\x04\x66lag\x18\x01 \x01(\x0b\x32\x1b.new_sync_req.continue_flag\x12\x10\n\x08selector\x18\x02 \x01(\x05\x12\x10\n\x08sync_Key\x18\x03 \x01(\x0c\x12\r\n\x05scene\x18\x04 \x01(\x05\x12\x0e\n\x06\x64\x65vice\x18\x05 \x01(\t\x12\x17\n\x0fsync_msg_digest\x18\x06 \x01(\x05\x1a\x1d\n\rcontinue_flag\x12\x0c\n\x04\x66lag\x18\x01 \x01(\x05\"\xc2\x01\n\rnew_sync_resp\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\x12#\n\x03msg\x18\x02 \x01(\x0b\x32\x16.new_sync_resp.new_msg\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x10\n\x08sync_key\x18\x04 \x01(\x0c\x12\x0c\n\x04tag5\x18\x05 \x01(\x05\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\x0b\n\x03utc\x18\x07 \x01(\x05\x1a\x35\n\x07new_msg\x12\x0f\n\x07\x63ntList\x18\x01 \x01(\x05\x12\x19\n\x04tag2\x18\x02 \x03(\x0b\x32\x0b.common_msg\"\xb7\x01\n\x10new_send_msg_req\x12\x0b\n\x03\x63nt\x18\x01 \x01(\x05\x12\'\n\x03msg\x18\x02 \x01(\x0b\x32\x1a.new_send_msg_req.msg_info\x1am\n\x08msg_info\x12\x11\n\x02to\x18\x01 \x01(\x0b\x32\x05.Wxid\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x0b\n\x03utc\x18\x04 \x01(\x05\x12\x11\n\tclient_id\x18\x05 \x01(\x05\x12\x0f\n\x07\x61t_list\x18\x06 \x01(\t\"\xa6\x01\n\x11new_send_msg_resp\x12\x14\n\x04tag1\x18\x01 \x01(\x0b\x32\x06.mmStr\x12\x0b\n\x03\x63nt\x18\x02 \x01(\x05\x12&\n\x03res\x18\x03 \x01(\x0b\x32\x19.new_send_msg_resp.result\x1a\x46\n\x06result\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x11\n\x02to\x18\x02 \x01(\x0b\x32\x05.Wxid\x12\x0c\n\x04type\x18\x07 \x01(\x05\x12\r\n\x05svrid\x18\x08 \x01(\x03\"\xed\x02\n\x14new_send_app_msg_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12/\n\x04info\x18\x02 \x01(\x0b\x32!.new_send_app_msg_req.appmsg_info\x12\x0c\n\x04tag4\x18\x04 \x01(\x05\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\x0c\n\x04tag7\x18\x07 \x01(\t\x12\x11\n\tfromScene\x18\x08 \x01(\t\x12\x0c\n\x04tag9\x18\t \x01(\x05\x12\r\n\x05tag10\x18\n \x01(\x05\x1a\xae\x01\n\x0b\x61ppmsg_info\x12\x11\n\tfrom_wxid\x18\x01 \x01(\t\x12\x10\n\x08\x61pp_wxid\x18\x02 \x01(\t\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x0f\n\x07to_wxid\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\x05\x12\x0f\n\x07\x63ontent\x18\x06 \x01(\t\x12\x0b\n\x03utc\x18\x07 \x01(\x05\x12\x11\n\tclient_id\x18\x08 \x01(\t\x12\r\n\x05tag10\x18\n \x01(\x05\x12\r\n\x05tag11\x18\x0b \x01(\x05\"\xa3\x01\n\x15new_send_app_msg_resp\x12\x14\n\x04tag1\x18\x01 \x01(\x0b\x32\x06.mmStr\x12\x11\n\tfrom_wxid\x18\x03 \x01(\t\x12\x0f\n\x07to_wxid\x18\x04 \x01(\t\x12\x13\n\x0bsync_key_id\x18\x05 \x01(\x05\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x0b\n\x03utc\x18\x07 \x01(\x05\x12\x0c\n\x04type\x18\x08 \x01(\x05\x12\r\n\x05svrid\x18\t \x01(\x03\"\x9c\x02\n\x0fverify_user_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0f\n\x07op_code\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12(\n\x04user\x18\x04 \x01(\x0b\x32\x1a.verify_user_req.user_info\x12\x0f\n\x07\x63ontent\x18\x05 \x01(\t\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\r\n\x05scene\x18\x07 \x01(\t\x12\x1b\n\x0b\x64\x65vice_info\x18\x08 \x01(\x0b\x32\x06.mmStr\x1aZ\n\tuser_info\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0e\n\x06ticket\x18\x02 \x01(\t\x12\x13\n\x0b\x61nti_ticket\x18\x03 \x01(\t\x12\x0c\n\x04tag4\x18\x04 \x01(\x05\x12\x0c\n\x04tag8\x18\x08 \x01(\x05\"5\n\x10verify_user_resp\x12\x13\n\x03res\x18\x01 \x01(\x0b\x32\x06.mmRes\x12\x0c\n\x04wxid\x18\x02 \x01(\t\"^\n\x10receive_wxhb_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0b\n\x03\x63md\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x14\n\x04info\x18\x04 \x01(\x0b\x32\x06.mmStr\"\xaf\x01\n\x11receive_wxhb_resp\x12%\n\x04tag1\x18\x01 \x01(\x0b\x32\x17.receive_wxhb_resp.TAG1\x12\x17\n\x07hb_info\x18\x02 \x01(\x0b\x32\x06.mmStr\x12\x0b\n\x03\x63md\x18\x05 \x01(\x05\x12\x10\n\x08ret_code\x18\x06 \x01(\x05\x12\x0f\n\x07ret_msg\x18\x07 \x01(\t\x1a*\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\x1a\x14\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\t\"[\n\ropen_wxhb_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0b\n\x03\x63md\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x14\n\x04info\x18\x04 \x01(\x0b\x32\x06.mmStr\"\xa5\x01\n\x0eopen_wxhb_resp\x12\"\n\x04tag1\x18\x01 \x01(\x0b\x32\x14.open_wxhb_resp.TAG1\x12\x13\n\x03res\x18\x02 \x01(\x0b\x32\x06.mmStr\x12\x0b\n\x03\x63md\x18\x05 \x01(\x05\x12\x10\n\x08ret_code\x18\x06 \x01(\x05\x12\x0f\n\x07ret_msg\x18\x07 \x01(\t\x1a*\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\x1a\x14\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\t\"a\n\x13qry_detail_wxhb_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0b\n\x03\x63md\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x14\n\x04info\x18\x04 \x01(\x0b\x32\x06.mmStr\"\xb1\x01\n\x14qry_detail_wxhb_resp\x12(\n\x04tag1\x18\x01 \x01(\x0b\x32\x1a.qry_detail_wxhb_resp.TAG1\x12\x13\n\x03res\x18\x02 \x01(\x0b\x32\x06.mmStr\x12\x0b\n\x03\x63md\x18\x05 \x01(\x05\x12\x10\n\x08ret_code\x18\x06 \x01(\x05\x12\x0f\n\x07ret_msg\x18\x07 \x01(\t\x1a*\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\x1a\x14\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\t\"\xd3\x02\n\x0esend_emoji_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0c\n\x04tag2\x18\x02 \x01(\x05\x12)\n\x05\x65moji\x18\x03 \x01(\x0b\x32\x1a.send_emoji_req.emoji_info\x12\x0c\n\x04tag4\x18\x04 \x01(\x05\x1a\xde\x01\n\nemoji_info\x12\x14\n\x0c\x61nimation_id\x18\x01 \x01(\t\x12\x0c\n\x04tag2\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12-\n\x04tag4\x18\x04 \x01(\x0b\x32\x1f.send_emoji_req.emoji_info.TAG4\x12\x0c\n\x04tag5\x18\x05 \x01(\x05\x12\x0f\n\x07to_wxid\x18\x06 \x01(\t\x12\x10\n\x08game_ext\x18\x07 \x01(\t\x12\x0c\n\x04tag8\x18\x08 \x01(\t\x12\x0b\n\x03utc\x18\t \x01(\t\x12\r\n\x05tag11\x18\x0b \x01(\x05\x1a\x14\n\x04TAG4\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\"\x9b\x01\n\x0fsend_emoji_resp\x12$\n\x03res\x18\x03 \x01(\x0b\x32\x17.send_emoji_resp.result\x1a\x62\n\x06result\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0c\n\x04tag2\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x11\n\tfile_name\x18\x04 \x01(\t\x12\r\n\x05svrid\x18\x05 \x01(\x05\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\"e\n\x16transfer_operation_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0c\n\x04tag2\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x14\n\x04info\x18\x04 \x01(\x0b\x32\x06.mmStr\"Q\n\x17transfer_operation_resp\x12\x13\n\x03res\x18\x02 \x01(\x0b\x32\x06.mmStr\x12\x10\n\x08ret_code\x18\x06 \x01(\x05\x12\x0f\n\x07ret_msg\x18\x07 \x01(\t\"a\n\x12transfer_query_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0c\n\x04tag2\x18\x02 \x01(\x05\x12\x0c\n\x04tag3\x18\x03 \x01(\x05\x12\x14\n\x04info\x18\x04 \x01(\x0b\x32\x06.mmStr\"M\n\x13transfer_query_resp\x12\x13\n\x03res\x18\x02 \x01(\x0b\x32\x06.mmStr\x12\x10\n\x08ret_code\x18\x06 \x01(\x05\x12\x0f\n\x07ret_msg\x18\x07 \x01(\t\"\xb4\x01\n\x0fget_contact_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0c\n\x04tag2\x18\x02 \x01(\x05\x12\x13\n\x04wxid\x18\x03 \x01(\x0b\x32\x05.Wxid\x12\x0c\n\x04tag4\x18\x04 \x01(\x05\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12#\n\x04tag7\x18\x07 \x01(\x0b\x32\x15.get_contact_req.TAG7\x12\x0c\n\x04tag8\x18\x08 \x01(\x05\x1a\x14\n\x04TAG7\x12\x0c\n\x04tag1\x18\x01 \x01(\t\"\x8b\x01\n\x10get_contact_resp\x12\x1b\n\x04info\x18\x03 \x01(\x0b\x32\r.contact_info\x12-\n\x06ticket\x18\x05 \x01(\x0b\x32\x1d.get_contact_resp.ticket_info\x1a+\n\x0bticket_info\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0e\n\x06ticket\x18\x02 \x01(\t\"\xe7\x01\n\x13\x63reate_chatroom_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\'\n\x04tag2\x18\x02 \x01(\x0b\x32\x19.create_chatroom_req.TAG2\x12\x12\n\nmember_cnt\x18\x03 \x01(\x05\x12\x30\n\x06member\x18\x04 \x03(\x0b\x32 .create_chatroom_req.member_info\x12\x0c\n\x04tag5\x18\x05 \x01(\x05\x1a\x14\n\x04TAG2\x12\x0c\n\x04tag1\x18\x01 \x01(\t\x1a\"\n\x0bmember_info\x12\x13\n\x04wxid\x18\x01 \x01(\x0b\x32\x05.Wxid\"\x8a\x04\n\x14\x63reate_chatroom_resp\x12)\n\x03res\x18\x01 \x01(\x0b\x32\x1c.create_chatroom_resp.result\x12\x12\n\nmember_cnt\x18\x05 \x01(\x05\x12\x31\n\x06member\x18\x06 \x03(\x0b\x32!.create_chatroom_resp.member_info\x12\x1c\n\rchatroom_wxid\x18\x07 \x01(\x0b\x32\x05.Wxid\x12\x35\n\x06\x61vatar\x18\x08 \x01(\x0b\x32%.create_chatroom_resp.chatroom_avatar\x1a\x61\n\x06result\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x31\n\x03msg\x18\x02 \x01(\x0b\x32$.create_chatroom_resp.result.err_msg\x1a\x16\n\x07\x65rr_msg\x12\x0b\n\x03msg\x18\x01 \x01(\t\x1a\x99\x01\n\x0bmember_info\x12\x13\n\x04wxid\x18\x01 \x01(\x0b\x32\x05.Wxid\x12\x43\n\tnick_name\x18\x03 \x01(\x0b\x32\x30.create_chatroom_resp.member_info.nick_name_info\x12\x10\n\x08qianming\x18\x0f \x01(\t\x1a\x1e\n\x0enick_name_info\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a,\n\x0f\x63hatroom_avatar\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\xa6\x01\n\x1dmm_facing_create_chatroom_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x0f\n\x07op_code\x18\x02 \x01(\x05\x12\x14\n\x0c\x63hatroom_pwd\x18\x03 \x01(\t\x12\x0b\n\x03lon\x18\x04 \x01(\x02\x12\x0b\n\x03lat\x18\x05 \x01(\x02\x12\x0c\n\x04tag6\x18\x06 \x01(\x05\x12\x0c\n\x04tag9\x18\t \x01(\x05\x12\r\n\x05tag10\x18\n \x01(\t\"\xd0\x02\n\x1emm_facing_create_chatroom_resp\x12\x33\n\x03res\x18\x01 \x01(\x0b\x32&.mm_facing_create_chatroom_resp.result\x12\x12\n\nmember_cnt\x18\x03 \x01(\x05\x12;\n\x06member\x18\x04 \x03(\x0b\x32+.mm_facing_create_chatroom_resp.member_info\x12\x0c\n\x04wxid\x18\x05 \x01(\t\x1ak\n\x06result\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12;\n\x03msg\x18\x02 \x01(\x0b\x32..mm_facing_create_chatroom_resp.result.err_msg\x1a\x16\n\x07\x65rr_msg\x12\x0b\n\x03msg\x18\x01 \x01(\t\x1a-\n\x0bmember_info\x12\x0b\n\x03msg\x18\x01 \x01(\t\x12\x11\n\tnick_name\x18\x03 \x01(\t\"\x8e\x02\n\x17\x61\x64\x64_chatroom_member_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x12\n\nmember_cnt\x18\x02 \x01(\x05\x12\x34\n\x06member\x18\x03 \x03(\x0b\x32$.add_chatroom_member_req.member_info\x12=\n\rchatroom_wxid\x18\x04 \x01(\x0b\x32&.add_chatroom_member_req.chatroom_info\x12\x0c\n\x04tag5\x18\x05 \x01(\x05\x1a\"\n\x0bmember_info\x12\x13\n\x04wxid\x18\x01 \x01(\x0b\x32\x05.Wxid\x1a\x1d\n\rchatroom_info\x12\x0c\n\x04wxid\x18\x01 \x01(\t\"\xb0\x01\n\x18\x61\x64\x64_chatroom_member_resp\x12-\n\x03res\x18\x01 \x01(\x0b\x32 .add_chatroom_member_resp.result\x1a\x65\n\x06result\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x35\n\x03msg\x18\x02 \x01(\x0b\x32(.add_chatroom_member_resp.result.err_msg\x1a\x16\n\x07\x65rr_msg\x12\x0b\n\x03msg\x18\x01 \x01(\t\"B\n\x16op_set_group_nick_name\x12\x0c\n\x04tag1\x18\x01 \x01(\t\x12\x0c\n\x04tag2\x18\x02 \x01(\t\x12\x0c\n\x04tag3\x18\x03 \x01(\x0c\"\xcb\x01\n\toplog_req\x12\x1d\n\x04tag1\x18\x01 \x01(\x0b\x32\x0f.oplog_req.TAG1\x1a\x9e\x01\n\x04TAG1\x12\x0c\n\x04tag1\x18\x01 \x01(\x05\x12 \n\x03\x63md\x18\x02 \x01(\x0b\x32\x13.oplog_req.TAG1.CMD\x1a\x66\n\x03\x43MD\x12\x0e\n\x06\x63md_id\x18\x01 \x01(\x05\x12*\n\x06option\x18\x02 \x01(\x0b\x32\x1a.oplog_req.TAG1.CMD.OPTION\x1a#\n\x06OPTION\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"R\n\noplog_resp\x12\x1f\n\x03res\x18\x02 \x01(\x0b\x32\x12.oplog_resp.result\x1a#\n\x06result\x12\x0c\n\x04\x63ode\x18\x02 \x01(\x0c\x12\x0b\n\x03msg\x18\x03 \x01(\t\"\xbd\x01\n\x0erevoke_msg_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x15\n\rnew_client_id\x18\x03 \x01(\x03\x12\x0b\n\x03utc\x18\x04 \x01(\x05\x12\x0c\n\x04tag5\x18\x05 \x01(\x05\x12\x11\n\tfrom_wxid\x18\x06 \x01(\t\x12\x0f\n\x07to_wxid\x18\x07 \x01(\t\x12\x18\n\x10index_of_request\x18\x08 \x01(\x05\x12\r\n\x05svrid\x18\t \x01(\x03\"D\n\x0frevoke_msg_resp\x12\x13\n\x03res\x18\x01 \x01(\x0b\x32\x06.mmRes\x12\x1c\n\x14response_sys_wording\x18\x03 \x01(\t\"b\n\x1dset_chatroom_announcement_req\x12\x19\n\x05login\x18\x01 \x01(\x0b\x32\n.LoginInfo\x12\x15\n\rchatroom_wxid\x18\x02 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x03 \x01(\t\"5\n\x1eset_chatroom_announcement_resp\x12\x13\n\x03res\x18\x01 \x01(\x0b\x32\x06.mmRes') ) @@ -411,8 +411,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=714, - serialized_end=743, + serialized_start=711, + serialized_end=740, ) _MSG = _descriptor.Descriptor( @@ -486,7 +486,7 @@ is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='anticlient', full_name='Msg.anticlient', index=9, + name='ex_info', full_name='Msg.ex_info', index=9, number=10, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, @@ -526,7 +526,7 @@ oneofs=[ ], serialized_start=464, - serialized_end=743, + serialized_end=740, ) @@ -556,8 +556,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1802, - serialized_end=1826, + serialized_start=1799, + serialized_end=1823, ) _CONTACT_INFO_PY_SHORT = _descriptor.Descriptor( @@ -586,8 +586,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1828, - serialized_end=1852, + serialized_start=1825, + serialized_end=1849, ) _CONTACT_INFO_QUANPIN = _descriptor.Descriptor( @@ -616,8 +616,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1854, - serialized_end=1877, + serialized_start=1851, + serialized_end=1874, ) _CONTACT_INFO_BEIZHU = _descriptor.Descriptor( @@ -646,8 +646,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1879, - serialized_end=1901, + serialized_start=1876, + serialized_end=1898, ) _CONTACT_INFO_REAL_PY_SHORT = _descriptor.Descriptor( @@ -676,8 +676,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1903, - serialized_end=1932, + serialized_start=1900, + serialized_end=1929, ) _CONTACT_INFO_REAL_QUANPIN = _descriptor.Descriptor( @@ -706,8 +706,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1934, - serialized_end=1962, + serialized_start=1931, + serialized_end=1959, ) _CONTACT_INFO_GROUPMEMBERLIST_MEMBERINFO = _descriptor.Descriptor( @@ -725,14 +725,28 @@ is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='tag6', full_name='contact_info.GroupMemberList.MemberInfo.tag6', index=1, + name='nick_name', full_name='contact_info.GroupMemberList.MemberInfo.nick_name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag6', full_name='contact_info.GroupMemberList.MemberInfo.tag6', index=2, number=6, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='tag8', full_name='contact_info.GroupMemberList.MemberInfo.tag8', index=2, + name='inviteer_wxid', full_name='contact_info.GroupMemberList.MemberInfo.inviteer_wxid', index=3, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag8', full_name='contact_info.GroupMemberList.MemberInfo.tag8', index=4, number=8, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -750,8 +764,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2083, - serialized_end=2137, + serialized_start=2080, + serialized_end=2176, ) _CONTACT_INFO_GROUPMEMBERLIST = _descriptor.Descriptor( @@ -801,8 +815,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1965, - serialized_end=2137, + serialized_start=1962, + serialized_end=2176, ) _CONTACT_INFO = _descriptor.Descriptor( @@ -1167,8 +1181,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=746, - serialized_end=2137, + serialized_start=743, + serialized_end=2176, ) @@ -1205,8 +1219,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2317, - serialized_end=2351, + serialized_start=2356, + serialized_end=2390, ) _MANUALAUTHACCOUNTREQUEST_ECDH_ECDHKEY = _descriptor.Descriptor( @@ -1242,8 +1256,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2431, - serialized_end=2466, + serialized_start=2470, + serialized_end=2505, ) _MANUALAUTHACCOUNTREQUEST_ECDH = _descriptor.Descriptor( @@ -1279,8 +1293,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2353, - serialized_end=2466, + serialized_start=2392, + serialized_end=2505, ) _MANUALAUTHACCOUNTREQUEST = _descriptor.Descriptor( @@ -1337,8 +1351,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2140, - serialized_end=2466, + serialized_start=2179, + serialized_end=2505, ) @@ -1389,8 +1403,45 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3054, - serialized_end=3126, + serialized_start=3122, + serialized_end=3194, +) + +_MANUALAUTHDEVICEREQUEST__TAG2_TAG3 = _descriptor.Descriptor( + name='TAG3', + full_name='ManualAuthDeviceRequest._Tag2.TAG3', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='ManualAuthDeviceRequest._Tag2.TAG3.tag1', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='ManualAuthDeviceRequest._Tag2.TAG3.tag2', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3196, + serialized_end=3230, ) _MANUALAUTHDEVICEREQUEST__TAG2 = _descriptor.Descriptor( @@ -1445,7 +1496,7 @@ ], extensions=[ ], - nested_types=[_MANUALAUTHDEVICEREQUEST__TAG2___TAG2, ], + nested_types=[_MANUALAUTHDEVICEREQUEST__TAG2___TAG2, _MANUALAUTHDEVICEREQUEST__TAG2_TAG3, ], enum_types=[ ], options=None, @@ -1454,8 +1505,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2890, - serialized_end=3126, + serialized_start=2929, + serialized_end=3230, ) _MANUALAUTHDEVICEREQUEST = _descriptor.Descriptor( @@ -1603,8 +1654,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2469, - serialized_end=3126, + serialized_start=2508, + serialized_end=3230, ) @@ -1634,8 +1685,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3423, - serialized_end=3444, + serialized_start=3553, + serialized_end=3574, ) _MANUALAUTHRESPONSE_AUTHRESULT = _descriptor.Descriptor( @@ -1671,8 +1722,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3339, - serialized_end=3444, + serialized_start=3469, + serialized_end=3574, ) _MANUALAUTHRESPONSE_AUTHPARAM_ECDH_ECDHKEY = _descriptor.Descriptor( @@ -1708,8 +1759,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3729, - serialized_end=3764, + serialized_start=3859, + serialized_end=3894, ) _MANUALAUTHRESPONSE_AUTHPARAM_ECDH = _descriptor.Descriptor( @@ -1745,8 +1796,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3647, - serialized_end=3764, + serialized_start=3777, + serialized_end=3894, ) _MANUALAUTHRESPONSE_AUTHPARAM_SESSIONKEY = _descriptor.Descriptor( @@ -1782,8 +1833,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3766, - serialized_end=3804, + serialized_start=3896, + serialized_end=3934, ) _MANUALAUTHRESPONSE_AUTHPARAM = _descriptor.Descriptor( @@ -1847,8 +1898,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3447, - serialized_end=3804, + serialized_start=3577, + serialized_end=3934, ) _MANUALAUTHRESPONSE_ACCOUNTINFO = _descriptor.Descriptor( @@ -1982,8 +2033,244 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3807, - serialized_end=4108, + serialized_start=3937, + serialized_end=4238, +) + +_MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO_REAL_HOST_INFO = _descriptor.Descriptor( + name='real_host_info', + full_name='ManualAuthResponse.dns_info.redirect_info.real_host_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='host', full_name='ManualAuthResponse.dns_info.redirect_info.real_host_info.host', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='redirect', full_name='ManualAuthResponse.dns_info.redirect_info.real_host_info.redirect', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4474, + serialized_end=4522, +) + +_MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO = _descriptor.Descriptor( + name='redirect_info', + full_name='ManualAuthResponse.dns_info.redirect_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='cnt', full_name='ManualAuthResponse.dns_info.redirect_info.cnt', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='real_host', full_name='ManualAuthResponse.dns_info.redirect_info.real_host', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO_REAL_HOST_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4366, + serialized_end=4522, +) + +_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_LONGLINK_IP_INFO = _descriptor.Descriptor( + name='longlink_ip_info', + full_name='ManualAuthResponse.dns_info.ip_info.longlink_ip_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ip', full_name='ManualAuthResponse.dns_info.ip_info.longlink_ip_info.ip', index=0, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='host', full_name='ManualAuthResponse.dns_info.ip_info.longlink_ip_info.host', index=1, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4735, + serialized_end=4779, +) + +_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_SHORTLINK_IP_INFO = _descriptor.Descriptor( + name='shortlink_ip_info', + full_name='ManualAuthResponse.dns_info.ip_info.shortlink_ip_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ip', full_name='ManualAuthResponse.dns_info.ip_info.shortlink_ip_info.ip', index=0, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='host', full_name='ManualAuthResponse.dns_info.ip_info.shortlink_ip_info.host', index=1, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4781, + serialized_end=4826, +) + +_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO = _descriptor.Descriptor( + name='ip_info', + full_name='ManualAuthResponse.dns_info.ip_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='longlink_ip_cnt', full_name='ManualAuthResponse.dns_info.ip_info.longlink_ip_cnt', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='shortlink_ip_cnt', full_name='ManualAuthResponse.dns_info.ip_info.shortlink_ip_cnt', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='longlink', full_name='ManualAuthResponse.dns_info.ip_info.longlink', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='shortlink', full_name='ManualAuthResponse.dns_info.ip_info.shortlink', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_LONGLINK_IP_INFO, _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_SHORTLINK_IP_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4525, + serialized_end=4826, +) + +_MANUALAUTHRESPONSE_DNS_INFO = _descriptor.Descriptor( + name='dns_info', + full_name='ManualAuthResponse.dns_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='redirect', full_name='ManualAuthResponse.dns_info.redirect', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ip', full_name='ManualAuthResponse.dns_info.ip', index=1, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO, _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4241, + serialized_end=4826, ) _MANUALAUTHRESPONSE = _descriptor.Descriptor( @@ -2022,16 +2309,16 @@ is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='dnsInfo', full_name='ManualAuthResponse.dnsInfo', index=4, - number=5, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + name='dns', full_name='ManualAuthResponse.dns', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), ], extensions=[ ], - nested_types=[_MANUALAUTHRESPONSE_AUTHRESULT, _MANUALAUTHRESPONSE_AUTHPARAM, _MANUALAUTHRESPONSE_ACCOUNTINFO, ], + nested_types=[_MANUALAUTHRESPONSE_AUTHRESULT, _MANUALAUTHRESPONSE_AUTHPARAM, _MANUALAUTHRESPONSE_ACCOUNTINFO, _MANUALAUTHRESPONSE_DNS_INFO, ], enum_types=[ ], options=None, @@ -2040,8 +2327,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3129, - serialized_end=4108, + serialized_start=3233, + serialized_end=4826, ) @@ -2099,8 +2386,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4110, - serialized_end=4229, + serialized_start=4828, + serialized_end=4947, ) @@ -2165,8 +2452,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4232, - serialized_end=4374, + serialized_start=4950, + serialized_end=5092, ) @@ -2196,8 +2483,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4528, - serialized_end=4557, + serialized_start=5246, + serialized_end=5275, ) _NEW_SYNC_REQ = _descriptor.Descriptor( @@ -2261,8 +2548,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4377, - serialized_end=4557, + serialized_start=5095, + serialized_end=5275, ) @@ -2299,8 +2586,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4701, - serialized_end=4754, + serialized_start=5419, + serialized_end=5472, ) _NEW_SYNC_RESP = _descriptor.Descriptor( @@ -2371,8 +2658,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4560, - serialized_end=4754, + serialized_start=5278, + serialized_end=5472, ) @@ -2418,6 +2705,13 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='at_list', full_name='new_send_msg_req.msg_info.at_list', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -2430,8 +2724,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4831, - serialized_end=4923, + serialized_start=5549, + serialized_end=5658, ) _NEW_SEND_MSG_REQ = _descriptor.Descriptor( @@ -2467,8 +2761,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4757, - serialized_end=4923, + serialized_start=5475, + serialized_end=5658, ) @@ -2519,8 +2813,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5022, - serialized_end=5092, + serialized_start=5757, + serialized_end=5827, ) _NEW_SEND_MSG_RESP = _descriptor.Descriptor( @@ -2563,8 +2857,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4926, - serialized_end=5092, + serialized_start=5661, + serialized_end=5827, ) @@ -2657,8 +2951,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5286, - serialized_end=5460, + serialized_start=6021, + serialized_end=6195, ) _NEW_SEND_APP_MSG_REQ = _descriptor.Descriptor( @@ -2736,8 +3030,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5095, - serialized_end=5460, + serialized_start=5830, + serialized_end=6195, ) @@ -2816,8 +3110,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5463, - serialized_end=5626, + serialized_start=6198, + serialized_end=6361, ) @@ -2875,8 +3169,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5823, - serialized_end=5913, + serialized_start=6558, + serialized_end=6648, ) _VERIFY_USER_REQ = _descriptor.Descriptor( @@ -2954,8 +3248,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5629, - serialized_end=5913, + serialized_start=6364, + serialized_end=6648, ) @@ -2992,8 +3286,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5915, - serialized_end=5968, + serialized_start=6650, + serialized_end=6703, ) @@ -3044,8 +3338,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5970, - serialized_end=6064, + serialized_start=6705, + serialized_end=6799, ) @@ -3075,8 +3369,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6222, - serialized_end=6242, + serialized_start=6957, + serialized_end=6977, ) _RECEIVE_WXHB_RESP_TAG1 = _descriptor.Descriptor( @@ -3105,8 +3399,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6200, - serialized_end=6242, + serialized_start=6935, + serialized_end=6977, ) _RECEIVE_WXHB_RESP = _descriptor.Descriptor( @@ -3163,8 +3457,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6067, - serialized_end=6242, + serialized_start=6802, + serialized_end=6977, ) @@ -3215,8 +3509,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6244, - serialized_end=6335, + serialized_start=6979, + serialized_end=7070, ) @@ -3246,8 +3540,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6222, - serialized_end=6242, + serialized_start=6957, + serialized_end=6977, ) _OPEN_WXHB_RESP_TAG1 = _descriptor.Descriptor( @@ -3276,8 +3570,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6200, - serialized_end=6242, + serialized_start=6935, + serialized_end=6977, ) _OPEN_WXHB_RESP = _descriptor.Descriptor( @@ -3334,23 +3628,2102 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6338, - serialized_end=6503, + serialized_start=7073, + serialized_end=7238, ) -_SYNCKEY_MSGKEY_KEY.containing_type = _SYNCKEY_MSGKEY -_SYNCKEY_MSGKEY.fields_by_name['key'].message_type = _SYNCKEY_MSGKEY_KEY -_SYNCKEY_MSGKEY.containing_type = _SYNCKEY -_SYNCKEY.fields_by_name['msgkey'].message_type = _SYNCKEY_MSGKEY -_COMMON_MSG_DATA.containing_type = _COMMON_MSG -_COMMON_MSG.fields_by_name['data'].message_type = _COMMON_MSG_DATA -_MSG_RAWCONTENT.containing_type = _MSG -_MSG.fields_by_name['from_id'].message_type = _WXID -_MSG.fields_by_name['to_id'].message_type = _WXID -_MSG.fields_by_name['raw'].message_type = _MSG_RAWCONTENT -_CONTACT_INFO_NICKNAME.containing_type = _CONTACT_INFO -_CONTACT_INFO_PY_SHORT.containing_type = _CONTACT_INFO -_CONTACT_INFO_QUANPIN.containing_type = _CONTACT_INFO + +_QRY_DETAIL_WXHB_REQ = _descriptor.Descriptor( + name='qry_detail_wxhb_req', + full_name='qry_detail_wxhb_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='qry_detail_wxhb_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='cmd', full_name='qry_detail_wxhb_req.cmd', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag3', full_name='qry_detail_wxhb_req.tag3', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='info', full_name='qry_detail_wxhb_req.info', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7240, + serialized_end=7337, +) + + +_QRY_DETAIL_WXHB_RESP_TAG1_TAG1 = _descriptor.Descriptor( + name='TAG1', + full_name='qry_detail_wxhb_resp.TAG1.TAG1', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='qry_detail_wxhb_resp.TAG1.TAG1.tag1', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6957, + serialized_end=6977, +) + +_QRY_DETAIL_WXHB_RESP_TAG1 = _descriptor.Descriptor( + name='TAG1', + full_name='qry_detail_wxhb_resp.TAG1', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='qry_detail_wxhb_resp.TAG1.tag1', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_QRY_DETAIL_WXHB_RESP_TAG1_TAG1, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6935, + serialized_end=6977, +) + +_QRY_DETAIL_WXHB_RESP = _descriptor.Descriptor( + name='qry_detail_wxhb_resp', + full_name='qry_detail_wxhb_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='qry_detail_wxhb_resp.tag1', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='res', full_name='qry_detail_wxhb_resp.res', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='cmd', full_name='qry_detail_wxhb_resp.cmd', index=2, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ret_code', full_name='qry_detail_wxhb_resp.ret_code', index=3, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ret_msg', full_name='qry_detail_wxhb_resp.ret_msg', index=4, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_QRY_DETAIL_WXHB_RESP_TAG1, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7340, + serialized_end=7517, +) + + +_SEND_EMOJI_REQ_EMOJI_INFO_TAG4 = _descriptor.Descriptor( + name='TAG4', + full_name='send_emoji_req.emoji_info.TAG4', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='send_emoji_req.emoji_info.TAG4.tag1', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7839, + serialized_end=7859, +) + +_SEND_EMOJI_REQ_EMOJI_INFO = _descriptor.Descriptor( + name='emoji_info', + full_name='send_emoji_req.emoji_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='animation_id', full_name='send_emoji_req.emoji_info.animation_id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='send_emoji_req.emoji_info.tag2', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag3', full_name='send_emoji_req.emoji_info.tag3', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag4', full_name='send_emoji_req.emoji_info.tag4', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag5', full_name='send_emoji_req.emoji_info.tag5', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='to_wxid', full_name='send_emoji_req.emoji_info.to_wxid', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='game_ext', full_name='send_emoji_req.emoji_info.game_ext', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag8', full_name='send_emoji_req.emoji_info.tag8', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='utc', full_name='send_emoji_req.emoji_info.utc', index=8, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag11', full_name='send_emoji_req.emoji_info.tag11', index=9, + number=11, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_SEND_EMOJI_REQ_EMOJI_INFO_TAG4, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7637, + serialized_end=7859, +) + +_SEND_EMOJI_REQ = _descriptor.Descriptor( + name='send_emoji_req', + full_name='send_emoji_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='send_emoji_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='send_emoji_req.tag2', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='emoji', full_name='send_emoji_req.emoji', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag4', full_name='send_emoji_req.tag4', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_SEND_EMOJI_REQ_EMOJI_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7520, + serialized_end=7859, +) + + +_SEND_EMOJI_RESP_RESULT = _descriptor.Descriptor( + name='result', + full_name='send_emoji_resp.result', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='code', full_name='send_emoji_resp.result.code', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='send_emoji_resp.result.tag2', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag3', full_name='send_emoji_resp.result.tag3', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='file_name', full_name='send_emoji_resp.result.file_name', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='svrid', full_name='send_emoji_resp.result.svrid', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag6', full_name='send_emoji_resp.result.tag6', index=5, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7919, + serialized_end=8017, +) + +_SEND_EMOJI_RESP = _descriptor.Descriptor( + name='send_emoji_resp', + full_name='send_emoji_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='send_emoji_resp.res', index=0, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_SEND_EMOJI_RESP_RESULT, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7862, + serialized_end=8017, +) + + +_TRANSFER_OPERATION_REQ = _descriptor.Descriptor( + name='transfer_operation_req', + full_name='transfer_operation_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='transfer_operation_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='transfer_operation_req.tag2', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag3', full_name='transfer_operation_req.tag3', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='info', full_name='transfer_operation_req.info', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8019, + serialized_end=8120, +) + + +_TRANSFER_OPERATION_RESP = _descriptor.Descriptor( + name='transfer_operation_resp', + full_name='transfer_operation_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='transfer_operation_resp.res', index=0, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ret_code', full_name='transfer_operation_resp.ret_code', index=1, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ret_msg', full_name='transfer_operation_resp.ret_msg', index=2, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8122, + serialized_end=8203, +) + + +_TRANSFER_QUERY_REQ = _descriptor.Descriptor( + name='transfer_query_req', + full_name='transfer_query_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='transfer_query_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='transfer_query_req.tag2', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag3', full_name='transfer_query_req.tag3', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='info', full_name='transfer_query_req.info', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8205, + serialized_end=8302, +) + + +_TRANSFER_QUERY_RESP = _descriptor.Descriptor( + name='transfer_query_resp', + full_name='transfer_query_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='transfer_query_resp.res', index=0, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ret_code', full_name='transfer_query_resp.ret_code', index=1, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ret_msg', full_name='transfer_query_resp.ret_msg', index=2, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8304, + serialized_end=8381, +) + + +_GET_CONTACT_REQ_TAG7 = _descriptor.Descriptor( + name='TAG7', + full_name='get_contact_req.TAG7', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='get_contact_req.TAG7.tag1', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8544, + serialized_end=8564, +) + +_GET_CONTACT_REQ = _descriptor.Descriptor( + name='get_contact_req', + full_name='get_contact_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='get_contact_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='get_contact_req.tag2', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='wxid', full_name='get_contact_req.wxid', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag4', full_name='get_contact_req.tag4', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag6', full_name='get_contact_req.tag6', index=4, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag7', full_name='get_contact_req.tag7', index=5, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag8', full_name='get_contact_req.tag8', index=6, + number=8, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_GET_CONTACT_REQ_TAG7, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8384, + serialized_end=8564, +) + + +_GET_CONTACT_RESP_TICKET_INFO = _descriptor.Descriptor( + name='ticket_info', + full_name='get_contact_resp.ticket_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='wxid', full_name='get_contact_resp.ticket_info.wxid', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ticket', full_name='get_contact_resp.ticket_info.ticket', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8663, + serialized_end=8706, +) + +_GET_CONTACT_RESP = _descriptor.Descriptor( + name='get_contact_resp', + full_name='get_contact_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='info', full_name='get_contact_resp.info', index=0, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ticket', full_name='get_contact_resp.ticket', index=1, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_GET_CONTACT_RESP_TICKET_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8567, + serialized_end=8706, +) + + +_CREATE_CHATROOM_REQ_TAG2 = _descriptor.Descriptor( + name='TAG2', + full_name='create_chatroom_req.TAG2', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='create_chatroom_req.TAG2.tag1', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8884, + serialized_end=8904, +) + +_CREATE_CHATROOM_REQ_MEMBER_INFO = _descriptor.Descriptor( + name='member_info', + full_name='create_chatroom_req.member_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='wxid', full_name='create_chatroom_req.member_info.wxid', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8906, + serialized_end=8940, +) + +_CREATE_CHATROOM_REQ = _descriptor.Descriptor( + name='create_chatroom_req', + full_name='create_chatroom_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='create_chatroom_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='create_chatroom_req.tag2', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='member_cnt', full_name='create_chatroom_req.member_cnt', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='member', full_name='create_chatroom_req.member', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag5', full_name='create_chatroom_req.tag5', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_CREATE_CHATROOM_REQ_TAG2, _CREATE_CHATROOM_REQ_MEMBER_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8709, + serialized_end=8940, +) + + +_CREATE_CHATROOM_RESP_RESULT_ERR_MSG = _descriptor.Descriptor( + name='err_msg', + full_name='create_chatroom_resp.result.err_msg', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='msg', full_name='create_chatroom_resp.result.err_msg.msg', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9241, + serialized_end=9263, +) + +_CREATE_CHATROOM_RESP_RESULT = _descriptor.Descriptor( + name='result', + full_name='create_chatroom_resp.result', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='code', full_name='create_chatroom_resp.result.code', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='msg', full_name='create_chatroom_resp.result.msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_CREATE_CHATROOM_RESP_RESULT_ERR_MSG, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9166, + serialized_end=9263, +) + +_CREATE_CHATROOM_RESP_MEMBER_INFO_NICK_NAME_INFO = _descriptor.Descriptor( + name='nick_name_info', + full_name='create_chatroom_resp.member_info.nick_name_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='create_chatroom_resp.member_info.nick_name_info.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9389, + serialized_end=9419, +) + +_CREATE_CHATROOM_RESP_MEMBER_INFO = _descriptor.Descriptor( + name='member_info', + full_name='create_chatroom_resp.member_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='wxid', full_name='create_chatroom_resp.member_info.wxid', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='nick_name', full_name='create_chatroom_resp.member_info.nick_name', index=1, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='qianming', full_name='create_chatroom_resp.member_info.qianming', index=2, + number=15, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_CREATE_CHATROOM_RESP_MEMBER_INFO_NICK_NAME_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9266, + serialized_end=9419, +) + +_CREATE_CHATROOM_RESP_CHATROOM_AVATAR = _descriptor.Descriptor( + name='chatroom_avatar', + full_name='create_chatroom_resp.chatroom_avatar', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='len', full_name='create_chatroom_resp.chatroom_avatar.len', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data', full_name='create_chatroom_resp.chatroom_avatar.data', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9421, + serialized_end=9465, +) + +_CREATE_CHATROOM_RESP = _descriptor.Descriptor( + name='create_chatroom_resp', + full_name='create_chatroom_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='create_chatroom_resp.res', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='member_cnt', full_name='create_chatroom_resp.member_cnt', index=1, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='member', full_name='create_chatroom_resp.member', index=2, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='chatroom_wxid', full_name='create_chatroom_resp.chatroom_wxid', index=3, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='avatar', full_name='create_chatroom_resp.avatar', index=4, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_CREATE_CHATROOM_RESP_RESULT, _CREATE_CHATROOM_RESP_MEMBER_INFO, _CREATE_CHATROOM_RESP_CHATROOM_AVATAR, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8943, + serialized_end=9465, +) + + +_MM_FACING_CREATE_CHATROOM_REQ = _descriptor.Descriptor( + name='mm_facing_create_chatroom_req', + full_name='mm_facing_create_chatroom_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='mm_facing_create_chatroom_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='op_code', full_name='mm_facing_create_chatroom_req.op_code', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='chatroom_pwd', full_name='mm_facing_create_chatroom_req.chatroom_pwd', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='lon', full_name='mm_facing_create_chatroom_req.lon', index=3, + number=4, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='lat', full_name='mm_facing_create_chatroom_req.lat', index=4, + number=5, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag6', full_name='mm_facing_create_chatroom_req.tag6', index=5, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag9', full_name='mm_facing_create_chatroom_req.tag9', index=6, + number=9, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag10', full_name='mm_facing_create_chatroom_req.tag10', index=7, + number=10, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9468, + serialized_end=9634, +) + + +_MM_FACING_CREATE_CHATROOM_RESP_RESULT_ERR_MSG = _descriptor.Descriptor( + name='err_msg', + full_name='mm_facing_create_chatroom_resp.result.err_msg', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='msg', full_name='mm_facing_create_chatroom_resp.result.err_msg.msg', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9241, + serialized_end=9263, +) + +_MM_FACING_CREATE_CHATROOM_RESP_RESULT = _descriptor.Descriptor( + name='result', + full_name='mm_facing_create_chatroom_resp.result', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='code', full_name='mm_facing_create_chatroom_resp.result.code', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='msg', full_name='mm_facing_create_chatroom_resp.result.msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_MM_FACING_CREATE_CHATROOM_RESP_RESULT_ERR_MSG, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9819, + serialized_end=9926, +) + +_MM_FACING_CREATE_CHATROOM_RESP_MEMBER_INFO = _descriptor.Descriptor( + name='member_info', + full_name='mm_facing_create_chatroom_resp.member_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='msg', full_name='mm_facing_create_chatroom_resp.member_info.msg', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='nick_name', full_name='mm_facing_create_chatroom_resp.member_info.nick_name', index=1, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9928, + serialized_end=9973, +) + +_MM_FACING_CREATE_CHATROOM_RESP = _descriptor.Descriptor( + name='mm_facing_create_chatroom_resp', + full_name='mm_facing_create_chatroom_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='mm_facing_create_chatroom_resp.res', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='member_cnt', full_name='mm_facing_create_chatroom_resp.member_cnt', index=1, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='member', full_name='mm_facing_create_chatroom_resp.member', index=2, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='wxid', full_name='mm_facing_create_chatroom_resp.wxid', index=3, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_MM_FACING_CREATE_CHATROOM_RESP_RESULT, _MM_FACING_CREATE_CHATROOM_RESP_MEMBER_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9637, + serialized_end=9973, +) + + +_ADD_CHATROOM_MEMBER_REQ_MEMBER_INFO = _descriptor.Descriptor( + name='member_info', + full_name='add_chatroom_member_req.member_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='wxid', full_name='add_chatroom_member_req.member_info.wxid', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8906, + serialized_end=8940, +) + +_ADD_CHATROOM_MEMBER_REQ_CHATROOM_INFO = _descriptor.Descriptor( + name='chatroom_info', + full_name='add_chatroom_member_req.chatroom_info', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='wxid', full_name='add_chatroom_member_req.chatroom_info.wxid', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10217, + serialized_end=10246, +) + +_ADD_CHATROOM_MEMBER_REQ = _descriptor.Descriptor( + name='add_chatroom_member_req', + full_name='add_chatroom_member_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='add_chatroom_member_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='member_cnt', full_name='add_chatroom_member_req.member_cnt', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='member', full_name='add_chatroom_member_req.member', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='chatroom_wxid', full_name='add_chatroom_member_req.chatroom_wxid', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag5', full_name='add_chatroom_member_req.tag5', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_ADD_CHATROOM_MEMBER_REQ_MEMBER_INFO, _ADD_CHATROOM_MEMBER_REQ_CHATROOM_INFO, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9976, + serialized_end=10246, +) + + +_ADD_CHATROOM_MEMBER_RESP_RESULT_ERR_MSG = _descriptor.Descriptor( + name='err_msg', + full_name='add_chatroom_member_resp.result.err_msg', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='msg', full_name='add_chatroom_member_resp.result.err_msg.msg', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=9241, + serialized_end=9263, +) + +_ADD_CHATROOM_MEMBER_RESP_RESULT = _descriptor.Descriptor( + name='result', + full_name='add_chatroom_member_resp.result', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='code', full_name='add_chatroom_member_resp.result.code', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='msg', full_name='add_chatroom_member_resp.result.msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_ADD_CHATROOM_MEMBER_RESP_RESULT_ERR_MSG, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10324, + serialized_end=10425, +) + +_ADD_CHATROOM_MEMBER_RESP = _descriptor.Descriptor( + name='add_chatroom_member_resp', + full_name='add_chatroom_member_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='add_chatroom_member_resp.res', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_ADD_CHATROOM_MEMBER_RESP_RESULT, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10249, + serialized_end=10425, +) + + +_OP_SET_GROUP_NICK_NAME = _descriptor.Descriptor( + name='op_set_group_nick_name', + full_name='op_set_group_nick_name', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='op_set_group_nick_name.tag1', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag2', full_name='op_set_group_nick_name.tag2', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag3', full_name='op_set_group_nick_name.tag3', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10427, + serialized_end=10493, +) + + +_OPLOG_REQ_TAG1_CMD_OPTION = _descriptor.Descriptor( + name='OPTION', + full_name='oplog_req.TAG1.CMD.OPTION', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='len', full_name='oplog_req.TAG1.CMD.OPTION.len', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data', full_name='oplog_req.TAG1.CMD.OPTION.data', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10664, + serialized_end=10699, +) + +_OPLOG_REQ_TAG1_CMD = _descriptor.Descriptor( + name='CMD', + full_name='oplog_req.TAG1.CMD', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='cmd_id', full_name='oplog_req.TAG1.CMD.cmd_id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='option', full_name='oplog_req.TAG1.CMD.option', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_OPLOG_REQ_TAG1_CMD_OPTION, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10597, + serialized_end=10699, +) + +_OPLOG_REQ_TAG1 = _descriptor.Descriptor( + name='TAG1', + full_name='oplog_req.TAG1', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='oplog_req.TAG1.tag1', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='cmd', full_name='oplog_req.TAG1.cmd', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_OPLOG_REQ_TAG1_CMD, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10541, + serialized_end=10699, +) + +_OPLOG_REQ = _descriptor.Descriptor( + name='oplog_req', + full_name='oplog_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tag1', full_name='oplog_req.tag1', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_OPLOG_REQ_TAG1, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10496, + serialized_end=10699, +) + + +_OPLOG_RESP_RESULT = _descriptor.Descriptor( + name='result', + full_name='oplog_resp.result', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='code', full_name='oplog_resp.result.code', index=0, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='msg', full_name='oplog_resp.result.msg', index=1, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10748, + serialized_end=10783, +) + +_OPLOG_RESP = _descriptor.Descriptor( + name='oplog_resp', + full_name='oplog_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='oplog_resp.res', index=0, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_OPLOG_RESP_RESULT, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10701, + serialized_end=10783, +) + + +_REVOKE_MSG_REQ = _descriptor.Descriptor( + name='revoke_msg_req', + full_name='revoke_msg_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='revoke_msg_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='client_id', full_name='revoke_msg_req.client_id', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='new_client_id', full_name='revoke_msg_req.new_client_id', index=2, + number=3, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='utc', full_name='revoke_msg_req.utc', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag5', full_name='revoke_msg_req.tag5', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='from_wxid', full_name='revoke_msg_req.from_wxid', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='to_wxid', full_name='revoke_msg_req.to_wxid', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='index_of_request', full_name='revoke_msg_req.index_of_request', index=7, + number=8, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='svrid', full_name='revoke_msg_req.svrid', index=8, + number=9, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10786, + serialized_end=10975, +) + + +_REVOKE_MSG_RESP = _descriptor.Descriptor( + name='revoke_msg_resp', + full_name='revoke_msg_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='revoke_msg_resp.res', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='response_sys_wording', full_name='revoke_msg_resp.response_sys_wording', index=1, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10977, + serialized_end=11045, +) + + +_SET_CHATROOM_ANNOUNCEMENT_REQ = _descriptor.Descriptor( + name='set_chatroom_announcement_req', + full_name='set_chatroom_announcement_req', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='login', full_name='set_chatroom_announcement_req.login', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='chatroom_wxid', full_name='set_chatroom_announcement_req.chatroom_wxid', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='content', full_name='set_chatroom_announcement_req.content', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=11047, + serialized_end=11145, +) + + +_SET_CHATROOM_ANNOUNCEMENT_RESP = _descriptor.Descriptor( + name='set_chatroom_announcement_resp', + full_name='set_chatroom_announcement_resp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='res', full_name='set_chatroom_announcement_resp.res', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=11147, + serialized_end=11200, +) + +_SYNCKEY_MSGKEY_KEY.containing_type = _SYNCKEY_MSGKEY +_SYNCKEY_MSGKEY.fields_by_name['key'].message_type = _SYNCKEY_MSGKEY_KEY +_SYNCKEY_MSGKEY.containing_type = _SYNCKEY +_SYNCKEY.fields_by_name['msgkey'].message_type = _SYNCKEY_MSGKEY +_COMMON_MSG_DATA.containing_type = _COMMON_MSG +_COMMON_MSG.fields_by_name['data'].message_type = _COMMON_MSG_DATA +_MSG_RAWCONTENT.containing_type = _MSG +_MSG.fields_by_name['from_id'].message_type = _WXID +_MSG.fields_by_name['to_id'].message_type = _WXID +_MSG.fields_by_name['raw'].message_type = _MSG_RAWCONTENT +_CONTACT_INFO_NICKNAME.containing_type = _CONTACT_INFO +_CONTACT_INFO_PY_SHORT.containing_type = _CONTACT_INFO +_CONTACT_INFO_QUANPIN.containing_type = _CONTACT_INFO _CONTACT_INFO_BEIZHU.containing_type = _CONTACT_INFO _CONTACT_INFO_REAL_PY_SHORT.containing_type = _CONTACT_INFO _CONTACT_INFO_REAL_QUANPIN.containing_type = _CONTACT_INFO @@ -3373,9 +5746,10 @@ _MANUALAUTHACCOUNTREQUEST.fields_by_name['ecdh'].message_type = _MANUALAUTHACCOUNTREQUEST_ECDH _MANUALAUTHDEVICEREQUEST__TAG2___TAG2.fields_by_name['tag4'].message_type = _MMSTR _MANUALAUTHDEVICEREQUEST__TAG2___TAG2.containing_type = _MANUALAUTHDEVICEREQUEST__TAG2 +_MANUALAUTHDEVICEREQUEST__TAG2_TAG3.containing_type = _MANUALAUTHDEVICEREQUEST__TAG2 _MANUALAUTHDEVICEREQUEST__TAG2.fields_by_name['tag1'].message_type = _MMSTR _MANUALAUTHDEVICEREQUEST__TAG2.fields_by_name['tag2'].message_type = _MANUALAUTHDEVICEREQUEST__TAG2___TAG2 -_MANUALAUTHDEVICEREQUEST__TAG2.fields_by_name['tag3'].message_type = _MMSTR +_MANUALAUTHDEVICEREQUEST__TAG2.fields_by_name['tag3'].message_type = _MANUALAUTHDEVICEREQUEST__TAG2_TAG3 _MANUALAUTHDEVICEREQUEST__TAG2.fields_by_name['tag4'].message_type = _MMSTR _MANUALAUTHDEVICEREQUEST__TAG2.fields_by_name['tag5'].message_type = _MMSTR _MANUALAUTHDEVICEREQUEST__TAG2.containing_type = _MANUALAUTHDEVICEREQUEST @@ -3392,9 +5766,21 @@ _MANUALAUTHRESPONSE_AUTHPARAM.fields_by_name['session'].message_type = _MANUALAUTHRESPONSE_AUTHPARAM_SESSIONKEY _MANUALAUTHRESPONSE_AUTHPARAM.containing_type = _MANUALAUTHRESPONSE _MANUALAUTHRESPONSE_ACCOUNTINFO.containing_type = _MANUALAUTHRESPONSE +_MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO_REAL_HOST_INFO.containing_type = _MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO +_MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO.fields_by_name['real_host'].message_type = _MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO_REAL_HOST_INFO +_MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO.containing_type = _MANUALAUTHRESPONSE_DNS_INFO +_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_LONGLINK_IP_INFO.containing_type = _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO +_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_SHORTLINK_IP_INFO.containing_type = _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO +_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO.fields_by_name['longlink'].message_type = _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_LONGLINK_IP_INFO +_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO.fields_by_name['shortlink'].message_type = _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_SHORTLINK_IP_INFO +_MANUALAUTHRESPONSE_DNS_INFO_IP_INFO.containing_type = _MANUALAUTHRESPONSE_DNS_INFO +_MANUALAUTHRESPONSE_DNS_INFO.fields_by_name['redirect'].message_type = _MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO +_MANUALAUTHRESPONSE_DNS_INFO.fields_by_name['ip'].message_type = _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO +_MANUALAUTHRESPONSE_DNS_INFO.containing_type = _MANUALAUTHRESPONSE _MANUALAUTHRESPONSE.fields_by_name['result'].message_type = _MANUALAUTHRESPONSE_AUTHRESULT _MANUALAUTHRESPONSE.fields_by_name['authParam'].message_type = _MANUALAUTHRESPONSE_AUTHPARAM _MANUALAUTHRESPONSE.fields_by_name['accountInfo'].message_type = _MANUALAUTHRESPONSE_ACCOUNTINFO +_MANUALAUTHRESPONSE.fields_by_name['dns'].message_type = _MANUALAUTHRESPONSE_DNS_INFO _NEWINITREQUEST.fields_by_name['login'].message_type = _LOGININFO _NEWINITRESPONSE.fields_by_name['tag7'].message_type = _COMMON_MSG _NEW_SYNC_REQ_CONTINUE_FLAG.containing_type = _NEW_SYNC_REQ @@ -3430,6 +5816,79 @@ _OPEN_WXHB_RESP_TAG1.containing_type = _OPEN_WXHB_RESP _OPEN_WXHB_RESP.fields_by_name['tag1'].message_type = _OPEN_WXHB_RESP_TAG1 _OPEN_WXHB_RESP.fields_by_name['res'].message_type = _MMSTR +_QRY_DETAIL_WXHB_REQ.fields_by_name['login'].message_type = _LOGININFO +_QRY_DETAIL_WXHB_REQ.fields_by_name['info'].message_type = _MMSTR +_QRY_DETAIL_WXHB_RESP_TAG1_TAG1.containing_type = _QRY_DETAIL_WXHB_RESP_TAG1 +_QRY_DETAIL_WXHB_RESP_TAG1.containing_type = _QRY_DETAIL_WXHB_RESP +_QRY_DETAIL_WXHB_RESP.fields_by_name['tag1'].message_type = _QRY_DETAIL_WXHB_RESP_TAG1 +_QRY_DETAIL_WXHB_RESP.fields_by_name['res'].message_type = _MMSTR +_SEND_EMOJI_REQ_EMOJI_INFO_TAG4.containing_type = _SEND_EMOJI_REQ_EMOJI_INFO +_SEND_EMOJI_REQ_EMOJI_INFO.fields_by_name['tag4'].message_type = _SEND_EMOJI_REQ_EMOJI_INFO_TAG4 +_SEND_EMOJI_REQ_EMOJI_INFO.containing_type = _SEND_EMOJI_REQ +_SEND_EMOJI_REQ.fields_by_name['login'].message_type = _LOGININFO +_SEND_EMOJI_REQ.fields_by_name['emoji'].message_type = _SEND_EMOJI_REQ_EMOJI_INFO +_SEND_EMOJI_RESP_RESULT.containing_type = _SEND_EMOJI_RESP +_SEND_EMOJI_RESP.fields_by_name['res'].message_type = _SEND_EMOJI_RESP_RESULT +_TRANSFER_OPERATION_REQ.fields_by_name['login'].message_type = _LOGININFO +_TRANSFER_OPERATION_REQ.fields_by_name['info'].message_type = _MMSTR +_TRANSFER_OPERATION_RESP.fields_by_name['res'].message_type = _MMSTR +_TRANSFER_QUERY_REQ.fields_by_name['login'].message_type = _LOGININFO +_TRANSFER_QUERY_REQ.fields_by_name['info'].message_type = _MMSTR +_TRANSFER_QUERY_RESP.fields_by_name['res'].message_type = _MMSTR +_GET_CONTACT_REQ_TAG7.containing_type = _GET_CONTACT_REQ +_GET_CONTACT_REQ.fields_by_name['login'].message_type = _LOGININFO +_GET_CONTACT_REQ.fields_by_name['wxid'].message_type = _WXID +_GET_CONTACT_REQ.fields_by_name['tag7'].message_type = _GET_CONTACT_REQ_TAG7 +_GET_CONTACT_RESP_TICKET_INFO.containing_type = _GET_CONTACT_RESP +_GET_CONTACT_RESP.fields_by_name['info'].message_type = _CONTACT_INFO +_GET_CONTACT_RESP.fields_by_name['ticket'].message_type = _GET_CONTACT_RESP_TICKET_INFO +_CREATE_CHATROOM_REQ_TAG2.containing_type = _CREATE_CHATROOM_REQ +_CREATE_CHATROOM_REQ_MEMBER_INFO.fields_by_name['wxid'].message_type = _WXID +_CREATE_CHATROOM_REQ_MEMBER_INFO.containing_type = _CREATE_CHATROOM_REQ +_CREATE_CHATROOM_REQ.fields_by_name['login'].message_type = _LOGININFO +_CREATE_CHATROOM_REQ.fields_by_name['tag2'].message_type = _CREATE_CHATROOM_REQ_TAG2 +_CREATE_CHATROOM_REQ.fields_by_name['member'].message_type = _CREATE_CHATROOM_REQ_MEMBER_INFO +_CREATE_CHATROOM_RESP_RESULT_ERR_MSG.containing_type = _CREATE_CHATROOM_RESP_RESULT +_CREATE_CHATROOM_RESP_RESULT.fields_by_name['msg'].message_type = _CREATE_CHATROOM_RESP_RESULT_ERR_MSG +_CREATE_CHATROOM_RESP_RESULT.containing_type = _CREATE_CHATROOM_RESP +_CREATE_CHATROOM_RESP_MEMBER_INFO_NICK_NAME_INFO.containing_type = _CREATE_CHATROOM_RESP_MEMBER_INFO +_CREATE_CHATROOM_RESP_MEMBER_INFO.fields_by_name['wxid'].message_type = _WXID +_CREATE_CHATROOM_RESP_MEMBER_INFO.fields_by_name['nick_name'].message_type = _CREATE_CHATROOM_RESP_MEMBER_INFO_NICK_NAME_INFO +_CREATE_CHATROOM_RESP_MEMBER_INFO.containing_type = _CREATE_CHATROOM_RESP +_CREATE_CHATROOM_RESP_CHATROOM_AVATAR.containing_type = _CREATE_CHATROOM_RESP +_CREATE_CHATROOM_RESP.fields_by_name['res'].message_type = _CREATE_CHATROOM_RESP_RESULT +_CREATE_CHATROOM_RESP.fields_by_name['member'].message_type = _CREATE_CHATROOM_RESP_MEMBER_INFO +_CREATE_CHATROOM_RESP.fields_by_name['chatroom_wxid'].message_type = _WXID +_CREATE_CHATROOM_RESP.fields_by_name['avatar'].message_type = _CREATE_CHATROOM_RESP_CHATROOM_AVATAR +_MM_FACING_CREATE_CHATROOM_REQ.fields_by_name['login'].message_type = _LOGININFO +_MM_FACING_CREATE_CHATROOM_RESP_RESULT_ERR_MSG.containing_type = _MM_FACING_CREATE_CHATROOM_RESP_RESULT +_MM_FACING_CREATE_CHATROOM_RESP_RESULT.fields_by_name['msg'].message_type = _MM_FACING_CREATE_CHATROOM_RESP_RESULT_ERR_MSG +_MM_FACING_CREATE_CHATROOM_RESP_RESULT.containing_type = _MM_FACING_CREATE_CHATROOM_RESP +_MM_FACING_CREATE_CHATROOM_RESP_MEMBER_INFO.containing_type = _MM_FACING_CREATE_CHATROOM_RESP +_MM_FACING_CREATE_CHATROOM_RESP.fields_by_name['res'].message_type = _MM_FACING_CREATE_CHATROOM_RESP_RESULT +_MM_FACING_CREATE_CHATROOM_RESP.fields_by_name['member'].message_type = _MM_FACING_CREATE_CHATROOM_RESP_MEMBER_INFO +_ADD_CHATROOM_MEMBER_REQ_MEMBER_INFO.fields_by_name['wxid'].message_type = _WXID +_ADD_CHATROOM_MEMBER_REQ_MEMBER_INFO.containing_type = _ADD_CHATROOM_MEMBER_REQ +_ADD_CHATROOM_MEMBER_REQ_CHATROOM_INFO.containing_type = _ADD_CHATROOM_MEMBER_REQ +_ADD_CHATROOM_MEMBER_REQ.fields_by_name['login'].message_type = _LOGININFO +_ADD_CHATROOM_MEMBER_REQ.fields_by_name['member'].message_type = _ADD_CHATROOM_MEMBER_REQ_MEMBER_INFO +_ADD_CHATROOM_MEMBER_REQ.fields_by_name['chatroom_wxid'].message_type = _ADD_CHATROOM_MEMBER_REQ_CHATROOM_INFO +_ADD_CHATROOM_MEMBER_RESP_RESULT_ERR_MSG.containing_type = _ADD_CHATROOM_MEMBER_RESP_RESULT +_ADD_CHATROOM_MEMBER_RESP_RESULT.fields_by_name['msg'].message_type = _ADD_CHATROOM_MEMBER_RESP_RESULT_ERR_MSG +_ADD_CHATROOM_MEMBER_RESP_RESULT.containing_type = _ADD_CHATROOM_MEMBER_RESP +_ADD_CHATROOM_MEMBER_RESP.fields_by_name['res'].message_type = _ADD_CHATROOM_MEMBER_RESP_RESULT +_OPLOG_REQ_TAG1_CMD_OPTION.containing_type = _OPLOG_REQ_TAG1_CMD +_OPLOG_REQ_TAG1_CMD.fields_by_name['option'].message_type = _OPLOG_REQ_TAG1_CMD_OPTION +_OPLOG_REQ_TAG1_CMD.containing_type = _OPLOG_REQ_TAG1 +_OPLOG_REQ_TAG1.fields_by_name['cmd'].message_type = _OPLOG_REQ_TAG1_CMD +_OPLOG_REQ_TAG1.containing_type = _OPLOG_REQ +_OPLOG_REQ.fields_by_name['tag1'].message_type = _OPLOG_REQ_TAG1 +_OPLOG_RESP_RESULT.containing_type = _OPLOG_RESP +_OPLOG_RESP.fields_by_name['res'].message_type = _OPLOG_RESP_RESULT +_REVOKE_MSG_REQ.fields_by_name['login'].message_type = _LOGININFO +_REVOKE_MSG_RESP.fields_by_name['res'].message_type = _MMRES +_SET_CHATROOM_ANNOUNCEMENT_REQ.fields_by_name['login'].message_type = _LOGININFO +_SET_CHATROOM_ANNOUNCEMENT_RESP.fields_by_name['res'].message_type = _MMRES DESCRIPTOR.message_types_by_name['mmStr'] = _MMSTR DESCRIPTOR.message_types_by_name['mmRes'] = _MMRES DESCRIPTOR.message_types_by_name['LoginInfo'] = _LOGININFO @@ -3455,6 +5914,29 @@ DESCRIPTOR.message_types_by_name['receive_wxhb_resp'] = _RECEIVE_WXHB_RESP DESCRIPTOR.message_types_by_name['open_wxhb_req'] = _OPEN_WXHB_REQ DESCRIPTOR.message_types_by_name['open_wxhb_resp'] = _OPEN_WXHB_RESP +DESCRIPTOR.message_types_by_name['qry_detail_wxhb_req'] = _QRY_DETAIL_WXHB_REQ +DESCRIPTOR.message_types_by_name['qry_detail_wxhb_resp'] = _QRY_DETAIL_WXHB_RESP +DESCRIPTOR.message_types_by_name['send_emoji_req'] = _SEND_EMOJI_REQ +DESCRIPTOR.message_types_by_name['send_emoji_resp'] = _SEND_EMOJI_RESP +DESCRIPTOR.message_types_by_name['transfer_operation_req'] = _TRANSFER_OPERATION_REQ +DESCRIPTOR.message_types_by_name['transfer_operation_resp'] = _TRANSFER_OPERATION_RESP +DESCRIPTOR.message_types_by_name['transfer_query_req'] = _TRANSFER_QUERY_REQ +DESCRIPTOR.message_types_by_name['transfer_query_resp'] = _TRANSFER_QUERY_RESP +DESCRIPTOR.message_types_by_name['get_contact_req'] = _GET_CONTACT_REQ +DESCRIPTOR.message_types_by_name['get_contact_resp'] = _GET_CONTACT_RESP +DESCRIPTOR.message_types_by_name['create_chatroom_req'] = _CREATE_CHATROOM_REQ +DESCRIPTOR.message_types_by_name['create_chatroom_resp'] = _CREATE_CHATROOM_RESP +DESCRIPTOR.message_types_by_name['mm_facing_create_chatroom_req'] = _MM_FACING_CREATE_CHATROOM_REQ +DESCRIPTOR.message_types_by_name['mm_facing_create_chatroom_resp'] = _MM_FACING_CREATE_CHATROOM_RESP +DESCRIPTOR.message_types_by_name['add_chatroom_member_req'] = _ADD_CHATROOM_MEMBER_REQ +DESCRIPTOR.message_types_by_name['add_chatroom_member_resp'] = _ADD_CHATROOM_MEMBER_RESP +DESCRIPTOR.message_types_by_name['op_set_group_nick_name'] = _OP_SET_GROUP_NICK_NAME +DESCRIPTOR.message_types_by_name['oplog_req'] = _OPLOG_REQ +DESCRIPTOR.message_types_by_name['oplog_resp'] = _OPLOG_RESP +DESCRIPTOR.message_types_by_name['revoke_msg_req'] = _REVOKE_MSG_REQ +DESCRIPTOR.message_types_by_name['revoke_msg_resp'] = _REVOKE_MSG_RESP +DESCRIPTOR.message_types_by_name['set_chatroom_announcement_req'] = _SET_CHATROOM_ANNOUNCEMENT_REQ +DESCRIPTOR.message_types_by_name['set_chatroom_announcement_resp'] = _SET_CHATROOM_ANNOUNCEMENT_RESP _sym_db.RegisterFileDescriptor(DESCRIPTOR) mmStr = _reflection.GeneratedProtocolMessageType('mmStr', (_message.Message,), dict( @@ -3650,6 +6132,13 @@ # @@protoc_insertion_point(class_scope:ManualAuthDeviceRequest._Tag2.__Tag2) )) , + + TAG3 = _reflection.GeneratedProtocolMessageType('TAG3', (_message.Message,), dict( + DESCRIPTOR = _MANUALAUTHDEVICEREQUEST__TAG2_TAG3, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:ManualAuthDeviceRequest._Tag2.TAG3) + )) + , DESCRIPTOR = _MANUALAUTHDEVICEREQUEST__TAG2, __module__ = 'mm_pb2' # @@protoc_insertion_point(class_scope:ManualAuthDeviceRequest._Tag2) @@ -3662,6 +6151,7 @@ _sym_db.RegisterMessage(ManualAuthDeviceRequest) _sym_db.RegisterMessage(ManualAuthDeviceRequest._Tag2) _sym_db.RegisterMessage(ManualAuthDeviceRequest._Tag2.__Tag2) +_sym_db.RegisterMessage(ManualAuthDeviceRequest._Tag2.TAG3) ManualAuthResponse = _reflection.GeneratedProtocolMessageType('ManualAuthResponse', (_message.Message,), dict( @@ -3713,6 +6203,48 @@ # @@protoc_insertion_point(class_scope:ManualAuthResponse.AccountInfo) )) , + + dns_info = _reflection.GeneratedProtocolMessageType('dns_info', (_message.Message,), dict( + + redirect_info = _reflection.GeneratedProtocolMessageType('redirect_info', (_message.Message,), dict( + + real_host_info = _reflection.GeneratedProtocolMessageType('real_host_info', (_message.Message,), dict( + DESCRIPTOR = _MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO_REAL_HOST_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:ManualAuthResponse.dns_info.redirect_info.real_host_info) + )) + , + DESCRIPTOR = _MANUALAUTHRESPONSE_DNS_INFO_REDIRECT_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:ManualAuthResponse.dns_info.redirect_info) + )) + , + + ip_info = _reflection.GeneratedProtocolMessageType('ip_info', (_message.Message,), dict( + + longlink_ip_info = _reflection.GeneratedProtocolMessageType('longlink_ip_info', (_message.Message,), dict( + DESCRIPTOR = _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_LONGLINK_IP_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:ManualAuthResponse.dns_info.ip_info.longlink_ip_info) + )) + , + + shortlink_ip_info = _reflection.GeneratedProtocolMessageType('shortlink_ip_info', (_message.Message,), dict( + DESCRIPTOR = _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO_SHORTLINK_IP_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:ManualAuthResponse.dns_info.ip_info.shortlink_ip_info) + )) + , + DESCRIPTOR = _MANUALAUTHRESPONSE_DNS_INFO_IP_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:ManualAuthResponse.dns_info.ip_info) + )) + , + DESCRIPTOR = _MANUALAUTHRESPONSE_DNS_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:ManualAuthResponse.dns_info) + )) + , DESCRIPTOR = _MANUALAUTHRESPONSE, __module__ = 'mm_pb2' # @@protoc_insertion_point(class_scope:ManualAuthResponse) @@ -3725,6 +6257,12 @@ _sym_db.RegisterMessage(ManualAuthResponse.AuthParam.Ecdh.EcdhKey) _sym_db.RegisterMessage(ManualAuthResponse.AuthParam.SessionKey) _sym_db.RegisterMessage(ManualAuthResponse.AccountInfo) +_sym_db.RegisterMessage(ManualAuthResponse.dns_info) +_sym_db.RegisterMessage(ManualAuthResponse.dns_info.redirect_info) +_sym_db.RegisterMessage(ManualAuthResponse.dns_info.redirect_info.real_host_info) +_sym_db.RegisterMessage(ManualAuthResponse.dns_info.ip_info) +_sym_db.RegisterMessage(ManualAuthResponse.dns_info.ip_info.longlink_ip_info) +_sym_db.RegisterMessage(ManualAuthResponse.dns_info.ip_info.shortlink_ip_info) NewInitRequest = _reflection.GeneratedProtocolMessageType('NewInitRequest', (_message.Message,), dict( DESCRIPTOR = _NEWINITREQUEST, @@ -3904,5 +6442,366 @@ _sym_db.RegisterMessage(open_wxhb_resp.TAG1) _sym_db.RegisterMessage(open_wxhb_resp.TAG1.TAG1) +qry_detail_wxhb_req = _reflection.GeneratedProtocolMessageType('qry_detail_wxhb_req', (_message.Message,), dict( + DESCRIPTOR = _QRY_DETAIL_WXHB_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:qry_detail_wxhb_req) + )) +_sym_db.RegisterMessage(qry_detail_wxhb_req) + +qry_detail_wxhb_resp = _reflection.GeneratedProtocolMessageType('qry_detail_wxhb_resp', (_message.Message,), dict( + + TAG1 = _reflection.GeneratedProtocolMessageType('TAG1', (_message.Message,), dict( + + TAG1 = _reflection.GeneratedProtocolMessageType('TAG1', (_message.Message,), dict( + DESCRIPTOR = _QRY_DETAIL_WXHB_RESP_TAG1_TAG1, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:qry_detail_wxhb_resp.TAG1.TAG1) + )) + , + DESCRIPTOR = _QRY_DETAIL_WXHB_RESP_TAG1, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:qry_detail_wxhb_resp.TAG1) + )) + , + DESCRIPTOR = _QRY_DETAIL_WXHB_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:qry_detail_wxhb_resp) + )) +_sym_db.RegisterMessage(qry_detail_wxhb_resp) +_sym_db.RegisterMessage(qry_detail_wxhb_resp.TAG1) +_sym_db.RegisterMessage(qry_detail_wxhb_resp.TAG1.TAG1) + +send_emoji_req = _reflection.GeneratedProtocolMessageType('send_emoji_req', (_message.Message,), dict( + + emoji_info = _reflection.GeneratedProtocolMessageType('emoji_info', (_message.Message,), dict( + + TAG4 = _reflection.GeneratedProtocolMessageType('TAG4', (_message.Message,), dict( + DESCRIPTOR = _SEND_EMOJI_REQ_EMOJI_INFO_TAG4, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:send_emoji_req.emoji_info.TAG4) + )) + , + DESCRIPTOR = _SEND_EMOJI_REQ_EMOJI_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:send_emoji_req.emoji_info) + )) + , + DESCRIPTOR = _SEND_EMOJI_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:send_emoji_req) + )) +_sym_db.RegisterMessage(send_emoji_req) +_sym_db.RegisterMessage(send_emoji_req.emoji_info) +_sym_db.RegisterMessage(send_emoji_req.emoji_info.TAG4) + +send_emoji_resp = _reflection.GeneratedProtocolMessageType('send_emoji_resp', (_message.Message,), dict( + + result = _reflection.GeneratedProtocolMessageType('result', (_message.Message,), dict( + DESCRIPTOR = _SEND_EMOJI_RESP_RESULT, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:send_emoji_resp.result) + )) + , + DESCRIPTOR = _SEND_EMOJI_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:send_emoji_resp) + )) +_sym_db.RegisterMessage(send_emoji_resp) +_sym_db.RegisterMessage(send_emoji_resp.result) + +transfer_operation_req = _reflection.GeneratedProtocolMessageType('transfer_operation_req', (_message.Message,), dict( + DESCRIPTOR = _TRANSFER_OPERATION_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:transfer_operation_req) + )) +_sym_db.RegisterMessage(transfer_operation_req) + +transfer_operation_resp = _reflection.GeneratedProtocolMessageType('transfer_operation_resp', (_message.Message,), dict( + DESCRIPTOR = _TRANSFER_OPERATION_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:transfer_operation_resp) + )) +_sym_db.RegisterMessage(transfer_operation_resp) + +transfer_query_req = _reflection.GeneratedProtocolMessageType('transfer_query_req', (_message.Message,), dict( + DESCRIPTOR = _TRANSFER_QUERY_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:transfer_query_req) + )) +_sym_db.RegisterMessage(transfer_query_req) + +transfer_query_resp = _reflection.GeneratedProtocolMessageType('transfer_query_resp', (_message.Message,), dict( + DESCRIPTOR = _TRANSFER_QUERY_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:transfer_query_resp) + )) +_sym_db.RegisterMessage(transfer_query_resp) + +get_contact_req = _reflection.GeneratedProtocolMessageType('get_contact_req', (_message.Message,), dict( + + TAG7 = _reflection.GeneratedProtocolMessageType('TAG7', (_message.Message,), dict( + DESCRIPTOR = _GET_CONTACT_REQ_TAG7, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:get_contact_req.TAG7) + )) + , + DESCRIPTOR = _GET_CONTACT_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:get_contact_req) + )) +_sym_db.RegisterMessage(get_contact_req) +_sym_db.RegisterMessage(get_contact_req.TAG7) + +get_contact_resp = _reflection.GeneratedProtocolMessageType('get_contact_resp', (_message.Message,), dict( + + ticket_info = _reflection.GeneratedProtocolMessageType('ticket_info', (_message.Message,), dict( + DESCRIPTOR = _GET_CONTACT_RESP_TICKET_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:get_contact_resp.ticket_info) + )) + , + DESCRIPTOR = _GET_CONTACT_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:get_contact_resp) + )) +_sym_db.RegisterMessage(get_contact_resp) +_sym_db.RegisterMessage(get_contact_resp.ticket_info) + +create_chatroom_req = _reflection.GeneratedProtocolMessageType('create_chatroom_req', (_message.Message,), dict( + + TAG2 = _reflection.GeneratedProtocolMessageType('TAG2', (_message.Message,), dict( + DESCRIPTOR = _CREATE_CHATROOM_REQ_TAG2, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_req.TAG2) + )) + , + + member_info = _reflection.GeneratedProtocolMessageType('member_info', (_message.Message,), dict( + DESCRIPTOR = _CREATE_CHATROOM_REQ_MEMBER_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_req.member_info) + )) + , + DESCRIPTOR = _CREATE_CHATROOM_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_req) + )) +_sym_db.RegisterMessage(create_chatroom_req) +_sym_db.RegisterMessage(create_chatroom_req.TAG2) +_sym_db.RegisterMessage(create_chatroom_req.member_info) + +create_chatroom_resp = _reflection.GeneratedProtocolMessageType('create_chatroom_resp', (_message.Message,), dict( + + result = _reflection.GeneratedProtocolMessageType('result', (_message.Message,), dict( + + err_msg = _reflection.GeneratedProtocolMessageType('err_msg', (_message.Message,), dict( + DESCRIPTOR = _CREATE_CHATROOM_RESP_RESULT_ERR_MSG, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_resp.result.err_msg) + )) + , + DESCRIPTOR = _CREATE_CHATROOM_RESP_RESULT, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_resp.result) + )) + , + + member_info = _reflection.GeneratedProtocolMessageType('member_info', (_message.Message,), dict( + + nick_name_info = _reflection.GeneratedProtocolMessageType('nick_name_info', (_message.Message,), dict( + DESCRIPTOR = _CREATE_CHATROOM_RESP_MEMBER_INFO_NICK_NAME_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_resp.member_info.nick_name_info) + )) + , + DESCRIPTOR = _CREATE_CHATROOM_RESP_MEMBER_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_resp.member_info) + )) + , + + chatroom_avatar = _reflection.GeneratedProtocolMessageType('chatroom_avatar', (_message.Message,), dict( + DESCRIPTOR = _CREATE_CHATROOM_RESP_CHATROOM_AVATAR, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_resp.chatroom_avatar) + )) + , + DESCRIPTOR = _CREATE_CHATROOM_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:create_chatroom_resp) + )) +_sym_db.RegisterMessage(create_chatroom_resp) +_sym_db.RegisterMessage(create_chatroom_resp.result) +_sym_db.RegisterMessage(create_chatroom_resp.result.err_msg) +_sym_db.RegisterMessage(create_chatroom_resp.member_info) +_sym_db.RegisterMessage(create_chatroom_resp.member_info.nick_name_info) +_sym_db.RegisterMessage(create_chatroom_resp.chatroom_avatar) + +mm_facing_create_chatroom_req = _reflection.GeneratedProtocolMessageType('mm_facing_create_chatroom_req', (_message.Message,), dict( + DESCRIPTOR = _MM_FACING_CREATE_CHATROOM_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:mm_facing_create_chatroom_req) + )) +_sym_db.RegisterMessage(mm_facing_create_chatroom_req) + +mm_facing_create_chatroom_resp = _reflection.GeneratedProtocolMessageType('mm_facing_create_chatroom_resp', (_message.Message,), dict( + + result = _reflection.GeneratedProtocolMessageType('result', (_message.Message,), dict( + + err_msg = _reflection.GeneratedProtocolMessageType('err_msg', (_message.Message,), dict( + DESCRIPTOR = _MM_FACING_CREATE_CHATROOM_RESP_RESULT_ERR_MSG, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:mm_facing_create_chatroom_resp.result.err_msg) + )) + , + DESCRIPTOR = _MM_FACING_CREATE_CHATROOM_RESP_RESULT, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:mm_facing_create_chatroom_resp.result) + )) + , + + member_info = _reflection.GeneratedProtocolMessageType('member_info', (_message.Message,), dict( + DESCRIPTOR = _MM_FACING_CREATE_CHATROOM_RESP_MEMBER_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:mm_facing_create_chatroom_resp.member_info) + )) + , + DESCRIPTOR = _MM_FACING_CREATE_CHATROOM_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:mm_facing_create_chatroom_resp) + )) +_sym_db.RegisterMessage(mm_facing_create_chatroom_resp) +_sym_db.RegisterMessage(mm_facing_create_chatroom_resp.result) +_sym_db.RegisterMessage(mm_facing_create_chatroom_resp.result.err_msg) +_sym_db.RegisterMessage(mm_facing_create_chatroom_resp.member_info) + +add_chatroom_member_req = _reflection.GeneratedProtocolMessageType('add_chatroom_member_req', (_message.Message,), dict( + + member_info = _reflection.GeneratedProtocolMessageType('member_info', (_message.Message,), dict( + DESCRIPTOR = _ADD_CHATROOM_MEMBER_REQ_MEMBER_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:add_chatroom_member_req.member_info) + )) + , + + chatroom_info = _reflection.GeneratedProtocolMessageType('chatroom_info', (_message.Message,), dict( + DESCRIPTOR = _ADD_CHATROOM_MEMBER_REQ_CHATROOM_INFO, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:add_chatroom_member_req.chatroom_info) + )) + , + DESCRIPTOR = _ADD_CHATROOM_MEMBER_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:add_chatroom_member_req) + )) +_sym_db.RegisterMessage(add_chatroom_member_req) +_sym_db.RegisterMessage(add_chatroom_member_req.member_info) +_sym_db.RegisterMessage(add_chatroom_member_req.chatroom_info) + +add_chatroom_member_resp = _reflection.GeneratedProtocolMessageType('add_chatroom_member_resp', (_message.Message,), dict( + + result = _reflection.GeneratedProtocolMessageType('result', (_message.Message,), dict( + + err_msg = _reflection.GeneratedProtocolMessageType('err_msg', (_message.Message,), dict( + DESCRIPTOR = _ADD_CHATROOM_MEMBER_RESP_RESULT_ERR_MSG, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:add_chatroom_member_resp.result.err_msg) + )) + , + DESCRIPTOR = _ADD_CHATROOM_MEMBER_RESP_RESULT, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:add_chatroom_member_resp.result) + )) + , + DESCRIPTOR = _ADD_CHATROOM_MEMBER_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:add_chatroom_member_resp) + )) +_sym_db.RegisterMessage(add_chatroom_member_resp) +_sym_db.RegisterMessage(add_chatroom_member_resp.result) +_sym_db.RegisterMessage(add_chatroom_member_resp.result.err_msg) + +op_set_group_nick_name = _reflection.GeneratedProtocolMessageType('op_set_group_nick_name', (_message.Message,), dict( + DESCRIPTOR = _OP_SET_GROUP_NICK_NAME, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:op_set_group_nick_name) + )) +_sym_db.RegisterMessage(op_set_group_nick_name) + +oplog_req = _reflection.GeneratedProtocolMessageType('oplog_req', (_message.Message,), dict( + + TAG1 = _reflection.GeneratedProtocolMessageType('TAG1', (_message.Message,), dict( + + CMD = _reflection.GeneratedProtocolMessageType('CMD', (_message.Message,), dict( + + OPTION = _reflection.GeneratedProtocolMessageType('OPTION', (_message.Message,), dict( + DESCRIPTOR = _OPLOG_REQ_TAG1_CMD_OPTION, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:oplog_req.TAG1.CMD.OPTION) + )) + , + DESCRIPTOR = _OPLOG_REQ_TAG1_CMD, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:oplog_req.TAG1.CMD) + )) + , + DESCRIPTOR = _OPLOG_REQ_TAG1, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:oplog_req.TAG1) + )) + , + DESCRIPTOR = _OPLOG_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:oplog_req) + )) +_sym_db.RegisterMessage(oplog_req) +_sym_db.RegisterMessage(oplog_req.TAG1) +_sym_db.RegisterMessage(oplog_req.TAG1.CMD) +_sym_db.RegisterMessage(oplog_req.TAG1.CMD.OPTION) + +oplog_resp = _reflection.GeneratedProtocolMessageType('oplog_resp', (_message.Message,), dict( + + result = _reflection.GeneratedProtocolMessageType('result', (_message.Message,), dict( + DESCRIPTOR = _OPLOG_RESP_RESULT, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:oplog_resp.result) + )) + , + DESCRIPTOR = _OPLOG_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:oplog_resp) + )) +_sym_db.RegisterMessage(oplog_resp) +_sym_db.RegisterMessage(oplog_resp.result) + +revoke_msg_req = _reflection.GeneratedProtocolMessageType('revoke_msg_req', (_message.Message,), dict( + DESCRIPTOR = _REVOKE_MSG_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:revoke_msg_req) + )) +_sym_db.RegisterMessage(revoke_msg_req) + +revoke_msg_resp = _reflection.GeneratedProtocolMessageType('revoke_msg_resp', (_message.Message,), dict( + DESCRIPTOR = _REVOKE_MSG_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:revoke_msg_resp) + )) +_sym_db.RegisterMessage(revoke_msg_resp) + +set_chatroom_announcement_req = _reflection.GeneratedProtocolMessageType('set_chatroom_announcement_req', (_message.Message,), dict( + DESCRIPTOR = _SET_CHATROOM_ANNOUNCEMENT_REQ, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:set_chatroom_announcement_req) + )) +_sym_db.RegisterMessage(set_chatroom_announcement_req) + +set_chatroom_announcement_resp = _reflection.GeneratedProtocolMessageType('set_chatroom_announcement_resp', (_message.Message,), dict( + DESCRIPTOR = _SET_CHATROOM_ANNOUNCEMENT_RESP, + __module__ = 'mm_pb2' + # @@protoc_insertion_point(class_scope:set_chatroom_announcement_resp) + )) +_sym_db.RegisterMessage(set_chatroom_announcement_resp) + # @@protoc_insertion_point(module_scope) diff --git a/microchat/plugin/check_friend.py b/microchat/plugin/check_friend.py new file mode 100644 index 0000000..a428b9b --- /dev/null +++ b/microchat/plugin/check_friend.py @@ -0,0 +1,72 @@ +import threading +from .. import interface +from .. import mm_pb2 +from .. import Util +from . import plugin +from .logger_wrapper import logger + +# 单向好友列表 +check_friend_list = {} + +# 测试群 +test_chatroom_wxid = '' + +# 打印检测结果 +def show(): + if check_friend_list: + logger.info('[单向好友检测结果]扎心了,老铁!', 13) + for i in check_friend_list: + logger.info('wxid:{} 昵称:{} 类型:{}'.format(i, check_friend_list[i][0], check_friend_list[i][1]), 11) + else: + logger.info('[单向好友检测结果]恭喜,暂未检测到单向好友!', 11) + return + +# 单向好友检测(扎心,慎用!!!) +# 删除我后对方开启好友验证或拉黑我,拉人入群对方无任何消息通知 +# 删除我后对方关闭好友验证(双方仍可互发消息),拉人入群会向对方发送群聊邀请! +# TODO:寻找其他静默检测单向好友方法 +def check(chatroom_wxid = '', test_add_chatroom_member = False): + global check_friend_list, test_chatroom_wxid + check_friend_list = {} + # 设置测试群(不设置默认新建面对面群测试) + if chatroom_wxid: + test_chatroom_wxid = chatroom_wxid + # 获取好友列表 + friend_list = interface.get_contact_list() + for friend in friend_list: + # 获取好友信息,返回ticket表示被对方拉黑或删除 + __, ticket = interface.get_contact(friend[0]) + if ticket.ticket: + logger.info('wxid:{} v2数据:{}'.format(ticket.wxid, ticket.ticket)) + # 把加入单向好友列表 + if friend[0] not in check_friend_list.keys(): + # 备注名存在使用备注名;否则使用好友昵称 + check_friend_list[friend[0]] = [friend[2], '删好友'] if friend[2] else [friend[1], '删好友'] + if test_add_chatroom_member: + if not test_chatroom_wxid: + # 面对面建群 + test_chatroom_wxid = interface.mm_facing_create_chatroom() + if test_chatroom_wxid: + # 拉单向好友入群(慎用) + interface.add_chatroom_member(test_chatroom_wxid, [friend[0]]) + pass + # 3秒后打印检测结果 + threading.Timer(3, show).start() + return + +# 单向好友类型判断(拉黑或删好友) +def check_type(msg): + global check_friend_list + try: + # 过滤拉好友入群失败消息 + if test_chatroom_wxid == msg.from_id.id and 10000 == msg.type and Util.wxid == msg.to_id.id: + if msg.raw.content.endswith('拒绝加入群聊'): + # 取昵称 + nick_name = msg.raw.content[:msg.raw.content.rfind('拒绝加入群聊')] + for i in check_friend_list: + if nick_name == check_friend_list[i][0]: + check_friend_list[i][1] = '拉黑' + break + except: + pass + return \ No newline at end of file diff --git a/microchat/plugin/get_win_browser.py b/microchat/plugin/get_win_browser.py new file mode 100644 index 0000000..88bfd58 --- /dev/null +++ b/microchat/plugin/get_win_browser.py @@ -0,0 +1,16 @@ +import winreg + +BROWSER_PATH = { + '360jisu': 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\\360chrome.exe', + 'chrome': 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe', +} + +def get_browser_path(): + paths_dict = {} + for name in BROWSER_PATH: + handler = winreg.OpenKey( + winreg.HKEY_LOCAL_MACHINE, BROWSER_PATH[name], access=winreg.KEY_READ) + abs_path = winreg.QueryValue(handler, None) + # print(abs_path) + paths_dict[name] = abs_path + return paths_dict diff --git a/microchat/plugin/handle_appmsg.py b/microchat/plugin/handle_appmsg.py index ce5e2b3..689a73a 100644 --- a/microchat/plugin/handle_appmsg.py +++ b/microchat/plugin/handle_appmsg.py @@ -13,13 +13,18 @@ def appmsg_handler(msg): # 读取消息类型 try: soup = BeautifulSoup(msg.raw.content,'html.parser') - msg_type = soup.appmsg.type.contents[0] # 红包: + msg_type = soup.appmsg.type.contents[0] # 红包: 转账: 2000 except: - pass + pass if '2001' == msg_type: # 红包消息 if plugin.TEST_STATE[4]: # 自动抢红包功能开关 auto_recive_hb(msg) # 自动抢红包 + qry_detail_wxhb(msg) # 获取红包领取信息 + elif '2000' == msg_type: # 转账信息 + if plugin.TEST_STATE[4]: # 自动收款功能开关 + auto_confirm_transfer(msg) # 自动确认收款 + transfer_query(msg) # 查看转账记录 return @@ -36,8 +41,69 @@ def auto_recive_hb(msg): # 领红包 (ret_code,info) = interface.receive_and_open_wxhb(channelId,msgType,nativeUrl,sendId) if not ret_code: - logger.info('自动抢红包成功!') + logger.info('自动抢红包成功!', 11) logger.debug('红包详细信息:' + info) + else: + logger.info('红包详细信息:' + info, 13) except: - logger.info('自动抢红包失败!') + logger.info('自动抢红包失败!', 13) + return + +# 查看红包信息 +def qry_detail_wxhb(msg): + try: + # 解析nativeUrl,获取sendId + soup = BeautifulSoup(msg.raw.content,'html.parser') + nativeUrl = soup.msg.appmsg.wcpayinfo.nativeurl.contents[0] + sendId = Util.find_str(nativeUrl, '&sendid=', '&') + + # 查看红包领取情况 + (ret_code,info) = interface.qry_detail_wxhb(nativeUrl, sendId) + logger.info('查询红包详细信息:\n错误码:{}\n领取信息:{}'.format(ret_code, info), 13) + except: + logger.info('查看红包详细信息失败!', 13) + return + +# 自动确认收款 +def auto_confirm_transfer(msg): + # 过滤自己发出去的收款信息(收款成功通知) + if msg.from_id.id == Util.wxid: + return + + try: + # 解析transcationid,transferid,invalidtime + soup = BeautifulSoup(msg.raw.content,'html.parser') + transaction_id = soup.msg.appmsg.wcpayinfo.transcationid.contents[0] + trans_id = soup.msg.appmsg.wcpayinfo.transferid.contents[0] + invalid_time = soup.msg.appmsg.wcpayinfo.invalidtime.contents[0] + + # 确认收款 + (ret_code,info) = interface.transfer_operation(invalid_time, trans_id, transaction_id, msg.from_id.id) + if not ret_code: + logger.info('收款成功!', 11) + logger.debug('转账详细信息:' + info) + else: + logger.info('转账详细信息:' + info, 13) + except: + logger.info('自动收款失败!', 13) + return + +# 查询转账记录 +def transfer_query(msg): + # 过滤自己发出去的收款信息(收款成功通知) + if msg.from_id.id == Util.wxid: + return + + try: + # 解析transcationid,transferid,invalidtime + soup = BeautifulSoup(msg.raw.content,'html.parser') + trans_id = soup.msg.appmsg.wcpayinfo.transcationid.contents[0] + transfer_id = soup.msg.appmsg.wcpayinfo.transferid.contents[0] + invalid_time = soup.msg.appmsg.wcpayinfo.invalidtime.contents[0] + + # 查询转账记录 + (ret_code,info) = interface.transfer_query(invalid_time, trans_id, transfer_id) + logger.info('[查询转账记录]:\n错误码:{}\n转账信息:{}'.format(ret_code, info), 13) + except: + logger.info('查询转账记录失败!', 13) return \ No newline at end of file diff --git a/microchat/plugin/logger_wrapper.py b/microchat/plugin/logger_wrapper.py index ff4b179..ed11d7c 100644 --- a/microchat/plugin/logger_wrapper.py +++ b/microchat/plugin/logger_wrapper.py @@ -13,6 +13,7 @@ STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -12 + class ColorDefine(enum.IntEnum): # 字体颜色定义 ,关键在于颜色编码,由2位十六进制组成,分别取0~f,前一位指的是背景色,后一位指的是字体色 @@ -95,7 +96,6 @@ def __init__(self): self.out = 0 if os.path.exists(os.getcwd() + '/log') is False: os.mkdir(os.getcwd() + '/log') - # self.config("microchat", out=2) def config(self, appName, logFileName=None, level=logging.INFO, out=2, fore_color = ColorDefine.FOREGROUND_GREEN): """ @@ -113,11 +113,12 @@ def config(self, appName, logFileName=None, level=logging.INFO, out=2, fore_colo self.log_level = level self.out = out self.fore_color = fore_color - self.logger = self.getLogger() + self.logger_file, self.logger_console = self.getLogger() def getLogger(self): # 获取logging实例 - logger = logging.getLogger(self.appName) + logger_file = logging.getLogger(self.appName) + logger_console = logging.getLogger('streamer') # 指定输出的格式 formatter = logging.Formatter( '%(name)s %(asctime)s %(levelname)8s: %(message)s') @@ -131,94 +132,150 @@ def getLogger(self): console_handler.setFormatter(formatter) # # 指定日志的最低输出级别 - logger.setLevel(self.log_level) # 20 - + logger_file.setLevel(self.log_level) # 20 INFO + logger_console.setLevel(self.log_level) # 20 # 为logger添加具体的日志处理器输出端 if self.out == 1: - logger.addHandler(file_handler) + logger_file.addHandler(file_handler) elif self.out == 0: - logger.addHandler(console_handler) + logger_console.addHandler(console_handler) else: - logger.addHandler(file_handler) - #logger.addHandler(console_handler) + logger_file.addHandler(file_handler) + logger_console.addHandler(console_handler) + + logger_file.propagate = False + logger_console.propagate = False - return logger + return logger_file, logger_console def setLevel(self, level): - self.log_level = self.logger.setLevel(level) + if self.out == 1: + self.log_level = self.logger_file.setLevel(level) + elif self.out == 0: + self.log_level = self.logger_console.setLevel(level) + else: + self.log_level = self.logger_file.setLevel(level) + self.log_level = self.logger_console.setLevel(level) def debug(self, msg, color=None, *args, **kwargs): + try: + msg1 = msg.encode('gbk', 'ignore').decode('gbk', 'ignore') + except: + msg1 = '' + + if color is None: + set_cmd_text_color(ColorDefine.FOREGROUND_WHITE) + else: + set_cmd_text_color(color) + if self.out == 1: - self.logger.debug(msg, *args, **kwargs) + self.logger_file.debug(msg, *args, **kwargs) + elif self.out == 0: + self.logger_console.debug(msg1, *args, **kwargs) else: - if color is None: - set_cmd_text_color(ColorDefine.FOREGROUND_WHITE) - else: - set_cmd_text_color(color) - self.logger.debug(msg, *args, **kwargs) - # reset_color() - set_cmd_text_color(self.fore_color) + self.logger_file.debug(msg, *args, **kwargs) + self.logger_console.debug(msg1, *args, **kwargs) + set_cmd_text_color(self.fore_color) def info(self, msg, color=None, *args, **kwargs): + try: + msg1 = msg.encode('gbk', 'ignore').decode('gbk', 'ignore') + except: + msg1 = '' + + if color is None: + set_cmd_text_color(self.fore_color) + else: + set_cmd_text_color(color) + if self.out == 1: - self.logger.info(msg, *args, **kwargs) + self.logger_file.info(msg, *args, **kwargs) + elif self.out == 0: + self.logger_console.info(msg1, *args, **kwargs) else: - if color is None: - self.logger.info(msg, *args, **kwargs) - else: - set_cmd_text_color(color) - self.logger.info(msg, *args, **kwargs) - # reset_color() - set_cmd_text_color(self.fore_color) + self.logger_file.info(msg, *args, **kwargs) + self.logger_console.info(msg1, *args, **kwargs) + set_cmd_text_color(self.fore_color) def warning(self, msg, color=None, *args, **kwargs): + try: + msg1 = msg.encode('gbk', 'ignore').decode('gbk', 'ignore') + except: + msg1 = '' + + if color is None: + set_cmd_text_color(ColorDefine.FOREGROUND_YELLOW) + else: + set_cmd_text_color(color) + if self.out == 1: - self.logger.warning(msg, *args, **kwargs) + self.logger_file.warning(msg, *args, **kwargs) + elif self.out == 0: + self.logger_console.warning(msg1, *args, **kwargs) else: - if color is None: - set_cmd_text_color(ColorDefine.FOREGROUND_YELLOW) - else: - set_cmd_text_color(color) - self.logger.warning(msg, *args, **kwargs) - # reset_color() - set_cmd_text_color(self.fore_color) + self.logger_file.warning(msg, *args, **kwargs) + self.logger_console.warning(msg1, *args, **kwargs) + set_cmd_text_color(self.fore_color) def warn(self, msg, color=None, *args, **kwargs): + try: + msg1 = msg.encode('gbk', 'ignore').decode('gbk', 'ignore') + except: + msg1 = '' + + if color is None: + set_cmd_text_color(ColorDefine.FOREGROUND_DARKYELLOW) + else: + set_cmd_text_color(color) + if self.out == 1: - self.logger.warn(msg, *args, **kwargs) + self.logger_file.warn(msg, *args, **kwargs) + elif self.out == 0: + self.logger_console.warn(msg1, *args, **kwargs) else: - if color is None: - set_cmd_text_color(ColorDefine.FOREGROUND_DARKYELLOW) - else: - set_cmd_text_color(color) - self.logger.warn(msg, *args, **kwargs) - # reset_color() - set_cmd_text_color(self.fore_color) + self.logger_file.warn(msg, *args, **kwargs) + self.logger_console.warn(msg1, *args, **kwargs) + set_cmd_text_color(self.fore_color) def error(self, msg, color=None, *args, **kwargs): + try: + msg1 = msg.encode('gbk', 'ignore').decode('gbk', 'ignore') + except: + msg1 = '' + + if color is None: + set_cmd_text_color(ColorDefine.FOREGROUND_RED) + else: + set_cmd_text_color(color) + if self.out == 1: - self.logger.error(msg, *args, **kwargs) + self.logger_file.error(msg, *args, **kwargs) + elif self.out == 0: + self.logger_console.error(msg1, *args, **kwargs) else: - if color is None: - set_cmd_text_color(ColorDefine.FOREGROUND_RED) - else: - set_cmd_text_color(color) - self.logger.error(msg, *args, **kwargs) - # reset_color() - set_cmd_text_color(self.fore_color) + self.logger_file.error(msg, *args, **kwargs) + self.logger_console.error(msg1, *args, **kwargs) + set_cmd_text_color(self.fore_color) def critical(self, msg, color=None, *args, **kwargs): - if self.out == 1: - self.logger.error(msg, *args, **kwargs) + try: + msg1 = msg.encode('gbk', 'ignore').decode('gbk', 'ignore') + except: + msg1 = '' + + if color is None: + set_cmd_text_color(ColorDefine.FOREGROUND_DARKPINK) else: - if color is None: - set_cmd_text_color(ColorDefine.FOREGROUND_DARKPINK) - else: - set_cmd_text_color(color) - self.logger.critical(msg, *args, **kwargs) - # reset_color() - set_cmd_text_color(self.fore_color) + set_cmd_text_color(color) + if self.out == 1: + self.logger_file.critical(msg, *args, **kwargs) + elif self.out == 0: + self.logger_console.critical(msg1, *args, **kwargs) + else: + self.logger_file.critical(msg, *args, **kwargs) + self.logger_console.critical(msg1, *args, **kwargs) + set_cmd_text_color(self.fore_color) # 定义一个logger logger = LoggerWrapper() diff --git a/microchat/plugin/plugin.py b/microchat/plugin/plugin.py index 8664cc9..8ffe056 100644 --- a/microchat/plugin/plugin.py +++ b/microchat/plugin/plugin.py @@ -1,4 +1,6 @@ import json +import random +import time from .. import define from .. import interface from .. import mm_pb2 @@ -6,13 +8,15 @@ from . import verify_friend from . import handle_appmsg from . import tuling_robot +from . import check_friend +from . import revoke_joke from .logger_wrapper import logger # 测试命令 state = lambda i: '已开启' if i else '已关闭' -TEST_KEY_WORD = ('测试分享链接', '测试好友列表','图灵机器人','自动通过好友申请','自动抢红包') +TEST_KEY_WORD = ('测试分享链接', '测试好友列表', '图灵机器人', '自动通过好友申请', '自动抢红包/自动收款', '测试扔骰子', '测试面对面建群', '检测单向好友', '测试消息撤回', '测试拉黑', '测试发布群公告') # 测试开关 -TEST_STATE = [1,1,1,1,1] +TEST_STATE = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] # 插件黑名单(不处理该wxid的消息) plugin_blacklist = ['weixin', ] @@ -31,8 +35,8 @@ def test(msg): interface.send_app_msg(msg.from_id.id, '贪玩蓝月', '大渣好,我系咕天乐,我是渣渣辉,贪挽懒月,介系一个你没有挽过的船新版本', 'http://www.gov.cn/','https://ss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/tam-ogel/f1d67c57e00fea1dc0f90210d7add1ad_121_121.jpg') return False elif TEST_KEY_WORD[1] == msg.raw.content or '1' == msg.raw.content: # 测试获取好友列表 - interface.new_send_msg(msg.from_id.id, Util.str2bytes('我有好友{}人,加入群聊{}个,已关注公众号{}个,黑名单中好友{}位,已删除好友{}名'.format(len(interface.get_contact_list(Util.CONTACT_TYPE_FRIEND)), len(interface.get_contact_list( - Util.CONTACT_TYPE_CHATROOM)), len(interface.get_contact_list(Util.CONTACT_TYPE_OFFICAL)), len(interface.get_contact_list(Util.CONTACT_TYPE_BLACKLIST)), len(interface.get_contact_list(Util.CONTACT_TYPE_DELETED))))) + interface.new_send_msg(msg.from_id.id, Util.str2bytes('我有好友{}人,加入群聊{}个,已关注公众号{}个,黑名单中好友{}位'.format(len(interface.get_contact_list(Util.CONTACT_TYPE_FRIEND)), len(interface.get_contact_list( + Util.CONTACT_TYPE_CHATROOM)), len(interface.get_contact_list(Util.CONTACT_TYPE_OFFICAL)), len(interface.get_contact_list(Util.CONTACT_TYPE_BLACKLIST))))) return False elif TEST_KEY_WORD[2] == msg.raw.content or '2' == msg.raw.content: # 图灵机器人开关 TEST_STATE[2] = not TEST_STATE[2] @@ -42,10 +46,49 @@ def test(msg): TEST_STATE[3] = not TEST_STATE[3] interface.new_send_msg(msg.from_id.id, '{}({})'.format(TEST_KEY_WORD[3],state(TEST_STATE[3])).encode(encoding="utf-8")) return False - elif TEST_KEY_WORD[4] == msg.raw.content or '4' == msg.raw.content: # 自动抢红包开关 + elif TEST_KEY_WORD[4] == msg.raw.content or '4' == msg.raw.content: # 自动抢红包/自动收款开关 TEST_STATE[4] = not TEST_STATE[4] interface.new_send_msg(msg.from_id.id, '{}({})'.format(TEST_KEY_WORD[4],state(TEST_STATE[4])).encode(encoding="utf-8")) - return False + return False + elif TEST_KEY_WORD[5] == msg.raw.content or '5' == msg.raw.content: # 测试发送骰子表情 + interface.new_send_msg(msg.from_id.id, '送你一波666'.encode(encoding="utf-8")) + interface.send_emoji(msg.from_id.id,'68f9864ca5c0a5d823ed7184e113a4aa','1','9') + interface.send_emoji(msg.from_id.id,'514914788fc461e7205bf0b6ba496c49','2','9') + interface.send_emoji(msg.from_id.id,'9a21c57defc4974ab5b7c842e3232671','1','9') + return False + elif TEST_KEY_WORD[6] == msg.raw.content or '6' == msg.raw.content: # 测试面对面建群 + wxid = interface.mm_facing_create_chatroom('{}'.format(random.randint(2222, 9999))) + if wxid: + interface.add_chatroom_member(wxid, [msg.from_id.id, ]) + # 刚建的面对面群立即拉人对方无法收到通知(延迟2秒后再拉人对方才会收到进群通知),这里发消息到群聊at所有人测试对方是否入群 + interface.at_all_in_group(wxid, '你们已经在我的群聊里了') + return False + elif TEST_KEY_WORD[7] == msg.raw.content or '7' == msg.raw.content: # 检测单向好友 + if TEST_STATE[7]: + interface.new_send_msg(msg.from_id.id, '开始检测单向好友......'.encode(encoding="utf-8")) + check_friend.check() + return False + elif TEST_KEY_WORD[8] == msg.raw.content or '8' == msg.raw.content: # 测试消息撤回 + revoke_joke.revoke_joke(msg.from_id.id, '对方', '并亲了你一口') + return False + elif TEST_KEY_WORD[9] == msg.raw.content or '9' == msg.raw.content: # 测试黑名单 + interface.ban_friend(msg.from_id.id, True) + interface.new_send_msg(msg.from_id.id, '你被我拉黑了,5秒后恢复好友关系'.encode()) + time.sleep(5) + interface.ban_friend(msg.from_id.id, False) + interface.new_send_msg(msg.from_id.id, '已从黑名单中移除'.encode()) + return False + elif TEST_KEY_WORD[10] == msg.raw.content or '10' == msg.raw.content: # 测试群公告 + # 面对面建群 + wxid = interface.mm_facing_create_chatroom() + if wxid: + # 拉人入群 + interface.add_chatroom_member(wxid, [msg.from_id.id]) + # 设置群公告 + interface.set_chatroom_announcement(wxid, '天王盖地虎') + # 设置群聊名 + interface.set_friend_name(wxid, '宝塔镇河妖') + return False return True # 处理消息 @@ -69,6 +112,11 @@ def dispatch(msg): # appmsg elif 49 == msg.type: handle_appmsg.appmsg_handler(msg) + # 系统消息 + elif 10000 == msg.type: + if TEST_STATE[7]: + # 单向好友检测 + check_friend.check_type(msg) else: pass return diff --git a/microchat/plugin/revoke_joke.py b/microchat/plugin/revoke_joke.py new file mode 100644 index 0000000..e25676f --- /dev/null +++ b/microchat/plugin/revoke_joke.py @@ -0,0 +1,32 @@ +from .. import define +from .. import interface +from .. import mm_pb2 +from .. import Util +from . import plugin + + +# 群聊中: XXX撤回了一条消息,并XXX +def revoke_joke(wxid, nick_name, text): + # 面对面建群 + chatroom_wxid = interface.mm_facing_create_chatroom() + + if chatroom_wxid: + # 把对方拉进群 + interface.add_chatroom_member(chatroom_wxid, [wxid, ]) + + # 拼接群昵称字串 + real_nick_name = b'\xef\xbb\xa9' + text.encode() + b'\xef\xbb\xa9' + nick_name.encode() + + # 设置群昵称 + interface.set_group_nick_name(chatroom_wxid, real_nick_name) + + # 发送任意消息 + ret_code, svrid = interface.new_send_msg(chatroom_wxid, ' '.encode()) + + # 撤回刚刚发送的消息 + interface.revoke_msg(chatroom_wxid, svrid) + + # 恢复群昵称 + interface.set_group_nick_name(chatroom_wxid, b'') + + return \ No newline at end of file diff --git a/microchat/plugin/tuling_robot.py b/microchat/plugin/tuling_robot.py index 0f05831..63a367e 100644 --- a/microchat/plugin/tuling_robot.py +++ b/microchat/plugin/tuling_robot.py @@ -3,6 +3,7 @@ from .. import interface from .. import mm_pb2 from .. import Util +from bs4 import BeautifulSoup from .logger_wrapper import logger # 图灵机器人接口 @@ -13,39 +14,69 @@ # 图灵机器人 def tuling_robot(msg): + # 本条消息是否回复 + need_reply = False # 消息内容预处理 send_to_tuling_content = msg.raw.content - # 群聊消息:过滤掉sender_wxid - if msg.from_id.id.endswith('@chatroom'): - if msg.raw.content.find('\n') > -1: # 群聊消息以'sender_wxid:\n'起始 - send_to_tuling_content = msg.raw.content[msg.raw.content.find('\n') + 1:] + reply_prefix = '' + reply_at_wxid = '' + # 群聊消息:只回复@自己的消息/消息内容过滤掉sender_wxid + if msg.from_id.id.endswith('@chatroom'): + # 首先判断本条群聊消息是否at我: + try: + soup = BeautifulSoup(msg.ex_info,'html.parser') + at_user_list = soup.msgsource.atuserlist.contents[0].split(',') + if Util.wxid in at_user_list: # 群聊中有@我的消息 + # 群聊消息以'sender_wxid:\n'起始 + send_to_tuling_content = msg.raw.content[msg.raw.content.find('\n') + 1:] + # 解析@我的人的昵称 + reply_nick_name = Util.find_str(msg.xmlContent, '