Open HappyRobotProject opened 7 years ago
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)
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.
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
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.
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
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?