From 3ac95c785fd29d83a88a794abba4fb2c03fe665d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B8=96=E9=BE=99?= Date: Tue, 18 Oct 2016 13:52:28 +0800 Subject: [PATCH 1/8] add new synccheck urls --- weixin.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/weixin.py b/weixin.py index 1e1834b..f5ae59b 100755 --- a/weixin.py +++ b/weixin.py @@ -18,6 +18,7 @@ import logging from collections import defaultdict from urlparse import urlparse from lxml import html +#import pdb # for media upload import mimetypes @@ -150,6 +151,7 @@ class WebWeixin(object): return False def genQRCode(self): + #return self._showQRCodeImg() if sys.platform.startswith('win'): self._showQRCodeImg() else: @@ -318,8 +320,10 @@ class WebWeixin(object): 'webpush.wechat.com', 'webpush1.wechat.com', 'webpush2.wechat.com', - 'webpush1.wechatapp.com', - # 'webpush.wechatapp.com' + 'webpush.wx.qq.com', + 'webpush.wx2.qq.com', + #'webpush1.wechatapp.com', + #'webpush.wechatapp.com', ] for host in SyncHost: self.syncHost = host @@ -978,11 +982,16 @@ class WebWeixin(object): print ''.join([BLACK if j else WHITE for j in i]) def _str2qr(self, str): + print(str) qr = qrcode.QRCode() qr.border = 1 qr.add_data(str) - mat = qr.get_matrix() - self._printQR(mat) # qr.print_tty() or qr.print_ascii() + qr.make() + # img = qr.make_image() + # img.save("qrcode.png") + #mat = qr.get_matrix() + #self._printQR(mat) # qr.print_tty() or qr.print_ascii() + qr.print_ascii(invert=True) def _transcoding(self, data): if not data: From 1eebbf84ab8836f475888cd18a308e9abc041125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B8=96=E9=BE=99?= Date: Tue, 18 Oct 2016 14:17:10 +0800 Subject: [PATCH 2/8] add try catch with urllib2.urlopen --- weixin.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/weixin.py b/weixin.py index f5ae59b..39831aa 100755 --- a/weixin.py +++ b/weixin.py @@ -247,7 +247,6 @@ class WebWeixin(object): def webwxgetcontact(self): SpecialUsers = self.SpecialUsers - print self.base_uri url = self.base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % ( self.pass_ticket, self.skey, int(time.time())) dic = self._post(url, {}) @@ -1022,11 +1021,26 @@ class WebWeixin(object): 'ContentType', 'application/json; charset=UTF-8') else: request = urllib2.Request(url=url, data=urllib.urlencode(params)) - response = urllib2.urlopen(request) - data = response.read() - if jsonfmt: - return json.loads(data, object_hook=_decode_dict) - return data + #print(url) + #response = urllib2.urlopen(request) + + try: + response = urllib2.urlopen(request) + data = response.read() + if jsonfmt: + return json.loads(data, object_hook=_decode_dict) + return data + except urllib2.HTTPError, e: + checksLogger.error('HTTPError = ' + str(e.code)) + except urllib2.URLError, e: + checksLogger.error('URLError = ' + str(e.reason)) + except httplib.HTTPException, e: + checksLogger.error('HTTPException') + except Exception: + import traceback + checksLogger.error('generic exception: ' + traceback.format_exc()) + + return '' def _xiaodoubi(self, word): url = 'http://www.xiaodoubi.com/bot/chat.php' From 97ed2dff2fbd4bed2669bb68671cb6f02de35596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B8=96=E9=BE=99?= Date: Tue, 18 Oct 2016 16:49:58 +0800 Subject: [PATCH 3/8] use logging.error in except --- weixin.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/weixin.py b/weixin.py index 39831aa..8ede2f1 100755 --- a/weixin.py +++ b/weixin.py @@ -362,7 +362,7 @@ class WebWeixin(object): dic = self._post(url, params) if self.DEBUG: print json.dumps(dic, indent=4) - logging.debug(json.dumps(dic, indent=4)) + (json.dumps(dic, indent=4)) if dic['BaseResponse']['Ret'] == 0: self.SyncKey = dic['SyncKey'] @@ -1031,14 +1031,14 @@ class WebWeixin(object): return json.loads(data, object_hook=_decode_dict) return data except urllib2.HTTPError, e: - checksLogger.error('HTTPError = ' + str(e.code)) + logging.error('HTTPError = ' + str(e.code)) except urllib2.URLError, e: - checksLogger.error('URLError = ' + str(e.reason)) + logging.error('URLError = ' + str(e.reason)) except httplib.HTTPException, e: - checksLogger.error('HTTPException') + logging.error('HTTPException') except Exception: import traceback - checksLogger.error('generic exception: ' + traceback.format_exc()) + logging.error('generic exception: ' + traceback.format_exc()) return '' From b62e3491e1cb07743a57bafab32e4dc5347b92de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B8=96=E9=BE=99?= Date: Tue, 18 Oct 2016 16:54:23 +0800 Subject: [PATCH 4/8] _get add try except --- weixin.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/weixin.py b/weixin.py index 8ede2f1..1fd7b07 100755 --- a/weixin.py +++ b/weixin.py @@ -1009,10 +1009,21 @@ class WebWeixin(object): request.add_header('Range', 'bytes=0-') if api == 'webwxgetvideo': request.add_header('Range', 'bytes=0-') - response = urllib2.urlopen(request) - data = response.read() - logging.debug(url) - return data + try: + response = urllib2.urlopen(request) + data = response.read() + logging.debug(url) + return data + except urllib2.HTTPError, e: + logging.error('HTTPError = ' + str(e.code)) + except urllib2.URLError, e: + logging.error('URLError = ' + str(e.reason)) + except httplib.HTTPException, e: + logging.error('HTTPException') + except Exception: + import traceback + logging.error('generic exception: ' + traceback.format_exc()) + return '' def _post(self, url, params, jsonfmt=True): if jsonfmt: @@ -1021,8 +1032,7 @@ class WebWeixin(object): 'ContentType', 'application/json; charset=UTF-8') else: request = urllib2.Request(url=url, data=urllib.urlencode(params)) - #print(url) - #response = urllib2.urlopen(request) + try: response = urllib2.urlopen(request) From a9048b32fc59fe82bcbd60a1281d69aeed65613f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B8=96=E9=BE=99?= Date: Tue, 18 Oct 2016 17:23:35 +0800 Subject: [PATCH 5/8] all _post check return value --- weixin.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/weixin.py b/weixin.py index 1fd7b07..4f5392b 100755 --- a/weixin.py +++ b/weixin.py @@ -142,6 +142,8 @@ class WebWeixin(object): '_': int(time.time()), } data = self._post(url, params, False) + if data == '' + return False regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"' pm = re.search(regx, data) if pm: @@ -165,6 +167,8 @@ class WebWeixin(object): } data = self._post(url, params, False) + if data == '' + return QRCODE_PATH = self._saveFile('qrcode.jpg', data, '_showQRCodeImg') os.startfile(QRCODE_PATH) @@ -223,6 +227,8 @@ class WebWeixin(object): 'BaseRequest': self.BaseRequest } dic = self._post(url, params) + if dic == '' + return False self.SyncKey = dic['SyncKey'] self.User = dic['User'] # synckey for synccheck @@ -242,6 +248,8 @@ class WebWeixin(object): "ClientMsgId": int(time.time()) } dic = self._post(url, params) + if dic == '' + return False return dic['BaseResponse']['Ret'] == 0 @@ -250,6 +258,8 @@ class WebWeixin(object): url = self.base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % ( self.pass_ticket, self.skey, int(time.time())) dic = self._post(url, {}) + if dic == '' + return False self.MemberCount = dic['MemberCount'] self.MemberList = dic['MemberList'] @@ -285,6 +295,8 @@ class WebWeixin(object): "List": [{"UserName": g['UserName'], "EncryChatRoomId":""} for g in self.GroupList] } dic = self._post(url, params) + if dic == '' + return False # blabla ... ContactList = dic['ContactList'] @@ -308,6 +320,8 @@ class WebWeixin(object): "List": [{"UserName": id, "EncryChatRoomId": ""}] } dic = self._post(url, params) + if dic == '' + return None # blabla ... return dic['ContactList'] @@ -360,6 +374,8 @@ class WebWeixin(object): 'rr': ~int(time.time()) } dic = self._post(url, params) + if dic == '' + return None if self.DEBUG: print json.dumps(dic, indent=4) (json.dumps(dic, indent=4)) From 45054dcd632ec93a4aa47413c540b161bb6516e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B8=96=E9=BE=99?= Date: Tue, 18 Oct 2016 20:03:42 +0800 Subject: [PATCH 6/8] all _get check return value --- weixin.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/weixin.py b/weixin.py index 4f5392b..3da4f72 100755 --- a/weixin.py +++ b/weixin.py @@ -177,6 +177,8 @@ class WebWeixin(object): url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % ( tip, self.uuid, int(time.time())) data = self._get(url) + if data == '' + return False pm = re.search(r'window.code=(\d+);', data) code = pm.group(1) @@ -196,6 +198,8 @@ class WebWeixin(object): def login(self): data = self._get(self.redirect_uri) + if data == '' + return False doc = xml.dom.minidom.parseString(data) root = doc.documentElement @@ -358,6 +362,8 @@ class WebWeixin(object): url = 'https://' + self.syncHost + \ '/cgi-bin/mmwebwx-bin/synccheck?' + urllib.urlencode(params) data = self._get(url) + if data == '' + return [-1,-1] pm = re.search( r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}', data) retcode = pm.group(1) @@ -546,6 +552,8 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgeticon?username=%s&skey=%s' % (id, self.skey) data = self._get(url) + if data == '' + return '' fn = 'img_' + id + '.jpg' return self._saveFile(fn, data, 'webwxgeticon') @@ -553,6 +561,8 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgetheadimg?username=%s&skey=%s' % (id, self.skey) data = self._get(url) + if data == '' + return '' fn = 'img_' + id + '.jpg' return self._saveFile(fn, data, 'webwxgetheadimg') @@ -560,6 +570,8 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgetmsgimg?MsgID=%s&skey=%s' % (msgid, self.skey) data = self._get(url) + if data == '' + return '' fn = 'img_' + msgid + '.jpg' return self._saveFile(fn, data, 'webwxgetmsgimg') @@ -568,6 +580,8 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgetvideo?msgid=%s&skey=%s' % (msgid, self.skey) data = self._get(url, api='webwxgetvideo') + if data == '' + return '' fn = 'video_' + msgid + '.mp4' return self._saveFile(fn, data, 'webwxgetvideo') @@ -575,6 +589,8 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgetvoice?msgid=%s&skey=%s' % (msgid, self.skey) data = self._get(url) + if data == '' + return '' fn = 'voice_' + msgid + '.mp3' return self._saveFile(fn, data, 'webwxgetvoice') @@ -656,9 +672,15 @@ class WebWeixin(object): if content.find('http://weixin.qq.com/cgi-bin/redirectforward?args=') != -1: # 地理位置消息 - data = self._get(content).decode('gbk').encode('utf-8') + data = self._get(content) + if data == '' + return + data.decode('gbk').encode('utf-8') pos = self._searchContent('title', data, 'xml') - tree = html.fromstring(self._get(content)) + temp = self._get(content) + if temp == '' + return + tree = html.fromstring(temp) url = tree.xpath('//html/body/div/img')[0].attrib['src'] for item in urlparse(url).query.split('&'): From 9f0bed3c10ad349a59af0dfa114c73f783e7898c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B8=96=E9=BE=99?= Date: Wed, 19 Oct 2016 08:32:49 +0800 Subject: [PATCH 7/8] fixed if condition end with ':' --- weixin.py | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/weixin.py b/weixin.py index 3da4f72..7d94e2d 100755 --- a/weixin.py +++ b/weixin.py @@ -142,7 +142,7 @@ class WebWeixin(object): '_': int(time.time()), } data = self._post(url, params, False) - if data == '' + if data == '': return False regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"' pm = re.search(regx, data) @@ -167,7 +167,7 @@ class WebWeixin(object): } data = self._post(url, params, False) - if data == '' + if data == '': return QRCODE_PATH = self._saveFile('qrcode.jpg', data, '_showQRCodeImg') os.startfile(QRCODE_PATH) @@ -177,7 +177,7 @@ class WebWeixin(object): url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % ( tip, self.uuid, int(time.time())) data = self._get(url) - if data == '' + if data == '': return False pm = re.search(r'window.code=(\d+);', data) code = pm.group(1) @@ -198,7 +198,7 @@ class WebWeixin(object): def login(self): data = self._get(self.redirect_uri) - if data == '' + if data == '': return False doc = xml.dom.minidom.parseString(data) root = doc.documentElement @@ -231,7 +231,7 @@ class WebWeixin(object): 'BaseRequest': self.BaseRequest } dic = self._post(url, params) - if dic == '' + if dic == '': return False self.SyncKey = dic['SyncKey'] self.User = dic['User'] @@ -252,7 +252,7 @@ class WebWeixin(object): "ClientMsgId": int(time.time()) } dic = self._post(url, params) - if dic == '' + if dic == '': return False return dic['BaseResponse']['Ret'] == 0 @@ -262,7 +262,7 @@ class WebWeixin(object): url = self.base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % ( self.pass_ticket, self.skey, int(time.time())) dic = self._post(url, {}) - if dic == '' + if dic == '': return False self.MemberCount = dic['MemberCount'] @@ -299,7 +299,7 @@ class WebWeixin(object): "List": [{"UserName": g['UserName'], "EncryChatRoomId":""} for g in self.GroupList] } dic = self._post(url, params) - if dic == '' + if dic == '': return False # blabla ... @@ -324,7 +324,7 @@ class WebWeixin(object): "List": [{"UserName": id, "EncryChatRoomId": ""}] } dic = self._post(url, params) - if dic == '' + if dic == '': return None # blabla ... @@ -362,7 +362,7 @@ class WebWeixin(object): url = 'https://' + self.syncHost + \ '/cgi-bin/mmwebwx-bin/synccheck?' + urllib.urlencode(params) data = self._get(url) - if data == '' + if data == '': return [-1,-1] pm = re.search( r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}', data) @@ -380,7 +380,7 @@ class WebWeixin(object): 'rr': ~int(time.time()) } dic = self._post(url, params) - if dic == '' + if dic == '': return None if self.DEBUG: print json.dumps(dic, indent=4) @@ -552,7 +552,7 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgeticon?username=%s&skey=%s' % (id, self.skey) data = self._get(url) - if data == '' + if data == '': return '' fn = 'img_' + id + '.jpg' return self._saveFile(fn, data, 'webwxgeticon') @@ -561,7 +561,7 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgetheadimg?username=%s&skey=%s' % (id, self.skey) data = self._get(url) - if data == '' + if data == '': return '' fn = 'img_' + id + '.jpg' return self._saveFile(fn, data, 'webwxgetheadimg') @@ -570,7 +570,7 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgetmsgimg?MsgID=%s&skey=%s' % (msgid, self.skey) data = self._get(url) - if data == '' + if data == '': return '' fn = 'img_' + msgid + '.jpg' return self._saveFile(fn, data, 'webwxgetmsgimg') @@ -580,7 +580,7 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgetvideo?msgid=%s&skey=%s' % (msgid, self.skey) data = self._get(url, api='webwxgetvideo') - if data == '' + if data == '': return '' fn = 'video_' + msgid + '.mp4' return self._saveFile(fn, data, 'webwxgetvideo') @@ -589,7 +589,7 @@ class WebWeixin(object): url = self.base_uri + \ '/webwxgetvoice?msgid=%s&skey=%s' % (msgid, self.skey) data = self._get(url) - if data == '' + if data == '': return '' fn = 'voice_' + msgid + '.mp3' return self._saveFile(fn, data, 'webwxgetvoice') @@ -673,12 +673,12 @@ class WebWeixin(object): if content.find('http://weixin.qq.com/cgi-bin/redirectforward?args=') != -1: # 地理位置消息 data = self._get(content) - if data == '' + if data == '': return data.decode('gbk').encode('utf-8') pos = self._searchContent('title', data, 'xml') temp = self._get(content) - if temp == '' + if temp == '': return tree = html.fromstring(temp) url = tree.xpath('//html/body/div/img')[0].attrib['src'] From 77e244672a2d7deed843dbea1b47522d2d2d7095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B8=96=E9=BE=99?= Date: Wed, 19 Oct 2016 08:59:36 +0800 Subject: [PATCH 8/8] import httplib use in try except --- weixin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/weixin.py b/weixin.py index 7d94e2d..240a7f0 100755 --- a/weixin.py +++ b/weixin.py @@ -15,6 +15,7 @@ import random import multiprocessing import platform import logging +import httplib from collections import defaultdict from urlparse import urlparse from lxml import html @@ -337,10 +338,10 @@ class WebWeixin(object): 'webpush.wechat.com', 'webpush1.wechat.com', 'webpush2.wechat.com', + 'webpush1.wechatapp.com', + 'webpush.wechatapp.com', 'webpush.wx.qq.com', 'webpush.wx2.qq.com', - #'webpush1.wechatapp.com', - #'webpush.wechatapp.com', ] for host in SyncHost: self.syncHost = host