Laravel - Twitter/X API 集成用于创建新帖子

问题描述 投票:0回答:1

我正在进行与 Twitter/X API 集成和自动化相关的概念验证工作。此步骤用于基本探索,因此代码尚未准备好用于生产。

背景:

  • Laraval 10(没有更改的灵活性 - 除非像 9 或 8 这样的版本)
  • “php”:“^8.1”,
  • 本地开发环境(http://127.0.0.1
  • 我 2 天前创建了 Twitter/X 免费开发者帐户

Twitter/X 开发者帐户 - 用户身份验证设置:

我的代码几乎可以完美运行。这就是我在 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

配置witter.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;
        }
    }
}

路线\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 或任何其他依赖项,我都会很感激。谢谢!

php laravel twitter twitter-oauth
1个回答
0
投票

我今天刚刚使用 Laravel 10 实现了 Atymic Twitter。

这就是我所做的让它发挥作用:

  • 使用 Twitter API v2
  • 进入开发者门户 -> 您的应用程序 -> 设置 -> 身份验证设置 -> 应用程序权限 -> 选择读取和写入
  • 转到开发者门户 -> 您的应用程序 -> 密钥和令牌 -> 重新生成您的访问令牌和秘密,以便它具有读取和写入权限

此外,根据问题帖子,postTweet 仅适用于 Twitter API v1,但 Github 用户 @reliq 提供的代码对我有用: https://github.com/atymic/twitter/issues/399#issuecomment-1254272114

use Atymic\Twitter\Contract\Http\Client;
use Atymic\Twitter\Facade\Twitter;

...

$querier = Twitter::forApiV2()->getQuerier();
$result = $querier->post(
    'tweets', 
    [
        Client::KEY_REQUEST_FORMAT => Client::REQUEST_FORMAT_JSON,
        'text' => 'my tweet'
    ]
);
© www.soinside.com 2019 - 2024. All rights reserved.