Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| import os | |
| import sys | |
| import time | |
| import json | |
| import requests | |
| from requests_oauthlib import OAuth1 | |
| MEDIA_ENDPOINT_URL = 'https://upload.twitter.com/1.1/media/upload.json' | |
| POST_TWEET_URL = 'https://api.twitter.com/1.1/statuses/update.json' | |
| CONSUMER_KEY = 'your-consumer-key' | |
| CONSUMER_SECRET = 'your-consumer-secret' | |
| ACCESS_TOKEN = 'your-access-token' | |
| ACCESS_TOKEN_SECRET = 'your-access-secret' | |
| VIDEO_FILENAME = 'path/to/video/file' | |
| oauth = OAuth1(CONSUMER_KEY, | |
| client_secret=CONSUMER_SECRET, | |
| resource_owner_key=ACCESS_TOKEN, | |
| resource_owner_secret=ACCESS_TOKEN_SECRET) | |
| class VideoTweet(object): | |
| def __init__(self, file_name): | |
| ''' | |
| Defines video tweet properties | |
| ''' | |
| self.video_filename = file_name | |
| self.total_bytes = os.path.getsize(self.video_filename) | |
| self.media_id = None | |
| self.processing_info = None | |
| def upload_init(self): | |
| ''' | |
| Initializes Upload | |
| ''' | |
| print('INIT') | |
| request_data = { | |
| 'command': 'INIT', | |
| 'media_type': 'video/mp4', | |
| 'total_bytes': self.total_bytes, | |
| 'media_category': 'tweet_video' | |
| } | |
| req = requests.post(url=MEDIA_ENDPOINT_URL, data=request_data, auth=oauth) | |
| media_id = req.json()['media_id'] | |
| self.media_id = media_id | |
| print('Media ID: %s' % str(media_id)) | |
| def upload_append(self): | |
| ''' | |
| Uploads media in chunks and appends to chunks uploaded | |
| ''' | |
| segment_id = 0 | |
| bytes_sent = 0 | |
| file = open(self.video_filename, 'rb') | |
| while bytes_sent < self.total_bytes: | |
| chunk = file.read(4*1024*1024) | |
| print('APPEND') | |
| request_data = { | |
| 'command': 'APPEND', | |
| 'media_id': self.media_id, | |
| 'segment_index': segment_id | |
| } | |
| files = { | |
| 'media':chunk | |
| } | |
| req = requests.post(url=MEDIA_ENDPOINT_URL, data=request_data, files=files, auth=oauth) | |
| if req.status_code < 200 or req.status_code > 299: | |
| print(req.status_code) | |
| print(req.text) | |
| sys.exit(0) | |
| segment_id = segment_id + 1 | |
| bytes_sent = file.tell() | |
| print('%s of %s bytes uploaded' % (str(bytes_sent), str(self.total_bytes))) | |
| print('Upload chunks complete.') | |
| def upload_finalize(self): | |
| ''' | |
| Finalizes uploads and starts video processing | |
| ''' | |
| print('FINALIZE') | |
| request_data = { | |
| 'command': 'FINALIZE', | |
| 'media_id': self.media_id | |
| } | |
| req = requests.post(url=MEDIA_ENDPOINT_URL, data=request_data, auth=oauth) | |
| print(req.json()) | |
| self.processing_info = req.json().get('processing_info', None) | |
| self.check_status() | |
| def check_status(self): | |
| ''' | |
| Checks video processing status | |
| ''' | |
| if self.processing_info is None: | |
| return | |
| state = self.processing_info['state'] | |
| print('Media processing status is %s ' % state) | |
| if state == u'succeeded': | |
| return | |
| if state == u'failed': | |
| sys.exit(0) | |
| check_after_secs = self.processing_info['check_after_secs'] | |
| print('Checking after %s seconds' % str(check_after_secs)) | |
| time.sleep(check_after_secs) | |
| print('STATUS') | |
| request_params = { | |
| 'command': 'STATUS', | |
| 'media_id': self.media_id | |
| } | |
| req = requests.get(url=MEDIA_ENDPOINT_URL, params=request_params, auth=oauth) | |
| self.processing_info = req.json().get('processing_info', None) | |
| self.check_status() | |
| def tweet(self): | |
| ''' | |
| Publishes Tweet with attached video | |
| ''' | |
| request_data = { | |
| 'status': 'I just uploaded a video with the @TwitterAPI.', | |
| 'media_ids': self.media_id | |
| } | |
| req = requests.post(url=POST_TWEET_URL, data=request_data, auth=oauth) | |
| print(req.json()) | |
| if __name__ == '__main__': | |
| videoTweet = VideoTweet(VIDEO_FILENAME) | |
| videoTweet.upload_init() | |
| videoTweet.upload_append() | |
| videoTweet.upload_finalize() | |
| videoTweet.tweet() |