Merge pull request #106 from flyingtime/master
添加新的synccheck url并且添加了一些异常处理
This commit is contained in:
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user