]> jfr.im git - z_archive/twitter.git/commitdiff
Handle media uploads to upload.twitter.com/1.1/media/upload.json
authorMike Verdone <redacted>
Mon, 20 Oct 2014 22:45:37 +0000 (00:45 +0200)
committerMike Verdone <redacted>
Mon, 20 Oct 2014 22:45:37 +0000 (00:45 +0200)
tests/test_sanity.py
twitter/api.py
twitter/twitter_globals.py

index 941ad6afb991ac9618b522f256fafc382974ccf8..679098beb908f73bdf2181061b885ad3304c8c06 100644 (file)
@@ -19,6 +19,9 @@ twitter11 = Twitter(domain='api.twitter.com',
                     auth=oauth,
                     api_version='1.1')
 
+twitter_upl = Twitter(domain='upload.twitter.com',
+                      auth=oauth)
+
 twitter11_na = Twitter(domain='api.twitter.com',
                        auth=noauth,
                        api_version='1.1')
@@ -55,14 +58,16 @@ def clean_link(text):
 __location__ = os.path.realpath(
     os.path.join(os.getcwd(), os.path.dirname(__file__)))
 
+def _img_data():
+    return open(os.path.join(__location__, "test.png"), "rb").read()
+
 def test_API_set_unicode_twitpic(base64=False):
     random_tweet = "A random twitpic from %s with unicode üøπ" % \
                     ("base64" if base64 else "file") + get_random_str()
     if base64:
         img = b"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94JFhMBAJv5kaUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAA4UlEQVQoz7WSIZLGIAxG6c5OFZjianBcIOfgPkju1DsEBWfAUEcNGGpY8Xe7dDoVFRvHfO8NJGRorZE39UVe1nd/WNfVObcsi3OOEAIASikAmOf5D2q/FWPUWgshKKWfiFIqhNBaxxhPjPQ05/z+Bs557xw9hBC89ymlu5BS8t6HEC5NW2sR8alRRLTWXoRSSinlSejT12M9BAAAgCeoTw9BSimlfBIu6WdYtVZEVErdaaUUItZaL/9wOsaY83YAMMb0dGtt6Jdv3/ec87ZtOWdCCGNsmibG2DiOJzP8+7b+AAOmsiPxyHWCAAAAAElFTkSuQmCC"
     else:
-        with open(os.path.join(__location__, "test.png"), "rb") as f:
-            img = f.read()
+        img = _img_data()
     params = {"status": random_tweet, "media[]": img}
     if base64:
         params["_base64"] = True
@@ -76,6 +81,10 @@ def test_API_set_unicode_twitpic(base64=False):
 def test_API_set_unicode_twitpic_base64():
     test_API_set_unicode_twitpic(base64=True)
 
+def test_upload_media():
+    res = twitter_upl.media.upload(media=_img_data())
+    assert res
+    assert res["media_id"]
 
 def test_search():
     # In 1.1, search works on api.twitter.com not search.twitter.com
index 059bb62f9f35eaf46eda7c860b5b127bb67921c2..6259e1f847811663725f88a629dfd970389631c3 100644 (file)
@@ -175,9 +175,13 @@ class TwitterCall(object):
         # Build the uri.
         uriparts = []
         for uripart in self.uriparts:
-            # If this part matches a keyword argument, use the
-            # supplied value otherwise, just use the part.
-            uriparts.append(str(kwargs.pop(uripart, uripart)))
+            # If this part matches a keyword argument (starting with _), use
+            # the supplied value. Otherwise, just use the part.
+            if uripart.startswith("_"):
+                part = (str(kwargs.pop(uripart, uripart)))
+            else:
+                part = uripart
+            uriparts.append(uripart)
         uri = '/'.join(uriparts)
 
         method = kwargs.pop('_method', None) or method_for_uri(uri)
@@ -207,23 +211,22 @@ class TwitterCall(object):
             secure_str, self.domain, uri, dot, self.format)
 
         # Check if argument tells whether img is already base64 encoded
-        b64_convert = True
-        if "_base64" in kwargs:
-            b64_convert = not kwargs.pop("_base64")
+        b64_convert = not kwargs.pop("_base64", False)
         if b64_convert:
             import base64
 
         # Catch media arguments to handle oauth query differently for multipart
         media = None
-        for arg in ['media[]']:
-            if arg in kwargs:
-                media = kwargs.pop(arg)
-                if b64_convert:
-                    media = base64.b64encode(media)
-                if sys.version_info >= (3, 0):
-                    media = str(media, 'utf8')
-                mediafield = arg
-                break
+        if 'media' in kwargs:
+            mediafield = 'media'
+            media = kwargs.pop('media')
+        elif 'media[]' in kwargs:
+            mediafield = 'media[]'
+            media = kwargs.pop('media[]')
+            if b64_convert:
+                media = base64.b64encode(media)
+            if sys.version_info >= (3, 0):
+                media = str(media, 'utf8')
 
         # Catch media arguments that are not accepted through multipart
         # and are not yet base64 encoded
@@ -248,30 +251,28 @@ class TwitterCall(object):
 
         # Handle query as multipart when sending media
         if media:
-            BOUNDARY = "###Python-Twitter###"
+            BOUNDARY = b"###Python-Twitter###"
             bod = []
-            bod.append('--' + BOUNDARY)
+            bod.append(b'--' + BOUNDARY)
             bod.append(
-                'Content-Disposition: form-data; name="%s"' % mediafield)
-            bod.append('Content-Transfer-Encoding: base64')
-            bod.append('')
+                b'Content-Disposition: form-data; name="%s"' % mediafield.encode('utf-8'))
+            bod.append(b'Content-Transfer-Encoding: base64')
+            bod.append(b'')
             bod.append(media)
             for k, v in kwargs.items():
-                bod.append('--' + BOUNDARY)
-                bod.append('Content-Disposition: form-data; name="%s"' % k)
-                bod.append('')
-                if sys.version_info[:2] <= (2, 7):
-                    try:
-                        v = v.decode("utf-8")
-                    except:
-                        pass
+                if sys.version_info < (3, 0):
+                    k = k.encode("utf-8")
+                    v = v.encode("utf-8")
+                bod.append(b'--' + BOUNDARY)
+                bod.append(b'Content-Disposition: form-data; name="%s"' % k)
+                bod.append(b'')
                 bod.append(v)
-            bod.append('--' + BOUNDARY + '--')
-            body = '\r\n'.join(bod).encode('utf8')
+            bod.append(b'--' + BOUNDARY + b'--')
+            body = b'\r\n'.join(bod)
             headers['Content-Type'] = \
                 'multipart/form-data; boundary=%s' % BOUNDARY
 
-            if sys.version_info[:2] <= (2, 7):
+            if sys.version_info < (3, 0):
                 uriBase = uriBase.encode("utf-8")
                 for k in headers:
                     headers[k.encode('utf-8')] = headers.pop(k)
index 6bcc52c533ab0ffbddbb2f349b7ce3a53598cc6d..da6542bc338a61308a2d987f78015ff7b38e8d6e 100644 (file)
@@ -38,4 +38,7 @@ POST_ACTIONS = [
     # OAuth Methods
     'token', 'access_token',
     'request_token', 'invalidate_token',
+
+    # Upload Methods
+    'media/upload',
 ]