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 :
- 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 đó .
- 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
- laravel socialite (https://laravel.com/docs/10.x/socialite) thư viện chính laravel dùng để xử lý xác thực người dùng mạng xã hội
- TwitterOAuth (https://github.com/abraham/twitteroauth)
- và cần thêm TwitterProvider nếu bạn muốn truyền thêm param vào link callback của api.
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
- 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);