I have been able to successfully post status updates with images attached. I am using C#/.NET with a REST framework called Hammock. First, I upload the images to upload.twitter.com/1.1/media/upload.json and get media_ids back. Then, I make a request to api.twitter.com/1.1/statuses/update.json with the media_ids parameter. This works fine except that occassionally, with larger images, Twitter responds to my status update request with the following JSON:
{“errors”:[{“code”:324,“message”:“The validation of media ids failed.”}]}
I have tried waiting several minutes between the time of media upload and status update with no success. It would be nice if Twitter would put 324 on their list of error codes here: https://dev.twitter.com/overview/api/response-codes
It would also be a solid idea to not respond with an HTTP 200 as well as a media_id if the image is too large. I have since baked in additional logic to do a lookup to /help/configuration.json to determine the max image size. I no longer allow images larger than that to be attached to Tweets in my application, and the problem is going away. However, I still believe this particular error response should be documented properly.
Here are the exact (except for sensitive values being xxxx’d out) requests/responses seen in Fiddler:
Media Upload Request
POST https://upload.twitter.com/1.1/media/upload.json HTTP/1.1
Authorization: OAuth oauth_consumer_key=“xxxxxxxxxxx”,oauth_nonce=“xxxxxxxxxxx”,oauth_signature=“xxxxxxxxx”,oauth_signature_method=“HMAC-SHA1”,oauth_timestamp=“1418763417”,oauth_token=“xxxxxxxxxx”,oauth_version="1.0a"
Content-Type: multipart/form-data; boundary=5fb9e9e7-25cf-49fd-b5ef-61aefed2897e
Host: upload.twitter.com
Content-Length: 2399916
–5fb9e9e7-25cf-49fd-b5ef-61aefed2897e
Content-Disposition: form-data; name=“media”; filename="d1cd395d-bebf-4733-aedc-680327ef63ec"
Content-Type: image/jpeg
Media Upload Response
HTTP/1.1 200 OK
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
content-length: 140
content-type: application/json;charset=utf-8
date: Tue, 16 Dec 2014 20:56:57 UTC
expires: Tue, 31 Mar 1981 05:00:00 GMT
expires: Tue, 16 Dec 2014 21:56:57 GMT
last-modified: Tue, 16 Dec 2014 20:56:57 GMT
pragma: no-cache
server: tsa_b
set-cookie: lang=en
set-cookie: guest_id=v1%xxxxxxxx; Domain=.twitter.com; Path=/; Expires=Thu, 15-Dec-2016 20:56:57 UTC
status: 200 OK
strict-transport-security: max-age=631138519
x-access-level: read-write
x-connection-hash: xxxxxxxxxxx
x-frame-options: SAMEORIGIN
x-response-time: 344
x-transaction: xxxxxxxxx
x-xss-protection: 1; mode=block
{“media_id”:544959385899122689,“media_id_string”:“544959385899122689”,“size”:4311817,“image”:{“w”:3000,“h”:2350,“image_type”:“image/jpeg”}}
Status Update Request
POST https://api.twitter.com/1.1/statuses/update.json HTTP/1.1
Authorization: OAuth oauth_consumer_key=“xxxxxxxxxx”,oauth_nonce=“xxxxx”,oauth_signature=“xxxxxxxxxxxx”,oauth_signature_method=“HMAC-SHA1”,oauth_timestamp=“1418763469”,oauth_token=“xxxxxxxxxxx”,oauth_version="1.0a"
Content-Type: application/x-www-form-urlencoded
Host: api.twitter.com
Content-Length: 117
status=test%20test%20test&media_ids=544959385899122689%2C544959443889557504%2C544959458036957184%2C544959545941192705
Status Update Response
HTTP/1.1 400 Bad Request
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
content-length: 73
content-type: application/json;charset=utf-8
date: Tue, 16 Dec 2014 20:57:49 UTC
expires: Tue, 31 Mar 1981 05:00:00 GMT
last-modified: Tue, 16 Dec 2014 20:57:49 GMT
pragma: no-cache
server: tsa_b
set-cookie: lang=en
set-cookie: guest_id=xxxxxx; Domain=.twitter.com; Path=/; Expires=Thu, 15-Dec-2016 20:57:49 UTC
status: 400 Bad Request
strict-transport-security: max-age=631138519
x-access-level: read-write
x-connection-hash: xxxxxxxx
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-response-time: 44
x-transaction: xxxxxxx
x-xss-protection: 1; mode=block
{“errors”:[{“code”:324,“message”:“The validation of media ids failed.”}]}