googlevoice не будет входить программно (Python)
Я получаю следующую трассировку ошибки, когда моя программа пытается войти в GoogleVoice (from googlevoice import Voice, util
отправлять смс сообщения.
File "C:\Users\ble1usb\Dropbox\Git\ers-dataanalyzzer\MainFrame.py", line 38, in call_mainframe
ah.compare_status() # compares current status with historical status. alerts alarm team if necessary
File "C:\Users\ble1usb\Dropbox\Git\ers-dataanalyzzer\alarm_handler.py", line 61, in compare_status
self.megaphone = megaphone.MegaPhone() # Am I going to have problems putting this here? I am getting relentless login fails due to the shitty googlevoice login
File "C:\Users\ble1usb\Dropbox\Git\ers-dataanalyzzer\megaphone.py", line 18, in __init__
self.voice.login(bl_google_credentials[0], bl_google_credentials[1])
File "C:\Python27\lib\site-packages\googlevoice\voice.py", line 70, in login
galx = re.search(r"name=\"GALX\"\s+value=\"(.+)\"", content).group(1)
AttributeError: 'NoneType' object has no attribute 'group'
Моя программа успешно работает в течение последних нескольких недель. Время от времени, вышеупомянутая ошибка генерировалась, и обработка ошибок просто повторяла попытку. Теперь у него не было успешного входа в систему в нескольких сотнях попыток.
Одна проблема, которая, на мой взгляд, может быть важной, заключается в том, что программа регистрировалась каждые десять (10) минут независимо от того, было ли отправлено SMS-сообщение (редкий случай, максимум каждые несколько дней).
В приведенной выше трассировке вы можете видеть, что я переместил вызов функции, которая выполняла вход в GoogleVoice, в цикл только в случае необходимости. Все еще возникают проблемы, потому что есть тревожное уведомление, которое необходимо отправить.
Я попытался войти и выйти из моей учетной записи Google, но безрезультатно.
Вот подсказка -> следующий код был скопирован из файла, указанного в последней строке трассировки (источник ошибки):
def login(self, email=None, passwd=None):
"""
Login to the service using your Google Voice account
Credentials will be propmpted for if not given as args or in the ``~/.gvoice`` config file
"""
if hasattr(self, '_special') and getattr(self, '_special'):
return self
if email is None:
email = config.email
if email is None:
email = input('Email address: ')
if passwd is None:
passwd = config.password
if passwd is None:
from getpass import getpass
passwd = getpass()
content = self.__do_page('login').read()
# holy hackjob
galx = re.search(r"name=\"GALX\"\s+value=\"(.+)\"", content).group(1)
self.__do_page('login', {'Email': email, 'Passwd': passwd, 'GALX': galx})
del email, passwd
try:
assert self.special
except (AssertionError, AttributeError):
raise LoginError
return self
Следует отметить, что
galx = re.search(r"name=\"GALX\"\s+value=\"(.+)\"", content).group(1)
является источником ошибки и что (это важно) строка сразу над ним говорит
# holy hackjob
Любой совет? кто-нибудь испытывал эту ошибку?
2 ответа
Я был в состоянии исправить проблему. Похоже, что Google сделал модификацию:
Патч здесь: http://pastebin.com/bxvNjj00
Или вы можете просто изменить voice.py и изменить строку, начинающуюся с galx =, на следующую:
galx = re.search (r "name = \" GALX \ "type = \" hidden \ "\ n * value = \" (. +) \ "", content).group (1)
Я не очень хорошо разбираюсь в регулярных выражениях, поэтому я переписал свой, чтобы нарезать кубики. В случае, если новая модификация прекратит работу в будущем, можно использовать оператор try кроме этого:
try:
galx = re.search(r"name=\"GALX\" type=\"hidden\"\n *value=\"(.+)\"", content).group(1)
except:
galx = ''.join(e for e in content if e.isalnum()) # Remove special characters (leaving only letters & numbers)
galx = galx[galx.index("GALX"):] # Grab everything from GALX forward
galx = galx[:galx.index("input")] # Truncate at input (first word after GALX value)
galx = galx[galx.index("value")+5:] # Extract GALX value