Commits

Dusty Phillips committed edeb6df

Initial commit.

Comments (0)

Files changed (1)

+import requests
+import time
+import hashlib
+
+from urllib import urlencode
+
+
+class AstridAPI(object):
+    '''Class to connect to astrid and issue requests to a specific
+    user's account.'''
+
+    def __init__(self, conf):
+        '''Initialize the API. conf is a dictionary containing:
+        {
+            "apikey": "<astrid api key>",
+            "apisecret": "<astrid api secret>",
+            "email": "you@example.com", # your astrid e-mail
+            "password": "<astrid password>"
+        }
+        The apikey and secret can come from http://astrid.com/api_keys
+        assuming you have an account.
+
+        Automatically signs in the user associated with the username and
+        password provided in the configuration dictionary. The token received
+        from signin is stored
+        '''
+        self.server = 'https://astrid.com'
+        self.astrid_api_version = 7
+        self.apikey = conf['apikey']
+        self.apisecret = conf['apisecret']
+        try:
+            self.token = self.send_request("user_signin",
+                email=conf['email'],
+                provider="password",
+                secret=conf['password'])['token']
+        except KeyError:
+            raise AttributeError("Unable to sign into astrid. Ensure your "
+                "api key, api secret, email, and password are correct.")
+
+    def send_request(self, method, **params):
+        '''Send a request to the astrid API. The available methods and their
+        parameters are described in http://astrid.com/apidoc/ApiController.html
+
+        This method does the necessary work to create an astrid signature line
+        as required by the API. It then issues the request in the format Astrid
+        expects.
+
+        :param method: the method name to call in the Astrid API
+        :param params: keyword arguments mapping parameters to values as
+            required by the /method/
+        :return: json decoded response of your Astrid API request
+        :rtype: dict
+        '''
+        signature = []
+        params['app_id'] = self.apikey
+        params['time'] = time.time()
+        if hasattr(self, 'token'):
+            params['token'] = self.token
+        for param in sorted(params):
+            value = params[param]
+            if isinstance(value, list):
+                signature.extend([("%s[]%s" % (param, v)) for v in value])
+            else:
+                signature.append("%s%s" % (param, value))
+        sig = "%s%s%s" % (method, "".join(signature), self.apisecret)
+        sig = hashlib.md5(sig).hexdigest()
+        params['sig'] = sig
+
+        url = "%s/api/%s/%s?%s" % (
+            self.server,
+            self.astrid_api_version,
+            method,
+            urlencode(params))
+
+        return requests.post(url, data=params).json