@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user