+#!/usr/bin/python
+
+# DialCentral - Front end for Google's Grand Central service.
+# Copyright (C) 2008 Eric Warnke ericew AT gmail DOT com
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
import urllib2
import time
import warnings
+import traceback
from xml.etree import ElementTree
from browser_emu import MozillaEmulator
-import socket
-
try:
import simplejson
except ImportError:
simplejson = None
-socket.setdefaulttimeout(5)
-
_TRUE_REGEX = re.compile("true")
_FALSE_REGEX = re.compile("false")
return safe_eval(flattened)
else:
def parse_json(flattened):
- return simplejson.loads(json)
+ return simplejson.loads(flattened)
class GVDialer(object):
try:
inboxPage = self._browser.download(self._inboxURL)
except urllib2.URLError, e:
+ warnings.warn(traceback.format_exc())
raise RuntimeError("%s is not accesible" % self._inboxURL)
self._browser.cookies.save()
if self._isNotLoginPageRe.search(inboxPage) is not None:
return False
+ self._grab_account_info()
self._lastAuthed = time.time()
return True
Attempt to login to grandcentral
@returns Whether login was successful or not
"""
- #if self.is_authed():
- # return True
+ if self.is_authed():
+ return True
loginPostData = urllib.urlencode({
'Email' : username,
try:
loginSuccessOrFailurePage = self._browser.download(self._loginURL, loginPostData)
except urllib2.URLError, e:
+ warnings.warn(traceback.format_exc())
raise RuntimeError("%s is not accesible" % self._loginURL)
- #self._grab_account_info(loginSuccessOrFailurePage)
- self._grab_account_info()
return self.is_authed()
def logout(self):
}
callSuccessPage = self._browser.download(self._clicktocallURL, clickToCallData, None, otherData)
except urllib2.URLError, e:
+ warnings.warn(traceback.format_exc())
raise RuntimeError("%s is not accesible" % self._clicktocallURL)
if self._gvDialingStrRe.search(callSuccessPage) is None:
try:
callbackSetPage = self._browser.download(self._setforwardURL, callbackPostData)
except urllib2.URLError, e:
+ warnings.warn(traceback.format_exc())
raise RuntimeError("%s is not accesible" % self._setforwardURL)
self._browser.cookies.save()
try:
allRecentData = self._grab_json(url)
except urllib2.URLError, e:
+ warnings.warn(traceback.format_exc())
raise RuntimeError("%s is not accesible" % self._clicktocallURL)
for recentCallData in allRecentData["messages"].itervalues():
try:
contactsPage = self._browser.download(contactsPageUrl)
except urllib2.URLError, e:
+ warnings.warn(traceback.format_exc())
raise RuntimeError("%s is not accesible" % self._clicktocallURL)
for contact_match in self._contactsRe.finditer(contactsPage):
contactId = contact_match.group(1)
try:
detailPage = self._browser.download(self._contactDetailURL + '/' + contactId)
except urllib2.URLError, e:
+ warnings.warn(traceback.format_exc())
raise RuntimeError("%s is not accesible" % self._clicktocallURL)
for detail_match in self._contactDetailPhoneRe.finditer(detailPage):
jsonTree = parse_json(flatJson)
return jsonTree
- def _grab_account_info(self, loginPage = None):
- if loginPage is None:
- accountNumberPage = self._browser.download(self._accountNumberURL)
- else:
- accountNumberPage = loginPage
- tokenGroup = self._tokenRe.search(accountNumberPage)
- if tokenGroup is not None:
- self._token = tokenGroup.group(1)
- anGroup = self._accountNumRe.search(accountNumberPage)
- if anGroup is not None:
- self._accountNum = anGroup.group(1)
-
- callbackPage = self._browser.download(self._forwardURL)
+ def _grab_account_info(self):
+ page = self._browser.download(self._forwardURL)
+
+ tokenGroup = self._tokenRe.search(page)
+ if tokenGroup is None:
+ raise RuntimeError("Could not extract authentication token from GoogleVoice")
+ self._token = tokenGroup.group(1)
+
+ anGroup = self._accountNumRe.search(page)
+ if anGroup is None:
+ raise RuntimeError("Could not extract account number from GoogleVoice")
+ self._accountNum = anGroup.group(1)
+
self._callbackNumbers = {}
- for match in self._callbackRe.finditer(callbackPage):
- self._callbackNumbers[match.group(2)] = match.group(1)
- if len(self._callbackNumber) == 0:
- self.set_sane_callback()
+ for match in self._callbackRe.finditer(page):
+ callbackNumber = match.group(2)
+ callbackName = match.group(1)
+ self._callbackNumbers[callbackNumber] = callbackName
def test_backend(username, password):
print "Token: ", backend._token
print "Account: ", backend.get_account_number()
print "Callback: ", backend.get_callback_number()
- # print "All Callback: ",
- # pprint.pprint(backend.get_callback_numbers())
+ print "All Callback: ",
+ pprint.pprint(backend.get_callback_numbers())
# print "Recent: ",
# pprint.pprint(list(backend.get_recent()))
# print "Contacts: ",