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, '