7 from requests_oauthlib
import OAuth1
10 MEDIA_ENDPOINT_URL
= 'https://upload.twitter.com/1.1/media/upload.json'
11 POST_TWEET_URL
= 'https://api.twitter.com/1.1/statuses/update.json'
13 CONSUMER_KEY
= 'your-consumer-key'
14 CONSUMER_SECRET
= 'your-consumer-secret'
15 ACCESS_TOKEN
= 'your-access-token'
16 ACCESS_TOKEN_SECRET
= 'your-access-secret'
18 VIDEO_FILENAME
= 'path/to/video/file'
21 oauth
= OAuth1(CONSUMER_KEY
,
22 client_secret
=CONSUMER_SECRET
,
23 resource_owner_key
=ACCESS_TOKEN
,
24 resource_owner_secret
=ACCESS_TOKEN_SECRET
)
27 class VideoTweet(object):
29 def __init__(self
, file_name
):
31 Defines video tweet properties
33 self
.video_filename
= file_name
34 self
.total_bytes
= os
.path
.getsize(self
.video_filename
)
36 self
.processing_info
= None
39 def upload_init(self
):
47 'media_type': 'video/mp4',
48 'total_bytes': self
.total_bytes
,
49 'media_category': 'tweetvideo'
52 req
= requests
.post(url
=MEDIA_ENDPOINT_URL
, data
=request_data
, auth
=oauth
)
53 media_id
= req
.json()['media_id']
55 self
.media_id
= media_id
57 print('Media ID: %s' % str(media_id
))
60 def upload_append(self
):
62 Uploads media in chunks and appends to chunks uploaded
66 file = open(self
.video_filename
, 'rb')
68 while bytes_sent
< self
.total_bytes
:
69 chunk
= file.read(4*1024*1024)
75 'media_id': self
.media_id
,
76 'segment_index': segment_id
83 req
= requests
.post(url
=MEDIA_ENDPOINT_URL
, data
=request_data
, files
=files
, auth
=oauth
)
85 if req
.status_code
< 200 or req
.status_code
> 299:
86 print(req
.status_code
)
90 segment_id
= segment_id
+ 1
91 bytes_sent
= file.tell()
93 print('%s of %s bytes uploaded' % (str(bytes_sent
), str(self
.total_bytes
)))
95 print('Upload chunks complete.')
98 def upload_finalize(self
):
100 Finalizes uploads and starts video processing
105 'command': 'FINALIZE',
106 'media_id': self
.media_id
109 req
= requests
.post(url
=MEDIA_ENDPOINT_URL
, data
=request_data
, auth
=oauth
)
112 self
.processing_info
= req
.json().get('processing_info', None)
116 def check_status(self
):
118 Checks video processing status
120 if self
.processing_info
is None:
123 state
= self
.processing_info
['state']
125 print('Media processing status is %s ' % state
)
127 if state
== u
'succeeded':
130 if state
== u
'failed':
133 check_after_secs
= self
.processing_info
['check_after_secs']
135 print('Checking after %s seconds' % str(check_after_secs
))
136 time
.sleep(check_after_secs
)
142 'media_id': self
.media_id
145 req
= requests
.get(url
=MEDIA_ENDPOINT_URL
, params
=request_params
, auth
=oauth
)
147 self
.processing_info
= req
.json().get('processing_info', None)
153 Publishes Tweet with attached video
156 'status': 'I just uploaded a video with the @TwitterAPI.',
157 'media_ids': self
.media_id
160 req
= requests
.post(url
=POST_TWEET_URL
, data
=request_data
, auth
=oauth
)
164 if __name__
== '__main__':
165 videoTweet
= VideoTweet(VIDEO_FILENAME
)
166 videoTweet
.upload_init()
167 videoTweet
.upload_append()
168 videoTweet
.upload_finalize()