Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Direct Message with Media #448

Open
HappyRobotProject opened this issue Aug 3, 2017 · 5 comments
Open

Direct Message with Media #448

HappyRobotProject opened this issue Aug 3, 2017 · 5 comments

Comments

@HappyRobotProject
Copy link

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?

@michaelhelmick
Copy link
Collaborator

michaelhelmick commented Aug 4, 2017

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
Copy link
Collaborator

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.

@BarlowHall
Copy link

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

@gabe-camp
Copy link

gabe-camp commented Mar 18, 2018

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.

@rjallbert
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants