Merge pull request #106 from flyingtime/master
添加新的synccheck url并且添加了一些异常处理
This commit is contained in:
@@ -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-')
|
||||||
|
try:
|
||||||
response = urllib2.urlopen(request)
|
response = urllib2.urlopen(request)
|
||||||
data = response.read()
|
data = response.read()
|
||||||
logging.debug(url)
|
logging.debug(url)
|
||||||
return data
|
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))
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
response = urllib2.urlopen(request)
|
response = urllib2.urlopen(request)
|
||||||
data = response.read()
|
data = response.read()
|
||||||
if jsonfmt:
|
if jsonfmt:
|
||||||
return json.loads(data, object_hook=_decode_dict)
|
return json.loads(data, object_hook=_decode_dict)
|
||||||
return data
|
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'
|
||||||
|
|||||||
Reference in New Issue
Block a user