Skip to content

Commit 28b606e

Browse files
committed
修复重写某些方法时可能遇到的 bug
1 parent 48ce723 commit 28b606e

File tree

1 file changed

+71
-63
lines changed

1 file changed

+71
-63
lines changed

GoogleVoice.py

Lines changed: 71 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import threading
1313
from bs4 import BeautifulSoup
1414
from selenium.webdriver.common.by import By
15+
from selenium import webdriver
1516
from selenium.webdriver.support.wait import WebDriverWait
1617
from selenium.webdriver.support import expected_conditions as EC
1718

@@ -82,15 +83,15 @@ class Voice(Singleton):
8283
__cookie = {}
8384
__intervals = 3
8485
__driver = None
85-
__gc_data = None
86+
_gc_data = None
8687
__try_time = 2
87-
__match = {}
88+
_match = {}
8889

8990
def __init__(self, email, passwd, debug=True):
9091
self.__email = email
9192
self.__passwd = passwd
9293
self.debug = debug
93-
self.__gc_data_name = '_gcData'
94+
self._gc_data_name = '_gcData'
9495
self.__browser_name = 'PhantomJS' # 默认
9596
self.__module = 'selenium.webdriver'
9697

@@ -168,7 +169,10 @@ def __login(self):
168169
self.status['login'] = True # login successful flag
169170
e = self.__initial()
170171
e.send(None)
171-
172+
except TimeoutException as e: # 如果出现超时,就重试
173+
time.sleep(1)
174+
e = self.__login()
175+
e.send(None)
172176
except NotOpenGoogle as e: # 打不开谷歌
173177
raise NotOpenGoogle('Can not open google, pleasw use VPN, you know...')
174178
except Exception as e:
@@ -218,26 +222,26 @@ def __initial(self):
218222
yield
219223
if self.status['login']:
220224
self.log.send(('initialization data...',))
221-
self.__gc_data = self.__driver.execute_script('return %s' % self.__gc_data_name)
222-
if self.__gc_data is None: # 如果获取不到这个参数就回去重新获取 直到获取到为止
225+
self._gc_data = self.__driver.execute_script('return %s' % self._gc_data_name)
226+
if self._gc_data is None: # 如果获取不到这个参数就回去重新获取 直到获取到为止
223227
time.sleep(self.__try_time)
224228
continue
225229
# format url
226230
self.__cookie_func(self.__driver.get_cookies()) # process cookie 处理 cookie
227-
self.__send_msg_url = '{}/sms/send/'.format(self.__gc_data['baseUrl']) # process send msg url
228-
self.__call_url = '{}/call/connect/'.format(self.__gc_data['baseUrl']) # 拨打电话的请求地址
229-
self.__call_cancel_url = '{}/call/cancel/'.format(self.__gc_data['baseUrl']) # 取消拨打电话的请求地址
230-
self.__mark_url = '{}/inbox/mark/'.format(self.__gc_data['baseUrl']) # 标记为已读的请求地址
231-
self.__del_msg_url = '{}/inbox/deleteMessages/'.format(self.__gc_data['baseUrl']) # 删除信息
232-
self.__star_url = '{}/inbox/star/'.format(self.__gc_data['baseUrl']) # 收藏信息
233-
self.__dow_msg_url = '{}/inbox/recent/'.format(self.__gc_data['baseUrl']) # 下载信息
234-
self.__quick_add_url = '{}//phonebook/quickAdd/'.format(self.__gc_data['baseUrl'])
231+
self._send_msg_url = '{}/sms/send/'.format(self._gc_data['baseUrl']) # process send msg url
232+
self.__call_url = '{}/call/connect/'.format(self._gc_data['baseUrl']) # 拨打电话的请求地址
233+
self.__call_cancel_url = '{}/call/cancel/'.format(self._gc_data['baseUrl']) # 取消拨打电话的请求地址
234+
self.__mark_url = '{}/inbox/mark/'.format(self._gc_data['baseUrl']) # 标记为已读的请求地址
235+
self.__del_msg_url = '{}/inbox/deleteMessages/'.format(self._gc_data['baseUrl']) # 删除信息
236+
self.__star_url = '{}/inbox/star/'.format(self._gc_data['baseUrl']) # 收藏信息
237+
self.__dow_msg_url = '{}/inbox/recent/'.format(self._gc_data['baseUrl']) # 下载信息
238+
self.__quick_add_url = '{}//phonebook/quickAdd/'.format(self._gc_data['baseUrl'])
235239
self.__voicemail_ogg_str = '{0}/media/send_voicemail_ogg/{1}?read=0'
236240

237-
if len(self.__gc_data['phones']) > 1: # 获取绑定的号码
238-
for k, v in self.__gc_data['phones'].items():
239-
if self.__gc_data['phones'][k]['name'] != 'Google Talk':
240-
self.__call_phone_for = self.__gc_data['phones'][k]
241+
if len(self._gc_data['phones']) > 1: # 获取绑定的号码
242+
for k, v in self._gc_data['phones'].items():
243+
if self._gc_data['phones'][k]['name'] != 'Google Talk':
244+
self.__call_phone_for = self._gc_data['phones'][k]
241245
break
242246
# 是否需要检测新消息
243247
self.status['init'] = True # 初始化完成
@@ -267,21 +271,21 @@ def __check_msg_par(self):
267271

268272
data = {'xpc': {'tp': None, 'osh': None, 'pru': 'https://www.google.com/voice/xpc/relay',
269273
'ppu': 'https://www.google.com/voice/xpc/blank/',
270-
'lpu': '{}/voice/xpc/blank/'.format(self.__gc_data['xpcUrl'])}}
274+
'lpu': '{}/voice/xpc/blank/'.format(self._gc_data['xpcUrl'])}}
271275

272-
url = '{}/voice/xpc/'.format(self.__gc_data['xpcUrl'])
273-
r = self.__requests(url, params=data)
276+
url = '{}/voice/xpc/'.format(self._gc_data['xpcUrl'])
277+
r = self._requests(url, params=data)
274278
par = re.findall("\'(.*?)\'", r.text)[0]
275279
self.log.send(('xpc: %s' % par,))
276280

277281
# https://clientsx.google.com/voice/xpc/checkMessages?r=xxxxxxx
278-
self.check_msg_url['url'] = '{0}/voice/xpc/checkMessages'.format(self.__gc_data['xpcUrl'])
282+
self.check_msg_url['url'] = '{0}/voice/xpc/checkMessages'.format(self._gc_data['xpcUrl'])
279283
self.check_msg_url['par'] = {'r': par}
280284
self.status['check'] = True
281285

282286
# 开启检测消息线程
283287
if self.status['auto']:
284-
t = threading.Thread(target=self.__check_sms, args=(self.reply_sms,), name='check-new-sms')
288+
t = threading.Thread(target=self._check_sms, args=(self.reply_sms,), name='check-new-sms')
285289
t.setDaemon(True)
286290
t.start()
287291

@@ -307,9 +311,9 @@ def current_url(self):
307311
def __headers(self):
308312
'''send post headers 请求头'''
309313
return {'host': 'www.google.com', 'user-agent': self.__user_agent,
310-
'referer': self.__gc_data['baseUrl'], 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}
314+
'referer': self._gc_data['baseUrl'], 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}
311315

312-
def __requests(self, url, params=None, data=None, method='get'):
316+
def _requests(self, url, params=None, data=None, method='get'):
313317
'''
314318
requests uniform, code reuse 封装请求方法
315319
:param url: request url 请求的地址
@@ -327,6 +331,8 @@ def __requests(self, url, params=None, data=None, method='get'):
327331
return r
328332
else: # not support method #TODO img? 发送图片
329333
pass
334+
except AttributeError as e:
335+
return None
330336
except OSError as e: # 如果是本地测试出现这个报错要更换为全局代理
331337
raise ProxyError('please proxy global')
332338
except Exception as e:
@@ -339,19 +345,19 @@ def check_unread_msg(self):
339345
:return dict
340346
'''
341347
if self.status['login'] and self.status['check']:
342-
r = self.__requests(self.check_msg_url['url'], params=self.check_msg_url['par']) # check...
348+
r = self._requests(self.check_msg_url['url'], params=self.check_msg_url['par']) # check...
343349
ret = r.json()
344350
return ret
345351
self.log.send((1, 'check msg not ready'))
346352

347-
def __check_sms(self, func):
353+
def _check_sms(self, func):
348354
'''检测未读 sms, 并做出自定义的操作'''
349355
while self.status['login'] and self.status['check']:
350356
res = self.check_unread_msg() # check sms...
351357
if res['data']['unreadCounts']['sms'] > 0: # have ...
352358
sms_list = self.unsms
353359
for i in sms_list:
354-
if i['text'].strip().upper() in self.__match:
360+
if i['text'].strip().upper() in self._match: # 匹配关键字
355361
t = threading.Thread(target=func, args=(i,), name='reply sms')
356362
t.setDaemon(True)
357363
t.start()
@@ -365,7 +371,7 @@ def reply_sms(self, data):
365371
:param data: 需要回复的 sms 的数据
366372
'''
367373
self.log.send(('ready reply sms',))
368-
r = self.send_sms(data['number'], self.__match[data['text']])
374+
r = self.send_sms(data['number'], self._match[data['text']])
369375
if r['ok']:
370376
self.log.send(('[success] reply sms to: %s' % data['number'],))
371377
else:
@@ -399,10 +405,10 @@ def unsms(self):
399405
获取未读的 sms
400406
:return: dict
401407
'''
402-
par = {'v': self.__gc_data['v']} # token
408+
par = {'v': self._gc_data['v']} # token
403409
if self.status['login']:
404410
sms_list = []
405-
r = self.__requests(self.__dow_msg_url, params=par)
411+
r = self._requests(self.__dow_msg_url, params=par)
406412
data = self.__process_xml(r)
407413
msg_list = data['soup'].find_all(name='div', class_='gc-message-unread') # 所有的未读短信消息
408414
# data = {'sms': [], 'voicemail': []}
@@ -411,10 +417,14 @@ def unsms(self):
411417
if 'gc-message-sms' in attr: # sms
412418
sms = {}
413419
sms['id'] = msg['id']
414-
sms['number'] = msg.find(name='span', class_='gc-message-sms-from').text.strip()[
415-
:-1] # 去掉空格并切掉最后的冒号
420+
sms['number'] = msg.find(name='span', class_='gc-message-sms-from').text.strip()[:-1] # 去掉空格并切掉最后的冒号
421+
# ----- 处理时间 -----
422+
time_str = msg.find(name='span', class_='gc-message-sms-time').text.strip()
423+
local_time = time.strftime("%Y-%m-%d", time.localtime())
424+
sms_time_str = ''.join((local_time, ' ', time_str))
425+
sms_time = time.strptime(sms_time_str, '%Y-%m-%d %I:%M %p')
426+
sms['time'] = time.strftime("%Y-%m-%d %X", sms_time)
416427
sms['text'] = msg.find(name='span', class_='gc-message-sms-text').text
417-
sms['time'] = msg.find(name='span', class_='gc-message-sms-time').text.strip()
418428
self.log.send(('[sms] time: {0}; id:{1} .'.format(sms['time'], sms['id']),))
419429
print(sms)
420430
sms_list.append(sms)
@@ -426,10 +436,10 @@ def read_sms(self):
426436
所有的已读读短信消息
427437
:return: dict
428438
'''
429-
par = {'v': self.__gc_data['v']} # token
439+
par = {'v': self._gc_data['v']} # token
430440
if self.status['login']:
431441
sms_list = []
432-
r = self.__requests(self.__dow_msg_url, params=par)
442+
r = self._requests(self.__dow_msg_url, params=par)
433443
data = self.__process_xml(r)
434444
msg_list = data['soup'].select('div.gc-message-sms.gc-message-read') # 所有的已读读短信消息
435445
# data = {'sms': [], 'voicemail': []}
@@ -438,8 +448,7 @@ def read_sms(self):
438448
if 'gc-message-sms' in attr: # sms
439449
sms = {}
440450
sms['id'] = msg['id']
441-
sms['number'] = msg.find(name='span', class_='gc-message-sms-from').text.strip()[
442-
:-1] # 去掉空格并切掉最后的冒号
451+
sms['number'] = msg.find(name='span', class_='gc-message-sms-from').text.strip()[:-1] # 去掉空格并切掉最后的冒号
443452
sms['text'] = msg.find(name='span', class_='gc-message-sms-text').text
444453
sms['time'] = msg.find(name='span', class_='gc-message-sms-time').text.strip()
445454
sms_list.append(sms)
@@ -451,10 +460,10 @@ def voicemail(self):
451460
获取未读的 voicemail, 包括文本和语音(下载url 地址)
452461
:return:
453462
'''
454-
par = {'v': self.__gc_data['v']} # token
463+
par = {'v': self._gc_data['v']} # token
455464
if self.status['login']:
456465
voice_list = []
457-
r = self.__requests(self.__dow_msg_url, params=par)
466+
r = self._requests(self.__dow_msg_url, params=par)
458467
data = self.__process_xml(r)
459468
msg_list = data['soup'].find_all(name='div', class_='gc-message-unread') # 所有的未读语音消息
460469
for msg in msg_list:
@@ -466,7 +475,7 @@ def voicemail(self):
466475
voicemail['number'] = msg.find(name='span', class_='gc-nobold').text
467476
voicemail['time'] = msg.find(name='span', class_='gc-message-time').text
468477
voicemail['text'] = msg.find(name='span', class_='gc-edited-trans-text').text
469-
voicemail['ogg_url'] = self.__voicemail_ogg_str.format(self.__gc_data['baseUrl'], voicemail['id'])
478+
voicemail['ogg_url'] = self.__voicemail_ogg_str.format(self._gc_data['baseUrl'], voicemail['id'])
470479

471480
if len(voicemail['text']) < 1:
472481
voicemail['text'] = '[None] - please go to the website...'
@@ -480,7 +489,7 @@ def dow_voicemail(self, url):
480489
:param url: voicemail 下载地址的url
481490
:return: r.content 二进制数据
482491
'''
483-
r = self.__requests(url)
492+
r = self._requests(url)
484493
return r.content
485494

486495
def quick_add(self, name, number, phone_type=0):
@@ -495,9 +504,9 @@ def quick_add(self, name, number, phone_type=0):
495504
if self.status['login']:
496505
data = {'phoneNumber': '+1%s' % number,
497506
'phoneType': phone_type_dict[phone_type],
498-
'_rnr_se': self.__gc_data['_rnr_se'],
507+
'_rnr_se': self._gc_data['_rnr_se'],
499508
'needsCheck': 1}
500-
r = self.__requests(self.__quick_add_url, data=data, method='post')
509+
r = self._requests(self.__quick_add_url, data=data, method='post')
501510
ret = r.json()
502511
if ret['ok']:
503512
return ret
@@ -514,8 +523,8 @@ def mark(self, msg_id, read=1):
514523
:return:
515524
'''
516525
if self.status['login']:
517-
data = {'_rnr_se': self.__gc_data['_rnr_se'], 'messages': msg_id, 'read': read}
518-
r = self.__requests(self.__mark_url, data=data, method='post')
526+
data = {'_rnr_se': self._gc_data['_rnr_se'], 'messages': msg_id, 'read': read}
527+
r = self._requests(self.__mark_url, data=data, method='post')
519528
ret = r.json()
520529
if ret['ok']:
521530
return ret
@@ -527,8 +536,8 @@ def mark(self, msg_id, read=1):
527536
def star(self, msg_id):
528537
''' 把信息标记为收藏 '''
529538
if self.status['login']:
530-
data = {'_rnr_se': self.__gc_data['_rnr_se'], 'messages': msg_id, 'star': 1}
531-
r = self.__requests(self.__star_url, data=data, method='post')
539+
data = {'_rnr_se': self._gc_data['_rnr_se'], 'messages': msg_id, 'star': 1}
540+
r = self._requests(self.__star_url, data=data, method='post')
532541
ret = r.json()
533542
if ret['ok']:
534543
return ret
@@ -540,8 +549,8 @@ def star(self, msg_id):
540549
def unstar(self, msg_id):
541550
''' 把已经标记收藏的消息取消收藏标记 '''
542551
if self.status['login']:
543-
data = {'_rnr_se': self.__gc_data['_rnr_se'], 'messages': msg_id, 'star': 0}
544-
r = self.__requests(self.__star_url, data=data, method='post')
552+
data = {'_rnr_se': self._gc_data['_rnr_se'], 'messages': msg_id, 'star': 0}
553+
r = self._requests(self.__star_url, data=data, method='post')
545554
ret = r.json()
546555
if ret['ok']:
547556
return ret
@@ -553,8 +562,8 @@ def unstar(self, msg_id):
553562
def del_msg(self, msg_id):
554563
''' 删除信息 '''
555564
if self.status['login']:
556-
data = {'_rnr_se': self.__gc_data['_rnr_se'], 'messages': msg_id, 'trash': 1}
557-
r = self.__requests(self.__del_msg_url, data=data, method='post')
565+
data = {'_rnr_se': self._gc_data['_rnr_se'], 'messages': msg_id, 'trash': 1}
566+
r = self._requests(self.__del_msg_url, data=data, method='post')
558567
ret = r.json()
559568
if ret['ok']:
560569
return ret
@@ -577,8 +586,8 @@ def send_sms(self, number, text):
577586
if self.status['login']:
578587
# 数据格式
579588
msg = {'id': None, 'phoneNumber': number, 'text': text, 'sendErrorSms': 0,
580-
'_rnr_se': self.__gc_data['_rnr_se']}
581-
r = self.__requests(self.__send_msg_url, method='post', data=msg) # post sms
589+
'_rnr_se': self._gc_data['_rnr_se']}
590+
r = self._requests(self._send_msg_url, method='post', data=msg) # post sms
582591
ret = r.json()
583592
if ret['ok']:
584593
return ret
@@ -596,11 +605,11 @@ def call(self, number):
596605
if self.status['login']:
597606
# 数据格式
598607
data = {'outgoingNumber': number, 'remember': 0, 'phoneType': self.__call_phone_for['type'],
599-
'subscriberNumber': self.__gc_data['number']['raw'],
608+
'subscriberNumber': self._gc_data['number']['raw'],
600609
'forwardingNumber': self.__call_phone_for['phoneNumber'],
601-
'_rnr_se': self.__gc_data['_rnr_se']}
610+
'_rnr_se': self._gc_data['_rnr_se']}
602611

603-
r = self.__requests(self.__call_url, data=data, method='post') # 拨打
612+
r = self._requests(self.__call_url, data=data, method='post') # 拨打
604613
ret = r.json()
605614
if ret['ok']:
606615
return ret
@@ -620,9 +629,9 @@ def cancel_call(self, call_id):
620629
data = {'outgoingNumber': None,
621630
'forwardingNumber': None,
622631
'cancelType': 'C2C',
623-
'_rnr_se': self.__gc_data['_rnr_se'],
632+
'_rnr_se': self._gc_data['_rnr_se'],
624633
'callId': call_id}
625-
r = self.__requests(self.__call_cancel_url, data=data, method='post')
634+
r = self._requests(self.__call_cancel_url, data=data, method='post')
626635
return r.json() # {"ok" : false}
627636
return
628637

@@ -647,14 +656,13 @@ def set_intervals(self, sec):
647656

648657
def set_match(self, data):
649658
'''设置匹配关键字,字典格式'''
650-
self.__match = data
659+
self._match = data
651660

652661
def __createInstance(self, module_name, class_name, *args, **kwargs):
653662
'''
654663
create user input browser object 动态导入浏览器浏览器类型模块
655664
:return: object
656665
'''
657-
from selenium import webdriver
658666

659667
headers = {'Accept': '*/*',
660668
'Accept-Encoding': 'gzip, deflate, sdch',
@@ -706,7 +714,7 @@ def screenshots(self, driver, sleep=None):
706714
if sleep:
707715
time.sleep(sleep)
708716
try:
709-
driver.save_screenshot("./%s.png" % (time.strftime("%Y-%m-%d %X", time.localtime())))
717+
driver.save_screenshot("./img/%s.png" % (time.strftime("%Y-%m-%d %X", time.localtime())))
710718
except Exception:
711719
pass
712720

@@ -716,5 +724,5 @@ def get_js(self, js_str):
716724

717725
def __del__(self):
718726
''' 退出模拟的浏览器 quit driver'''
719-
if isinstance(self.driver, type(None)):
727+
if not isinstance(self.driver, type(None)):
720728
self.driver.quit()

0 commit comments

Comments
 (0)