0
img_url = 'https://upload.twitter.com/1.1/media/upload.json'
auth = OAuth1('',
              '',
              '',
              '')

file = open('test.png', 'rb')
binary_data = file.read()
file.close()

img_data = requests.post(img_url, auth = auth, params = {'media': binary_data})
print(img_data)

returns

Response [400]

Note that posting a normal text status update via https://api.twitter.com/1.1/statuses/update.json works just fine so I assume the bad request doesn't lie in the authorization. I have also tried encoding the image in base 64 then passing that to the 'media_data' parameter which also returned the same response.
So far I've been following the official api reference on https://dev.twitter.com/rest/reference/post/media/upload

  • 1
    Check your post is either multipart/form-data or application/x-www-form-urlencoded. Try adding a 'content-type': 'application/x-www-form-urlencoded' header to your request. Source: https://dev.twitter.com/rest/reference/post/media/upload. Possible implementation example: https://stackoverflow.com/questions/9733638/post-json-using-python-requests – BoboDarph Jul 14 '17 at 12:25
  • There's a good sample for this in Python available on TwitterDev's github https://github.com/twitterdev/large-video-upload-python/blob/master/async-upload.py – Andy Piper Jul 14 '17 at 14:27

1 Answers1

1
upload_media.py
#!/usr/bin/env python
# coding: utf-8

import json
from requests_oauthlib import OAuth1Session

CK = 'XXXXXXXXXXXXXXXXXXXXXX'                             # Consumer Key
CS = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'         # Consumer Secret
AT = 'XXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # Access Token
AS = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'         # Accesss Token Secert

url_media = "https://upload.twitter.com/1.1/media/upload.json"
url_text = "https://api.twitter.com/1.1/statuses/update.json"

twitter = OAuth1Session(CK, CS, AT, AS)

files = {"media" : open('image.jpg', 'rb')}
req_media = twitter.post(url_media, files = files)

if req_media.status_code != 200:
    print ("image app fail: %s", req_media.text)
    exit()

media_id = json.loads(req_media.text)['media_id']
print ("Media ID: %d" % media_id)

params = {'status': 'image test', "media_ids": [media_id]}
req_media = twitter.post(url_text, params = params)

if req_media.status_code != 200:
    print ("text app fail: %s", req_text.text)
    exit()

print ("OK")

You can do it this way!

Sahil
  • 1,387
  • 14
  • 41