Merge pull request #18 from sbilly/master

新增自动更新群信息等功能
This commit is contained in:
Urinx
2016-02-23 15:02:46 +08:00
+92 -13
View File
@@ -79,8 +79,11 @@ class WebWeixin(object):
self.SyncKey = [] self.SyncKey = []
self.User = [] self.User = []
self.MemberList = [] self.MemberList = []
self.ContactList = [] self.ContactList = [] # 好友
self.GroupList = [] self.GroupList = [] # 群
self.GroupMemeberList = [] # 群友
self.PublicUsersList = [] # 公众号/服务号
self.SpecialUsersList = [] # 特殊账号
self.autoReplyMode = False self.autoReplyMode = False
self.syncHost = '' self.syncHost = ''
self.user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36' self.user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36'
@@ -90,6 +93,8 @@ class WebWeixin(object):
self.saveSubFolders = {'webwxgeticon': 'icons', 'webwxgetheadimg': 'headimgs', 'webwxgetmsgimg': 'msgimgs', 'webwxgetvideo': 'videos', 'webwxgetvoice': 'voices', '_showQRCodeImg': 'qrcodes'} self.saveSubFolders = {'webwxgeticon': 'icons', 'webwxgetheadimg': 'headimgs', 'webwxgetmsgimg': 'msgimgs', 'webwxgetvideo': 'videos', 'webwxgetvoice': 'voices', '_showQRCodeImg': 'qrcodes'}
self.appid = 'wx782c26e4c19acffb' self.appid = 'wx782c26e4c19acffb'
self.lang = 'zh_CN' self.lang = 'zh_CN'
self.lastCheckTs = time.time()
self.memberCount = 0
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
@@ -210,21 +215,28 @@ class WebWeixin(object):
return dic['BaseResponse']['Ret'] == 0 return dic['BaseResponse']['Ret'] == 0
def webwxgetcontact(self): def webwxgetcontact(self):
SpecialUsers = ['newsapp', 'fmessage', 'filehelper', 'weibo', 'qqmail', 'fmessage', 'tmessage', 'qmessage', 'qqsync', 'floatbottle', 'lbsapp', 'shakeapp', 'medianote', 'qqfriend', 'readerapp', 'blogapp', 'facebookapp', 'masssendapp', 'meishiapp', 'feedsapp', 'voip', 'blogappweixin', 'weixin', 'brandsessionholder', 'weixinreminder', 'wxid_novlwrv3lqwv11', 'gh_22b87fa7cb3c', 'officialaccounts', 'notification_messages', 'wxid_novlwrv3lqwv11', 'gh_22b87fa7cb3c', 'wxitil', 'userexperience_alarm', 'notification_messages']
url = self.base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (self.pass_ticket, self.skey, int(time.time())) url = self.base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (self.pass_ticket, self.skey, int(time.time()))
dic = self._post(url, {}) dic = self._post(url, {})
self.MemberList = dic['MemberList']
self.MemberCount = dic['MemberCount']
self.MemberList = dic['MemberList']
ContactList = self.MemberList[:] ContactList = self.MemberList[:]
SpecialUsers = ['newsapp', 'fmessage', 'filehelper', 'weibo', 'qqmail', 'fmessage', 'tmessage', 'qmessage', 'qqsync', 'floatbottle', 'lbsapp', 'shakeapp', 'medianote', 'qqfriend', 'readerapp', 'blogapp', 'facebookapp', 'masssendapp', 'meishiapp', 'feedsapp', 'voip', 'blogappweixin', 'weixin', 'brandsessionholder', 'weixinreminder', 'wxid_novlwrv3lqwv11', 'gh_22b87fa7cb3c', 'officialaccounts', 'notification_messages', 'wxid_novlwrv3lqwv11', 'gh_22b87fa7cb3c', 'wxitil', 'userexperience_alarm', 'notification_messages'] GroupList = self.GroupList[:]
PublicUsersList = self.PublicUsersList[:]
SpecialUsersList = self.SpecialUsersList[:]
for i in xrange(len(ContactList) - 1, -1, -1): for i in xrange(len(ContactList) - 1, -1, -1):
Contact = ContactList[i] Contact = ContactList[i]
if Contact['VerifyFlag'] & 8 != 0: # 公众号/服务号 if Contact['VerifyFlag'] & 8 != 0: # 公众号/服务号
ContactList.remove(Contact) ContactList.remove(Contact)
self.PublicUsersList.append(Contact)
elif Contact['UserName'] in SpecialUsers: # 特殊账号 elif Contact['UserName'] in SpecialUsers: # 特殊账号
ContactList.remove(Contact) ContactList.remove(Contact)
self.SpecialUsersList.append(Contact)
elif Contact['UserName'].find('@@') != -1: # 群聊 elif Contact['UserName'].find('@@') != -1: # 群聊
self.GroupList.append(Contact)
ContactList.remove(Contact) ContactList.remove(Contact)
self.GroupList.append(Contact)
elif Contact['UserName'] == self.User['UserName']: # 自己 elif Contact['UserName'] == self.User['UserName']: # 自己
ContactList.remove(Contact) ContactList.remove(Contact)
self.ContactList = ContactList self.ContactList = ContactList
@@ -239,9 +251,31 @@ class WebWeixin(object):
"List": [ {"UserName": g['UserName'], "EncryChatRoomId":""} for g in self.GroupList ] "List": [ {"UserName": g['UserName'], "EncryChatRoomId":""} for g in self.GroupList ]
} }
dic = self._post(url, params) dic = self._post(url, params)
# blabla ... # blabla ...
ContactList = dic['ContactList']
ContactCount = dic['Count']
self.GroupList = ContactList
for i in xrange(len(ContactList) - 1, -1, -1):
Contact = ContactList[i]
MemberList = Contact['MemberList']
for member in MemberList:
self.GroupMemeberList.append(member)
return True return True
def getNameById(self, id):
url = self.base_uri + '/webwxbatchgetcontact?type=ex&r=%s&pass_ticket=%s' % (int(time.time()), self.pass_ticket)
params = {
'BaseRequest': self.BaseRequest,
"Count": 1,
"List": [ {"UserName": id, "EncryChatRoomId":""} ]
}
dic = self._post(url, params)
# blabla ...
return dic['ContactList']
def testsynccheck(self): def testsynccheck(self):
SyncHost = [ SyncHost = [
'webpush.weixin.qq.com', 'webpush.weixin.qq.com',
@@ -354,12 +388,41 @@ class WebWeixin(object):
fn = 'voice_'+msgid+'.mp3' fn = 'voice_'+msgid+'.mp3'
return self._saveFile(fn, data, 'webwxgetvoice') return self._saveFile(fn, data, 'webwxgetvoice')
def getGroupName(self, id):
name = '未知群'
for member in self.GroupList:
if member['UserName'] == id:
name = member['NickName']
if name == '未知群':
# 现有群里面查不到
GroupList = self.getNameById(id)
for group in GroupList:
self.GroupList.append(group)
if group['UserName'] == id:
name = group['NickName']
MemberList = group['MemberList']
for member in MemberList:
self.GroupMemeberList.append(member)
return name
def getUserRemarkName(self, id): def getUserRemarkName(self, id):
name = '未知群' if id[:2] == '@@' else '陌生人' name = '未知群' if id[:2] == '@@' else '陌生人'
if id == self.User['UserName']: return self.User['NickName'] if id == self.User['UserName']: return self.User['NickName'] # 自己
for member in self.MemberList:
if member['UserName'] == id: if id[:2] == '@@':
name = member['RemarkName'] if member['RemarkName'] else member['NickName'] # 群
name = self.getGroupName(id)
else:
# 直接联系人
for member in self.ContactList:
if member['UserName'] == id:
name = member['RemarkName'] if member['RemarkName'] else member['NickName']
# 群友
for member in self.GroupMemeberList:
if member['UserName'] == id:
name = member['DisplayName'] if member['DisplayName'] else member['NickName']
if name == '未知群' or name == '陌生人': logging.debug(id)
return name return name
def getUSerID(self, name): def getUSerID(self, name):
@@ -469,7 +532,8 @@ class WebWeixin(object):
print '= 地区: %s %s' % (info['Province'], info['City']) print '= 地区: %s %s' % (info['Province'], info['City'])
print '= 性别: %s' % ['未知', '', ''][info['Sex']] print '= 性别: %s' % ['未知', '', ''][info['Sex']]
print '=========================' print '========================='
logging.info('%s 发送了一张名片: %s' % (name.strip(), json.dumps(info))) raw_msg = { 'raw_msg': msg, 'message': '%s 发送了一张名片: %s' % (name.strip(), json.dumps(info)) }
self._showMsg(raw_msg)
elif msgType == 47: elif msgType == 47:
url = self._searchContent('cdnurl', content) url = self._searchContent('cdnurl', content)
raw_msg = { 'raw_msg': msg, 'message': '%s 发了一个动画表情,点击下面链接查看: %s' % (name, url) } raw_msg = { 'raw_msg': msg, 'message': '%s 发了一个动画表情,点击下面链接查看: %s' % (name, url) }
@@ -485,7 +549,14 @@ class WebWeixin(object):
print '= 链接: %s' % msg['Url'] print '= 链接: %s' % msg['Url']
print '= 来自: %s' % self._searchContent('appname', content, 'xml') print '= 来自: %s' % self._searchContent('appname', content, 'xml')
print '=========================' print '========================='
string = "%s 分享了一个%s:" % (name, appMsgType[msg['AppMsgType']]) card = {
'title': msg['FileName'],
'description': self._searchContent('des', content, 'xml'),
'url': msg['Url'],
'appname': self._searchContent('appname', content, 'xml')
}
raw_msg = { 'raw_msg': msg, 'message': '%s 分享了一个%s: %s' % (name, appMsgType[msg['AppMsgType']], json.dumps(card)) }
self._showMsg(raw_msg)
elif msgType == 62: elif msgType == 62:
video = self.webwxgetvideo(msgid) video = self.webwxgetvideo(msgid)
raw_msg = { 'raw_msg': msg, 'message': '%s 发了一段语音: %s' % (name, video) } raw_msg = { 'raw_msg': msg, 'message': '%s 发了一段语音: %s' % (name, video) }
@@ -504,6 +575,7 @@ class WebWeixin(object):
self._run('[*] 进行同步线路测试 ... ', self.testsynccheck) self._run('[*] 进行同步线路测试 ... ', self.testsynccheck)
playWeChat = 0 playWeChat = 0
while True: while True:
self.lastCheckTs = time.time()
[retcode, selector] = self.synccheck() [retcode, selector] = self.synccheck()
if self.DEBUG: print 'retcode: %s, selector: %s' % (retcode, selector) if self.DEBUG: print 'retcode: %s, selector: %s' % (retcode, selector)
logging.debug('retcode: %s, selector: %s' % (retcode, selector)) logging.debug('retcode: %s, selector: %s' % (retcode, selector))
@@ -519,6 +591,9 @@ class WebWeixin(object):
if selector == '2': if selector == '2':
r = self.webwxsync() r = self.webwxsync()
if r is not None: self.handleMsg(r) if r is not None: self.handleMsg(r)
elif selector == '6':
# TODO
time.sleep(1)
elif selector == '7': elif selector == '7':
playWeChat += 1 playWeChat += 1
print '[*] 你在手机上玩微信被我发现了 %d' % playWeChat print '[*] 你在手机上玩微信被我发现了 %d' % playWeChat
@@ -526,6 +601,7 @@ class WebWeixin(object):
r = self.webwxsync() r = self.webwxsync()
elif selector == '0': elif selector == '0':
time.sleep(1) time.sleep(1)
if (time.time() - self.lastCheckTs) <= 20: time.sleep(time.time() - self.lastCheckTs)
def sendMsg(self, name, word, isfile = False): def sendMsg(self, name, word, isfile = False):
id = self.getUSerID(name) id = self.getUSerID(name)
@@ -573,7 +649,10 @@ class WebWeixin(object):
self._run('[*] 微信初始化 ... ', self.webwxinit) self._run('[*] 微信初始化 ... ', self.webwxinit)
self._run('[*] 开启状态通知 ... ', self.webwxstatusnotify) self._run('[*] 开启状态通知 ... ', self.webwxstatusnotify)
self._run('[*] 获取联系人 ... ', self.webwxgetcontact) self._run('[*] 获取联系人 ... ', self.webwxgetcontact)
self._echo('[*] %d 位联系人' % len(self.ContactList)); print; logging.debug('[*] 微信网页版 ... 开动') self._echo('[*] %s 个联系人,读取到联系人 %d' % (self.MemberCount, len(self.MemberList))); print
self._echo('[*] 共有 %d 个群 | %d 个直接联系人 | %d 个特殊账号 %d 公众号或服务号' % (len(self.GroupList), len(self.ContactList), len(self.SpecialUsersList), len(self.PublicUsersList) )); print
self._run('[*] 获取群 ... ', self.webwxbatchgetcontact)
logging.debug('[*] 微信网页版 ... 开动')
if self.DEBUG: print self if self.DEBUG: print self
logging.debug(self) logging.debug(self)
@@ -618,7 +697,7 @@ class WebWeixin(object):
def _run(self, str, func, *args): def _run(self, str, func, *args):
self._echo(str) self._echo(str)
if func(*args): print '成功'; logging.debug('%s... 开启' % (str)) if func(*args): print '成功'; logging.debug('%s... 成功' % (str))
else: print('失败\n[*] 退出程序'); logging.debug('%s... 失败' % (str)); logging.debug('[*] 退出程序'); exit() else: print('失败\n[*] 退出程序'); logging.debug('%s... 失败' % (str)); logging.debug('[*] 退出程序'); exit()
def _echo(self, str): def _echo(self, str):