如何使用带节点的POST media/upload (chunked)端点将视频上传到Twitter?
答案 0 :(得分:6)
这将完成以上链接中列出的所有步骤:INIT,APPEND,FINALIZE和STATUS
var bufferLength, filePath, finished, fs, oauthCredentials, offset, request, segment_index, theBuffer;
request = require('request');
fs = require('fs');
filePath = '/thevideo.mp4';
bufferLength = 1000000;
theBuffer = new Buffer(bufferLength);
offset = 0;
segment_index = 0;
finished = 0;
oauthCredentials = {
consumer_key: '',
consumer_secret: '',
token: '',
token_secret: ''
};
fs.stat(filePath, function(err, stats) {
var formData, normalAppendCallback, options;
formData = {
command: "INIT",
media_type: 'video/mp4',
total_bytes: stats.size
};
options = {
url: 'https://upload.twitter.com/1.1/media/upload.json',
oauth: oauthCredentials,
formData: formData
};
normalAppendCallback = function(media_id) {
return function(err, response, body) {
finished++;
if (finished === segment_index) {
options.formData = {
command: 'FINALIZE',
media_id: media_id
};
request.post(options, function(err, response, body) {
console.log('FINALIZED',response.statusCode,body);
delete options.formData;
//Note: This is not working as expected yet.
options.qs = {
command: 'STATUS',
media_id: media_id
};
request.get(options, function(err, response, body) {
console.log('STATUS: ', response.statusCode, body);
});
});
}
};
};
request.post(options, function(err, response, body) {
var media_id;
media_id = JSON.parse(body).media_id_string;
fs.open(filePath, 'r', function(err, fd) {
var bytesRead, data;
while (offset < stats.size) {
bytesRead = fs.readSync(fd, theBuffer, 0, bufferLength, null);
data = bytesRead < bufferLength ? theBuffer.slice(0, bytesRead) : theBuffer;
options.formData = {
command: "APPEND",
media_id: media_id,
segment_index: segment_index,
media_data: data.toString('base64')
};
request.post(options, normalAppendCallback(media_id));
offset += bufferLength;
segment_index++
}
});
});
});
答案 1 :(得分:1)
请试试这个
const splitFile = require('split-file');
var Twitter = require('twitter');
const pathToMovie = __dirname + '/test/152.mp4';
const mediaType = 'video/mp4'; // `'video/mp4'` is also supported
var mediaData, Names;
const mediaSize = require('fs').statSync(pathToMovie).size;
/*Twitter support Maximum 15MB video files. So we need to split this file in to three files */
splitFile.splitFile(pathToMovie, 3)
.then((names) => {
Names = names;
init();
})
.catch((err) => {
console.log('Error: ', err);
});
const client = new Twitter({
consumer_key: '<your consumer_key >',
consumer_secret: '<your consumer_secret >',
access_token_key: '<your access_token_key >',
access_token_secret: '<access_token_secret>'
});
function init() {
initTweetUpload(mediaSize, mediaType) // Declare that you wish to upload some media
.then(appendTweetUpload) // Send the data for the media
.then(appendTweetUpload) // Send the data for the media
.then(appendTweetUpload) // Send the data for the media
.then(finalizeTweetUpload) // Declare that you are done uploading chunks
.then(function(data) {
var status = {
media_ids: data,
status: 'From my node'
}
client.post('statuses/update', status, function(error, tweet, response) {
console.log(error)
console.log(tweet)
});
});
}
function initTweetUpload(mediaSize, mediaType) {
return makePost('media/upload', {
command: 'INIT',
total_bytes: mediaSize,
media_type: mediaType,
}).then(data => data.media_id_string);
}
var i = 0;
function appendTweetUpload(mediaId) {
var p = Names.shift();
/*mediaData is the raw binary file content being uploaded ,It must be <= 5 MB*/
const mediaData = require('fs').readFileSync(p);
return makePost('media/upload', {
command: 'APPEND',
media_id: mediaId,
media: mediaData,
segment_index: i++
}).then(data => mediaId);
}
function finalizeTweetUpload(mediaId) {
return makePost('media/upload', {
command: 'FINALIZE',
media_id: mediaId
}).then(data => mediaId);
}
function makePost(endpoint, params) {
// params.media_category = 'tweet_video';
return new Promise((resolve, reject) => {
client.post(endpoint, params, (error, data, response) => {
if (error) {
reject(error);
} else {
resolve(data);
}
});
});
}
依赖