twython icon indicating copy to clipboard operation
twython copied to clipboard

Direct Message with Media

Open HappyRobotProject opened this issue 8 years ago • 5 comments

Twitter now supports leaving a direct message with a media id

See https://dev.twitter.com/rest/reference/post/direct_messages/events/new and https://dev.twitter.com/rest/direct-messages/attaching-media

Using the api.post function doesn't seem to correctly handle a python dictionary that should be converted to a json object and sent with the post message.

Can you offer an example of the correct way to use api.post? or recommend a different approach?

HappyRobotProject avatar Aug 03 '17 13:08 HappyRobotProject

Looks like you can upload media or a video and then attach that media ID to the DM

from twython import Twython
twitter = Twython(APP_KEY, APP_SECRET,
                  OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

# video = open('/path/to/file/video.mp4', 'rb')
# response = twitter.upload_video(media=video, media_type='video/mp4', media_category='dm_video')

image = open('/path/to/file/image.jpg', 'rb')
response = twitter.upload_media(media=image ,media_type='image/jpeg', media_category='dm_image')

media_id = response['media_id_string']
params = {
    'event': {
        'type': 'message_create',
        'message_create': {
            'target': {
                'recipient_id': '844385345234',
            },
            'message_data': {
                'text': 'Check out this image!',
                'attachment': {
                    'type': 'media',
                    'media': {
                        'id': media_id,
                    }
                }
            }
        }
    }
}
twitter.post('direct_messages/events/new', params=params)

michaelhelmick avatar Aug 04 '17 14:08 michaelhelmick

If that doesn't work, let me know. Looks like there is a json parameter that can be sent using requests that will automatically json encode this for you.

michaelhelmick avatar Aug 04 '17 14:08 michaelhelmick

Hi, I've been trying to get this to work and not managed to so far. I've taken the example above and added my keys, tokens etc and the recipient. Has anyone got this working recently?

Any help appreciated.

Thanks

Neale

BarlowHall avatar Jan 30 '18 22:01 BarlowHall

I am trying the following

from twython import Twython

api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_TOKEN,ACCESS_SECRET)

photo = open('/path/to/image.jpg','rb')
response = api.upload_media(media=photo,media_type='image/jpeg',media_category='dm_image')
media_id = response['media_id_string']

response = api.lookup_user(screen_name='username')
recipient_id = response[0]['id']

params = {
        "event": {
                "type":"message_create",
                "message_create": {
                        "target": {
                                "recipient_id": str(recipient_id),
                        },
                        "message_data": {
                                "text":"Insert caption here",
                                "attachment": {
                                        "type":"media",
                                        "media" : {
                                                "id": str(media_id),
                                        }
                                }
                        }
                }
        }
}
response = api.post('direct_messages/events/new',params=params)

Unfortunately, I am getting back an error

Traceback (most recent call last): File "twitbot.py", line 47, in response = api.post('direct_messages/events/new',params=params) File "/usr/local/lib/python2.7/dist-packages/twython/api.py", line 268, in post return self.request(endpoint, 'POST', params=params, version=version) File "/usr/local/lib/python2.7/dist-packages/twython/api.py", line 258, in request api_call=url) File "/usr/local/lib/python2.7/dist-packages/twython/api.py", line 194, in _request retry_after=response.headers.get('X-Rate-Limit-Reset')) twython.exceptions.TwythonError: Twitter API returned a 422 (Unprocessable Entity), An error occurred processing your request.

gabe-camp avatar Mar 18 '18 23:03 gabe-camp

I came across this today, and the code above is ok, but before you call api.post() you need to do

import json params = json.dumps(params)

HTH

rjallbert avatar Aug 28 '18 18:08 rjallbert