Merge pull request #106 from flyingtime/master

添加新的synccheck url并且添加了一些异常处理
This commit is contained in:
Urinx
2016-10-20 11:54:25 +08:00
committed by GitHub
+88 -16
View File
@@ -15,9 +15,11 @@ import random
import multiprocessing import multiprocessing
import platform import platform
import logging import logging
import httplib
from collections import defaultdict from collections import defaultdict
from urlparse import urlparse from urlparse import urlparse
from lxml import html from lxml import html
#import pdb
# for media upload # for media upload
import mimetypes import mimetypes
@@ -141,6 +143,8 @@ class WebWeixin(object):
'_': int(time.time()), '_': int(time.time()),
} }
data = self._post(url, params, False) data = self._post(url, params, False)
if data == '':
return False
regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"' regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"'
pm = re.search(regx, data) pm = re.search(regx, data)
if pm: if pm:
@@ -150,6 +154,7 @@ class WebWeixin(object):
return False return False
def genQRCode(self): def genQRCode(self):
#return self._showQRCodeImg()
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
self._showQRCodeImg() self._showQRCodeImg()
else: else:
@@ -163,6 +168,8 @@ class WebWeixin(object):
} }
data = self._post(url, params, False) data = self._post(url, params, False)
if data == '':
return
QRCODE_PATH = self._saveFile('qrcode.jpg', data, '_showQRCodeImg') QRCODE_PATH = self._saveFile('qrcode.jpg', data, '_showQRCodeImg')
os.startfile(QRCODE_PATH) 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' % ( url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % (
tip, self.uuid, int(time.time())) tip, self.uuid, int(time.time()))
data = self._get(url) data = self._get(url)
if data == '':
return False
pm = re.search(r'window.code=(\d+);', data) pm = re.search(r'window.code=(\d+);', data)
code = pm.group(1) code = pm.group(1)
@@ -190,6 +199,8 @@ class WebWeixin(object):
def login(self): def login(self):
data = self._get(self.redirect_uri) data = self._get(self.redirect_uri)
if data == '':
return False
doc = xml.dom.minidom.parseString(data) doc = xml.dom.minidom.parseString(data)
root = doc.documentElement root = doc.documentElement
@@ -221,6 +232,8 @@ class WebWeixin(object):
'BaseRequest': self.BaseRequest 'BaseRequest': self.BaseRequest
} }
dic = self._post(url, params) dic = self._post(url, params)
if dic == '':
return False
self.SyncKey = dic['SyncKey'] self.SyncKey = dic['SyncKey']
self.User = dic['User'] self.User = dic['User']
# synckey for synccheck # synckey for synccheck
@@ -240,15 +253,18 @@ class WebWeixin(object):
"ClientMsgId": int(time.time()) "ClientMsgId": int(time.time())
} }
dic = self._post(url, params) dic = self._post(url, params)
if dic == '':
return False
return dic['BaseResponse']['Ret'] == 0 return dic['BaseResponse']['Ret'] == 0
def webwxgetcontact(self): def webwxgetcontact(self):
SpecialUsers = self.SpecialUsers SpecialUsers = self.SpecialUsers
print self.base_uri
url = self.base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % ( url = self.base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (
self.pass_ticket, self.skey, int(time.time())) self.pass_ticket, self.skey, int(time.time()))
dic = self._post(url, {}) dic = self._post(url, {})
if dic == '':
return False
self.MemberCount = dic['MemberCount'] self.MemberCount = dic['MemberCount']
self.MemberList = dic['MemberList'] self.MemberList = dic['MemberList']
@@ -284,6 +300,8 @@ 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)
if dic == '':
return False
# blabla ... # blabla ...
ContactList = dic['ContactList'] ContactList = dic['ContactList']
@@ -307,6 +325,8 @@ class WebWeixin(object):
"List": [{"UserName": id, "EncryChatRoomId": ""}] "List": [{"UserName": id, "EncryChatRoomId": ""}]
} }
dic = self._post(url, params) dic = self._post(url, params)
if dic == '':
return None
# blabla ... # blabla ...
return dic['ContactList'] return dic['ContactList']
@@ -319,7 +339,9 @@ class WebWeixin(object):
'webpush1.wechat.com', 'webpush1.wechat.com',
'webpush2.wechat.com', 'webpush2.wechat.com',
'webpush1.wechatapp.com', 'webpush1.wechatapp.com',
# 'webpush.wechatapp.com' 'webpush.wechatapp.com',
'webpush.wx.qq.com',
'webpush.wx2.qq.com',
] ]
for host in SyncHost: for host in SyncHost:
self.syncHost = host self.syncHost = host
@@ -341,6 +363,8 @@ class WebWeixin(object):
url = 'https://' + self.syncHost + \ url = 'https://' + self.syncHost + \
'/cgi-bin/mmwebwx-bin/synccheck?' + urllib.urlencode(params) '/cgi-bin/mmwebwx-bin/synccheck?' + urllib.urlencode(params)
data = self._get(url) data = self._get(url)
if data == '':
return [-1,-1]
pm = re.search( pm = re.search(
r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}', data) r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}', data)
retcode = pm.group(1) retcode = pm.group(1)
@@ -357,9 +381,11 @@ class WebWeixin(object):
'rr': ~int(time.time()) 'rr': ~int(time.time())
} }
dic = self._post(url, params) dic = self._post(url, params)
if dic == '':
return None
if self.DEBUG: if self.DEBUG:
print json.dumps(dic, indent=4) print json.dumps(dic, indent=4)
logging.debug(json.dumps(dic, indent=4)) (json.dumps(dic, indent=4))
if dic['BaseResponse']['Ret'] == 0: if dic['BaseResponse']['Ret'] == 0:
self.SyncKey = dic['SyncKey'] self.SyncKey = dic['SyncKey']
@@ -527,6 +553,8 @@ class WebWeixin(object):
url = self.base_uri + \ url = self.base_uri + \
'/webwxgeticon?username=%s&skey=%s' % (id, self.skey) '/webwxgeticon?username=%s&skey=%s' % (id, self.skey)
data = self._get(url) data = self._get(url)
if data == '':
return ''
fn = 'img_' + id + '.jpg' fn = 'img_' + id + '.jpg'
return self._saveFile(fn, data, 'webwxgeticon') return self._saveFile(fn, data, 'webwxgeticon')
@@ -534,6 +562,8 @@ class WebWeixin(object):
url = self.base_uri + \ url = self.base_uri + \
'/webwxgetheadimg?username=%s&skey=%s' % (id, self.skey) '/webwxgetheadimg?username=%s&skey=%s' % (id, self.skey)
data = self._get(url) data = self._get(url)
if data == '':
return ''
fn = 'img_' + id + '.jpg' fn = 'img_' + id + '.jpg'
return self._saveFile(fn, data, 'webwxgetheadimg') return self._saveFile(fn, data, 'webwxgetheadimg')
@@ -541,6 +571,8 @@ class WebWeixin(object):
url = self.base_uri + \ url = self.base_uri + \
'/webwxgetmsgimg?MsgID=%s&skey=%s' % (msgid, self.skey) '/webwxgetmsgimg?MsgID=%s&skey=%s' % (msgid, self.skey)
data = self._get(url) data = self._get(url)
if data == '':
return ''
fn = 'img_' + msgid + '.jpg' fn = 'img_' + msgid + '.jpg'
return self._saveFile(fn, data, 'webwxgetmsgimg') return self._saveFile(fn, data, 'webwxgetmsgimg')
@@ -549,6 +581,8 @@ class WebWeixin(object):
url = self.base_uri + \ url = self.base_uri + \
'/webwxgetvideo?msgid=%s&skey=%s' % (msgid, self.skey) '/webwxgetvideo?msgid=%s&skey=%s' % (msgid, self.skey)
data = self._get(url, api='webwxgetvideo') data = self._get(url, api='webwxgetvideo')
if data == '':
return ''
fn = 'video_' + msgid + '.mp4' fn = 'video_' + msgid + '.mp4'
return self._saveFile(fn, data, 'webwxgetvideo') return self._saveFile(fn, data, 'webwxgetvideo')
@@ -556,6 +590,8 @@ class WebWeixin(object):
url = self.base_uri + \ url = self.base_uri + \
'/webwxgetvoice?msgid=%s&skey=%s' % (msgid, self.skey) '/webwxgetvoice?msgid=%s&skey=%s' % (msgid, self.skey)
data = self._get(url) data = self._get(url)
if data == '':
return ''
fn = 'voice_' + msgid + '.mp3' fn = 'voice_' + msgid + '.mp3'
return self._saveFile(fn, data, 'webwxgetvoice') 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: 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') 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'] url = tree.xpath('//html/body/div/img')[0].attrib['src']
for item in urlparse(url).query.split('&'): 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]) print ''.join([BLACK if j else WHITE for j in i])
def _str2qr(self, str): def _str2qr(self, str):
print(str)
qr = qrcode.QRCode() qr = qrcode.QRCode()
qr.border = 1 qr.border = 1
qr.add_data(str) qr.add_data(str)
mat = qr.get_matrix() qr.make()
self._printQR(mat) # qr.print_tty() or qr.print_ascii() # 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): def _transcoding(self, data):
if not data: if not data:
@@ -1001,10 +1048,21 @@ class WebWeixin(object):
request.add_header('Range', 'bytes=0-') request.add_header('Range', 'bytes=0-')
if api == 'webwxgetvideo': if api == 'webwxgetvideo':
request.add_header('Range', 'bytes=0-') request.add_header('Range', 'bytes=0-')
response = urllib2.urlopen(request) try:
data = response.read() response = urllib2.urlopen(request)
logging.debug(url) data = response.read()
return data 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): def _post(self, url, params, jsonfmt=True):
if jsonfmt: if jsonfmt:
@@ -1013,11 +1071,25 @@ class WebWeixin(object):
'ContentType', 'application/json; charset=UTF-8') 'ContentType', 'application/json; charset=UTF-8')
else: else:
request = urllib2.Request(url=url, data=urllib.urlencode(params)) request = urllib2.Request(url=url, data=urllib.urlencode(params))
response = urllib2.urlopen(request)
data = response.read()
if jsonfmt: try:
return json.loads(data, object_hook=_decode_dict) response = urllib2.urlopen(request)
return data 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): def _xiaodoubi(self, word):
url = 'http://www.xiaodoubi.com/bot/chat.php' url = 'http://www.xiaodoubi.com/bot/chat.php'