Laravel — интеграция API Twitter/X для создания новых сообщенийPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Laravel — интеграция API Twitter/X для создания новых сообщений

Сообщение Anonymous »

Я провожу проверку концепции, связанную с интеграцией и автоматизацией API Twitter/X. Этот шаг предназначен для базового исследования, поэтому код еще не готов к работе.
Контекст:
  • Laraval 10 (нет гибкость в изменении - за исключением таких версий, как 9 или 8)
  • "php": "^8.1",
  • Локальная среда разработки (http:// 127.0.0.1)
  • Я создал свой БЕСПЛАТНАЯ учетная запись разработчика Twitter/X 2 дня назад
Учетная запись разработчика Twitter/X – настройки аутентификации пользователя:
  • Выбрано чтение, написание и отправка сообщений.
  • Запрос электронной почты от пользователей — включено.
  • Тип приложения: собственное приложение. (также пробовали с веб-приложением)
  • Информация о приложении:

    URI обратного вызова / URL-адрес перенаправления: http://127.0.0.1:8000/auth/twitter/callback (работает и проверено)
  • Веб-сайт URL: https://dockerpipelinewpv1aws.syncsystem.com.br (у меня есть субдомен, но я еще не использую его — я пытался настроить что-то вроде http://127.0.0.1:8000, но не принял)
  • Условия обслуживания: https://dockerpipelinewpv1aws.syncsyste ... of-service (не не существует)
  • Политика конфиденциальности: https://dockerpipelinewpv1aws.syncsyste ... acy-policy (не существует) существует)

Мой код работает почти идеально. Это то, что я настроил в Laravel.
composer.json

Код: Выделить всё

"atymic/twitter": "^3.0",
.env

Код: Выделить всё

# Consumer keys:
TWITTER_CONSUMER_KEY=123
TWITTER_CONSUMER_SECRET=321

# Authentication Token (not OAuth 2.0)
TWITTER_ACCESS_TOKEN=456
TWITTER_ACCESS_TOKEN_SECRET=654
TWITTER_API_VERSION=1.1
config\twitter.php

Код: Выделить всё

return [
'debug' => env('APP_DEBUG', false),

'api_url' => 'api.twitter.com',
'upload_url' => 'upload.twitter.com',
'api_version' => env('TWITTER_API_VERSION', '1.1'),

'consumer_key' => env('TWITTER_CONSUMER_KEY'),
'consumer_secret' => env('TWITTER_CONSUMER_SECRET'),
'access_token' => env('TWITTER_ACCESS_TOKEN'),
'access_token_secret' => env('TWITTER_ACCESS_TOKEN_SECRET'),
'bearer_token' => env('TWITTER_BEARER_TOKEN'),

'authenticate_url' => 'https://api.twitter.com/oauth/authenticate',
'access_token_url' => 'https://api.twitter.com/oauth/access_token',
'request_token_url' => 'https://api.twitter.com/oauth/request_token',
];
app\Http\Controllers\TwitterController.php

Код: Выделить всё

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Atymic\Twitter\Facade\Twitter;
use Atymic\Twitter\Twitter as TwitterContract;
use Illuminate\Support\Facades\Http;

class TwitterController extends Controller
{
private $twitter;

public function __construct(TwitterContract $twitter)
{
$this->twitter = $twitter;
}

public function redirectToTwitter()
{
$authCallback = 'http://127.0.0.1:8000/auth/twitter/callback';

$response = $this->twitter->usingCredentials(
config('twitter.access_token'),
config('twitter.access_token_secret'),
config('twitter.consumer_key'),
config('twitter.consumer_secret')
)
->getRequestToken($authCallback);

$url = 'https://api.twitter.com/oauth/authenticate?oauth_token=' .  $response['oauth_token'];

session(['oauth_token' => $response['oauth_token']]);
session(['oauth_token_secret' => $response['oauth_token_secret']]);

return redirect($url);
}

public function handleProviderCallback(Request $request)
{
$oauthToken = $request->query('oauth_token');
$oauthVerifier = $request->query('oauth_verifier');

if (!$oauthToken || !$oauthVerifier) {
return redirect()->route('twitter.error')->withErrors('Invalid OAuth response from Twitter');
}

// Ensure the oauth_token matches the one stored in the session.
if ($oauthToken !== session('oauth_token')) {
// TODO: Log the error or handle it as per your application's needs
}

try {

$tokenCredentials = $this->twitter->usingCredentials(session('oauth_token'), session('oauth_token_secret'))
->getAccessToken($oauthVerifier);

session([
'twitter_access_token' => $tokenCredentials['oauth_token'],
'twitter_token_secret' => $tokenCredentials['oauth_token_secret'],
]);

// Post a tweet or perform other actions with the authenticated user's token credentials.
if ($this->postTweet($request)) {
// The tweet was successfully posted
return response()->json(['status' => 'OAuth Success'], 200);
} else {
// The tweet was not posted
return response()->json(['status' => 'OAuth Success, but error posting message'], 200);
}

} catch (\Exception $e) {
// Handle errors, such as logging or displaying a message
return redirect()->route('twitter.error')->withErrors('Failed to obtain access tokens from Twitter');

}
}

public function postTweet(Request $request)
{
$status = $request->input('status', 'This is a tweet posted from my Laravel application using API v2.');

try {
$twitter = $this->twitter->usingCredentials(
config('twitter.access_token'),
config('twitter.access_token_secret'),
config('twitter.consumer_key'),
config('twitter.consumer_secret')
);

// Post the tweet
$response = $twitter->postTweet(['status' => $status]);

if (isset($response['data']) && isset($response['data']['id'])) {
// return response()->json(['status' => 'Message posted', 'tweet_id' => $response['data']['id']], 200);
return true;
} else {
// return response()->json(['status' => 'Error posting message', 'error' => $response], 500);
return false;
}
} catch (\Exception $e) {
// return response()->json(['status' => 'Exception caught', 'error' => $e->getMessage()], 500);
return false;
}
}
}
routes\web.php

Код: Выделить всё

use App\Http\Controllers\TwitterController;

Route::get('auth/twitter', [TwitterController::class, 'redirectToTwitter'])->name('twitter.login');
Route::get('auth/twitter/callback', [TwitterController::class, 'handleProviderCallback'])->name('twitter.callback');
Route::get('auth/twitter/post', [TwitterController::class, 'postTweet'])->name('twitter.post');
Методы redirectToTwitter и handleProviderCallback работают нормально. Я могу пройти аутентификацию, и обратный вызов работает отлично.
Проблема
Проблема связана с postTweet, точнее, с этой строкой:

Код: Выделить всё

$response = $twitter->postTweet(['status' => $status]);
При выполнении этой строки возвращается следующее сообщение об ошибке:

Код: Выделить всё

[453] You currently have access to a subset of Twitter API v2 endpoints and limited v1.1 endpoints (e.g. media post, oauth) only. If you need access to this endpoint, you may need a different access level. You can learn more here: https://developer.twitter.com/en/portal/product
Изначально я подозревал, что это версия API, которую я использовал TWITTER_API_VERSION=1.1, поскольку где-то читал, что версия API 1 устарела. Однако я переключил его на TWITTER_API_VERSION=2 и провел изолированный тест с маршрутом auth/twitter/post, но проблема осталась.
Другой гипофиз:
  • Требуется доступ по протоколу HTTPS?
  • Бесплатная учетная запись, но я не могу публиковать сообщения?
    Примечание: В приборной панели это написано У меня будет до 1500 публикаций в месяц.
  • Не делается ли это через поддомен, настроенный в поле веб-сайта?
  • Что-то не хватает в настройках моего приложения ?
  • Я неправильно использую API версии 2?
Кроме того, если у кого-нибудь есть версия, которая работает лучше предположение? Я был бы признателен за использование Guzzle, Laravel Http, Laravel Socialite или любых других зависимостей. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/781 ... -new-posts
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»