Connect and make a bot that posts to twitter

Connect and make a bot that posts to twitter

Bài này sẽ hướng dẫn cơ bản để tạo bot tự động post lên twitter nhé mọi người !!!

Mục đích :

  1. Kết nối tài khoản ứng dụng với 1 tài khoản twitter và cấp quyền cho ứng dụng đó .
  2. Dựa vào thông tin kết nối ở (1) để có thể xử lý các tác vụ liên quan tới twitter ( như auto post tweet ..)

Bước 1.  Bạn cần phải có 1 api và đã được settting cần thiết

( truy câp https://blog.tmi-soft.vn/ghost/#/editor/post/6472bc2960e96304841c3284 để xem thêm cách setting 1 api twitter)

  • Sau khi đã setting xong thì ta sẽ có 1 cặp api key và api key secret cùng với 1 link callback  , hãy lưu chúng lại và tiếp tục chuyển sang bước tiếp theo nhé .

Bước 2.  Cài đặt thư viện cần thiết .

trong bài này chúng ra sẽ sử dụng

composer require laravel/socialite
composer require league/oauth1-client
composer require socialiteproviders/twitter
composer require abraham/twitteroauth

Bước 3 :

  • Sau khi đã cài đặt môi trường và setting api xong ta tiếp tục đến setting trong dự án
  1. Trong file .env ta khai báo các thôn tin của api đã lưu ở bước 1
TWITTER_API_ID= api key lấy được ở bước 1
TWITTER_API_SECRET= api key secret lấy được ở bước 1
TWITTER_REDIRECT_URI=http://localhost:8000/auth/twitter/callback

2. Trong config\services.php  ta thêm khai báo

    'twitter' => [
        'client_id' => env('TWITTER_API_ID'),
        'client_secret' => env('TWITTER_API_SECRET'),
        'redirect' => env('TWITTER_REDIRECT_URI'),
    ],

Bước 4 :  tạo route

        Route::controller(TwitterController::class)->group(function(){
            Route::get('auth/twitter/callback', 'callback');
            Route::get('auth/twitter/{channel_id}', 'connect')->name('auth.twitter');
        });

Bước 5 : Tạo bảng ChannelSocialConnect để lưu thông tin sau khi đã xác thực thành công

 public function up()
    {
        Schema::create('channel_social_connects', function (Blueprint $table) {
            $table->unsignedInteger('id')->autoIncrement();
            $table->unsignedInteger('channel_id');
            $table->unsignedInteger('user_id');
            $table->string('type', 255); #1 TWITTER
            $table->string('token', 255);
            $table->string('token_secret', 255);
            $table->string('nickname', 255);
            $table->string('avatar')->nullable();
            $table->integer('status')->default('1'); #0 inactive  #1 active
            $table->timestamps();
        });
    }

Bước 6 : Tạo controller xử lý và xác thực người dùng

class TwitterController extends Controller
{

    /**
     * redirect twitter login and grant project permission
     *
     * @param  int  $channelId
     * @return Illuminate\Http\Request;
     */
    public function connect(Request $request, $channelId)
    {
        return Socialite::extend('twitter', function ($app) use ($channelId) {
            $config = $app['config']['services.twitter'];
            $config['redirect'] = config('app.tw_redirect_uri') . '?channel_id=' . $channelId;
            return new TwitterProvider(
                $app['request'],
                new TwitterServer(Socialite::formatConfig($config))
            );
        })->driver('twitter')->redirect();
    }

    /**
     * After successfully granting permission, the function is run
     *
     * @return Illuminate\Http\Request;
     */
    public function callback(Request $request)
    {
        try {
            $channelId = $request->channel_id;
            if ($channelId) {
                $channel = Channel::findOrFail($channelId);
                $user = Socialite::driver('twitter')->user();
                if (ChannelSocialConnect::nicknameExists($user->nickname)) {
                    return redirect()->route('channels.edit', $channelId)->withErrors(['errors' => 'Twitter account has been connected to another channel.']);
                }
                $accessToken = $user->token;
                $accessTokenSecret = $user->tokenSecret;
                $apiKey = config("app.tw_api_id");
                $apiKeySecret = config("app.tw_api_secret");
                $connection = new TwitterOAuth($apiKey, $apiKeySecret, $accessToken, $accessTokenSecret);
                $connection->setApiVersion('2');
                DB::beginTransaction();
                $channel->socialTwitter()->delete();
                Auth::user()->channelSocialConnects()->create([
                    "channel_id" => $channelId,
                    "type" => TWITTER::class,
                    "token" => $accessToken,
                    "token_secret" => $accessTokenSecret,
                    "nickname" => $user->nickname,
                    "avatar" => $user->avatar,
                    "status" => SocialAccountStatus::ACTIVE,
                ]);
                DB::commit();
                return redirect()->route('channels.edit', $channelId)->with('success', 'Twitter account has been successfully connected.');
            }
            return redirect()->route('channels.edit', $channelId)->withErrors(['errors'=> 'Twitter account has been unsuccessfully connected.']);
        } catch (Exception $e) {
            DB::rollBack();
            return redirect()->route('channels.edit', $channelId)->withErrors(['errors' => 'Twitter account has been unsuccessfully connected.']);
        }
    }

Bước 7 : Sau khi đã có thông tin xác thực từ người dùng , có có thể lấy thông tin này ra và thực hiện các tác vụ cần thiết

example post lên twitter ta có thể dùng

             $accessToken = $account->token; //là token đã lưu ở bước 5
                $accessTokenSecret = $account->token_secret; // là token secret đã lưu ơ bước 5
                $connection = new TwitterOAuth($apiKey, $apiKeySecret, $accessToken, $accessTokenSecret);
                $connection->setApiVersion('2');
                $result = $connection->post('tweets', ['text' => $contentPost], true);
Facebook・TwitterのOGP設定方法まとめ
WEB担当者の皆様、運営しているホームページにOGP設定をおこなっていますか?OGPはSNSでの拡散を通じて多くの人に記事をみてもらうためには必須の設定といえます。