Я использую 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 чего-то не хватает или я ошибаюсь?






Решено.
Копаясь в https://github.com/abraham/twitteroauth, точнее в файле под src/TwitterOAuth.php, я смог убедиться в двух вещах:
private const API_VERSION = '1.1'; и вставляется в URL-запросы..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, чем о конкретной проблеме программирования.