PHP + Twitter API - публикация возвращает пустое значение

Я использую PHP + Twitter API (с библиотекой https://github.com/abraham/twitteroauth) уже довольно давно, но недавно они изменили API и представили версию v2. Я использую API только для написания/удаления твитов от имени пользователя.

Я заполнил всю необходимую информацию на новом портале разработчиков Twitter и могу подключиться к Twitter, используя поток OAuth в своем приложении.

Мой предыдущий код для твита был:

$tw = new TwitterOAuth
(
    $apiKey,
    $apiSecret,
    $accessToken,
    $accessSecret
);

$data = ['status' => 'Hello world'];

$response = $tw->post('statuses/update', $data);

print_r($response);

Который больше не работает, так как возвращает ошибку:

Twitter: в настоящее время у вас есть базовый доступ, который включает доступ к Только конечные точки Twitter API v2. Если вам нужен доступ к этой конечной точке, вам нужно будет подать заявку на повышенный доступ через портал разработчика. Ты можно узнать больше здесь: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-leve

Что я не думаю, что эта ошибка имеет большой смысл, потому что по предоставленной ссылке мы можем увидеть прайс-планы:

Таким образом, конечная точка statuses/update должна нормально работать в бесплатных планах (как у меня), но это не так. Тем не менее, при преобразовании кода для использования нового API v2:

$tw = new TwitterOAuth
(
    $apiKey,
    $apiSecret,
    $accessToken,
    $accessSecret
);

$data = ['text' => 'Hello world'];

$response = $tw->post('2/tweets', $data);

print_r($response);

$response приходит пустым, ни ошибок, ни успехов, ничего. Однако при применении той же концепции в Postman это работает, твит создается.

В библиотеке TwitterOAuth чего-то не хватает или я ошибаюсь?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено.

Копаясь в https://github.com/abraham/twitteroauth, точнее в файле под src/TwitterOAuth.php, я смог убедиться в двух вещах:

  1. Версия является константой private const API_VERSION = '1.1'; и вставляется в URL-запросы.
  2. Все запросы заканчиваются .json, например: api.twitter.com/1.1/some-path.json

Это не соответствует новой документации v2.

Решение состоит в том, чтобы создать функцию, которая определяет, какую версию API использовать (иногда мы должны использовать 1.1, а иногда 2):

private $apiVersion = '1.1';
public function setApiVersion($version)
{
    $this->apiVersion = $version;

    return $this;
}

А затем замените функцию http:

private function http(
    string $method,
    string $host,
    string $path,
    array $parameters,
    bool $json
) {
    $this->resetLastResponse();
    $this->resetAttemptsNumber();
    $url = sprintf('%s/%s/%s.json', $host, self::API_VERSION, $path);
    $this->response->setApiPath($path);
    if (!$json) {
        $parameters = $this->cleanUpParameters($parameters);
    }
    return $this->makeRequests($url, $method, $parameters, $json);
}

с:

private function http(
    string $method,
    string $host,
    string $path,
    array $parameters,
    bool $json
) {
    $this->resetLastResponse();
    $this->resetAttemptsNumber();
    $url = sprintf('%s/%s/%s', $host, $this->apiVersion, $path . ($this->apiVersion == '1.1' ? '.json' : ''));
    $this->response->setApiPath($path);

    if (!$json) {
        $parameters = $this->cleanUpParameters($parameters);
    }
    return $this->makeRequests($url, $method, $parameters, $json);
}

Наконец, чтобы использовать библиотеку с новой версией:

$tw = new TwitterOAuth
(
    $apiKey,
    $apiSecret,
    $accessToken,
    $accessSecret
);

$data = ['text' => 'Hello world'];

$response = $tw->setApiVersion('2')->post('tweets', $data);

ИМХО, похоже, что это скорее должно было быть проблемой в репозитории github, поскольку речь идет больше об этой конкретной библиотеке и версиях API Twitter, чем о конкретной проблеме программирования.

M. Eriksson 08.05.2023 19:20

Я как бы согласен с тобой. Кажется, я использую старую версию библиотеки, в их новой версии, я думаю, они решают проблему с версией. Но, в любом случае, у кого-то может быть такая же проблема, как у меня.

Linesofcode 08.05.2023 19:27

Другие вопросы по теме