diff --git a/weixin.py b/weixin.py index 1e1834b..240a7f0 100755 --- a/weixin.py +++ b/weixin.py @@ -15,9 +15,11 @@ import random import multiprocessing import platform import logging +import httplib from collections import defaultdict from urlparse import urlparse from lxml import html +#import pdb # for media upload import mimetypes @@ -141,6 +143,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: @@ -150,6 +154,7 @@ class WebWeixin(object): return False def genQRCode(self): + #return self._showQRCodeImg() if sys.platform.startswith('win'): self._showQRCodeImg() else: @@ -163,6 +168,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) @@ -171,6 +178,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) @@ -190,6 +199,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 @@ -221,6 +232,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 @@ -240,15 +253,18 @@ class WebWeixin(object): "ClientMsgId": int(time.time()) } dic = self._post(url, params) + if dic == '': + return False return dic['BaseResponse']['Ret'] == 0 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, {}) + if dic == '': + return False self.MemberCount = dic['MemberCount'] self.MemberList = dic['MemberList'] @@ -284,6 +300,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'] @@ -307,6 +325,8 @@ class WebWeixin(object): "List": [{"UserName": id, "EncryChatRoomId": ""}] } dic = self._post(url, params) + if dic == '': + return None # blabla ... return dic['ContactList'] @@ -319,7 +339,9 @@ class WebWeixin(object): 'webpush1.wechat.com', 'webpush2.wechat.com', 'webpush1.wechatapp.com', - # 'webpush.wechatapp.com' + 'webpush.wechatapp.com', + 'webpush.wx.qq.com', + 'webpush.wx2.qq.com', ] for host in SyncHost: self.syncHost = host @@ -341,6 +363,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) @@ -357,9 +381,11 @@ 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) - logging.debug(json.dumps(dic, indent=4)) + (json.dumps(dic, indent=4)) if dic['BaseResponse']['Ret'] == 0: self.SyncKey = dic['SyncKey'] @@ -527,6 +553,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') @@ -534,6 +562,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') @@ -541,6 +571,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') @@ -549,6 +581,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') @@ -556,6 +590,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') @@ -637,9 +673,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('&'): @@ -978,11 +1020,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: @@ -1001,10 +1048,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: @@ -1013,11 +1071,25 @@ 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 + + + try: + response = urllib2.urlopen(request) + data = response.read() + if jsonfmt: + return json.loads(data, object_hook=_decode_dict) + 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 _xiaodoubi(self, word): url = 'http://www.xiaodoubi.com/bot/chat.php'