API Twitter возвращает «Неверный или просроченный токен». - PullRequest
1 голос
/ 15 апреля 2020

У меня есть простое приложение, которое не использует очень много пакетов. Так что я подумал, что это будет отличная возможность опробовать Deno, один пакет, который мне нужен, который не является сторонним модулем, - это API Twitter. Нет проблем, я думал, так как мне не нужно много функций, которые он включает. С таким же успехом я мог бы написать это сам!

Поэтому я написал функцию для генерации токена на предъявителя с помощью этого do c из документов Twitter:

function getOAuthBearer(consumer_key, consumer_secret) {
    const basic = Buffer.from(`${consumer_key}:${consumer_secret}`).toString('base64')
    const options = {
        url: 'https://api.twitter.com/oauth2/token',
        method: 'POST',
        headers: {
            'Authorization': `Basic ${basic}`,
            'Content-Type': `application/x-www-form-urlencoded;charset=UTF-8`
        },
        body: querystring.stringify({
            'grant_type': 'client_credentials'
        })
    };

    return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
            if (error) reject(error);
            else resolve(JSON.parse(body).access_token);
        });  
    });
}

Который работает! Я получил токен на предъявителя, поэтому я написал функцию для извлечения некоторой user_timeline информации из примера запроса из этого do c

function getUserTimeline(bearer_token) {
    const options = {
        url: 'https://api.twitter.com//1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi',
        method: 'GET',
        headers: {
            'Authorization': 'Bearer ' + Buffer.from(bearer_token).toString('base64'),
        }
    }

    return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
            if (error) reject(error);
            else resolve(JSON.parse(body));
        });  
    });
}

, которая возвращает это:

{ошибки: [{код: 89, сообщение: «Неверный или просроченный токен». }]}

Что странно, но я подумал, что могу сделать недействительным носитель и запросить новый, для которого я написал эту функцию:

function invalideOAuthBearer(consumer_key, consumer_secret, bearer_token) {
    const basic = Buffer.from(`${consumer_key}:${consumer_secret}`).toString('base64');
    const options = {
        url: 'https://api.twitter.com/oauth2/invalidate_token',
        method: 'POST',
        headers: {
            'Authorization': `Basic ${basic}`,
            'Content-Type': `application/x-www-form-urlencoded;charset=UTF-8`
        },
        body: querystring.stringify({
            'access_token': bearer_token
        })
    };

    return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
            if (error) reject(error);
            else resolve(JSON.parse(body));
        });  
    });
}

Но это возвращает:

{error: [{code: 348, сообщение: «Клиентскому приложению не разрешено аннулировать этот токен». }]}

Так что теперь я немного застрял, я попытался восстановить свои учетные данные, и это мало что дает. Я искал в Интернете, но смог найти только старые сообщения людей, в которых говорилось, что это ошибка / инфраструктура, но поскольку существует очень много приложений, использующих API Twitter, это кажется мне маловероятным, и, конечно, есть люди, которые просто рекомендуют использовать такой пакет, как * 1029. * twitter , но я бы сказал, что на платформе Deno нет таких пакетов: (

1 Ответ

2 голосов
/ 20 апреля 2020

Маркер-носитель не должен быть закодирован в base64. Попробуйте это:

const options = {
        url: 'https://api.twitter.com//1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi',
        method: 'GET',
        headers: {
            'Authorization': `Bearer ${bearer_token}`,
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...