Ошибка загрузки изображения в Twitter: отсутствует параметр медиа

В новом твиттере медиа загрузки api сказано

Сначала используйте файлы в формате POST multipart/form-data или base64 для https://upload.twitter.com/1.1/media/upload.json.

но получаю ошибку: код 38 "параметр медиа отсутствует."

вот мой код

var Twitter = require('./twitter.js');
var request = require('request');
var fs = require('fs');
var path = require('path');
var FormData = require('form-data');
var utf8 = require('utf8');
var base64_encode = require('base64').encode;

var oauth = {
    consumer_key: '',
    consumer_secret: '',
    token: '',
    token_secret: ''
};

var form = new FormData();
fs.readFile(__dirname + '/image.jpg', function(err, data) {
    if (err) {
        throw err;
    }
    var encoded = base64_encode(data);
    form.append('media[]', encoded); // I've also tried media instead of media[]
    form.getLength(function(err, length) {
        var r = request.post({
            url: 'https://upload.twitter.com/1.1/media/upload.json',
            oauth: oauth,
        }, function(error, response, body) {
            if (error) {
                console.error(error);
                return;
            }
            console.dir(body);
        });
        r._form = form;
        r.setHeader('content-length', length);
    });
});

Я повторно использую код из этой темы: Загрузка изображений в Twitter API из node.js

Любое предложение? Спасибо

2 ответа

Решение

Вот что я использую для загрузки медиа:
(Я использую только OAuth для создания аутентификации Oauth)
Я также добавляю /statuses/update.json, чтобы связать новое сообщение с вашими СМИ.

var oauth = require('oauth');
var fs = require('fs');

var a = new oauth.OAuth("https://twitter.com/oauth/request_token",
    "https://twitter.com/oauth/access_token",
    config.consumerKey,
    config.consumerSecret,
    "1.0",
    config.callbackUrl,
    "HMAC-SHA1");

a.post("https://upload.twitter.com/1.1/media/upload.json", oauth_access_token, oauth_access_token_secret, {media:fs.readFileSync(file_path).toString("base64")} ,"" , function (e, data, res){
    if (e) {
        console.error(e);
    }else {
        try{
            data = JSON.parse(data);
        }catch (e){
            console.error("Error Json : " + e);
        }
        console.log(data.media_id);

        a.post("https://api.twitter.com/1.1/statuses/update.json", oauth_access_token, oauth_access_token_secret, {status:message,media_ids:[data.media_id_string]}, "", function (e, data, res){
            if (e) {
                console.error(e);
            }else {
                console.log("Success");
            }
        });
    }
});

Повеселись

PHP решение

Библиотеки взяты отсюда: https://github.com/abraham/twitteroauth Проверьте ограничение изображения здесь: https://dev.twitter.com/rest/reference/get/help/configuration

Проблема заключается в отправке данных base64_encode и размера, не превышающего ограничение изображения (по умолчанию 3 МБ), в противном случае вы получите сообщение "не распознано". ошибка.

Вот код (только для загрузки изображений), который работал для меня: require_once('includes/twitter/twitteroauth.php');

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_SECRET);

$filePath = '/absolute path to the file/';
$url = 'https://upload.twitter.com/1.1/media/upload.json';
$method = 'POST';
$parameters = array(
    'media' => base64_encode(file_get_contents($filePath)),
);
$request = OAuthRequest::from_consumer_and_token($connection->consumer, $connection->token, $method, $url, $parameters);
$request->sign_request($connection->sha1_method, $connection->consumer, $connection->token);

$response = $connection->http($request->get_normalized_http_url(), $method, $request->to_postdata());
if ($connection->format === 'json' && $connection->decode_json) {
    $response = json_decode($response);
}
print_r($response);
Другие вопросы по тегам