From 3192b5cffa00fa552cc64cd8203808f8cbf767ab Mon Sep 17 00:00:00 2001 From: hugol Date: Sun, 17 Nov 2024 17:28:20 +0100 Subject: [PATCH] Mise en place de la verification des credentials avec reconnexion automatique --- app/Http/Controllers/APIController.php | 66 +++- app/Http/Controllers/AccountController.php | 391 +++++++++------------ routes/web.php | 3 - 3 files changed, 226 insertions(+), 234 deletions(-) diff --git a/app/Http/Controllers/APIController.php b/app/Http/Controllers/APIController.php index 1d50637..b7849e4 100644 --- a/app/Http/Controllers/APIController.php +++ b/app/Http/Controllers/APIController.php @@ -377,7 +377,7 @@ class APIController extends Controller $cursor = null; // Nombre de tours - $maxLoops = 10; + $maxLoops = 5; // Boucle pour exécuter 5 tours for ($loop = 1; $loop <= $maxLoops; $loop++) { @@ -537,6 +537,70 @@ class APIController extends Controller } + public function check($user) + { + $stack = $this->Oauth1($user); + + // Créer le client Guzzle avec le handler stack + $client = new Client([ + 'base_uri' => 'https://api.twitter.com/1.1/', + 'handler' => $stack, + 'proxy' => [ + 'http' => 'http://xtjnmwvl-'.$user->id.':lp7iv1lq9glu@p.webshare.io:80', + ] + ]); + + try{ + // Effectuer la requête POST avec OAuth et les en-têtes personnalisés + $res = $client->get('account/verify_credentials.json', [ + 'headers' => $this->twitterHeaders, // Ajouter les en-têtes ici + 'auth' => 'oauth' // Assurez-vous que l'authentification OAuth est incluse + ]); + + $suspended = json_decode($res->getBody()->getContents(), true); + + if($suspended['suspended'] === true){ + $user->enable = false; + $user->save(); + + $text = "Le compte ".$user->name.' a été suspendu'; + Http::get('https://api.telegram.org/bot6784810105:AAEq3emnkRwdyvCLC-iqdIjVJ2Ke6HwwGjg/sendMessage', [ + 'chat_id' => '1970698501', // Remplacez par votre chat_id + 'text' => $text, + ]); + } + }catch (\Exception $e){ + $connexion = (new AccountController)->login($user->id); + + if($connexion){ + $text = "Le compte ".$user->name.' a été synchronisé'; + Http::get('https://api.telegram.org/bot6784810105:AAEq3emnkRwdyvCLC-iqdIjVJ2Ke6HwwGjg/sendMessage', [ + 'chat_id' => '1970698501', // Remplacez par votre chat_id + 'text' => $text, + ]); + }elseif(!$connexion){ + $user->enable = false; + $user->save(); + + $text = "Le compte ".$user->name.' n\'a pas pu être synchronisé. Il a été désactivé'; + Http::get('https://api.telegram.org/bot6784810105:AAEq3emnkRwdyvCLC-iqdIjVJ2Ke6HwwGjg/sendMessage', [ + 'chat_id' => '1970698501', // Remplacez par votre chat_id + 'text' => $text, + ]); + }else{ + $user->enable = false; + $user->save(); + + $text = "Problème sur le compte ".$user->name.'. Il a été désactivé'; + Http::get('https://api.telegram.org/bot6784810105:AAEq3emnkRwdyvCLC-iqdIjVJ2Ke6HwwGjg/sendMessage', [ + 'chat_id' => '1970698501', // Remplacez par votre chat_id + 'text' => $text, + ]); + } + } + + } + private function Oauth1($user) { // Créer le stack pour gérer l'authentification OAuth diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index b815c29..39b3582 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -2,13 +2,8 @@ namespace App\Http\Controllers; -use App\Jobs\ProcessNews; use App\Models\Account; -use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; -use Illuminate\Support\Facades\Queue; -use App\Http\Controllers\APIController; -use Illuminate\Support\Facades\Cache; use Webklex\PHPIMAP\ClientManager; class AccountController extends Controller @@ -17,145 +12,181 @@ class AccountController extends Controller { $user = Account::find($id); - $username = $user->name; - $password = $user->password; - $email = $user->rambler_email; - $rambler_password = $user->rambler_password; + try{ + $username = $user->name; + $password = $user->password; + $email = $user->rambler_email; + $rambler_password = $user->rambler_password; - $proxy = 'http://xtjnmwvl-'.$id.':lp7iv1lq9glu@p.webshare.io:80'; + $proxy = 'http://xtjnmwvl-'.$id.':lp7iv1lq9glu@p.webshare.io:80'; - // Clés et jetons de Twitter - $TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'; - $TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'; - $TW_ANDROID_BASIC_TOKEN = 'Basic ' . base64_encode("$TW_CONSUMER_KEY:$TW_CONSUMER_SECRET"); + // Clés et jetons de Twitter + $TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'; + $TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'; + $TW_ANDROID_BASIC_TOKEN = 'Basic ' . base64_encode("$TW_CONSUMER_KEY:$TW_CONSUMER_SECRET"); - // Requête pour obtenir le bearer token - $response = Http::withHeaders([ - 'Authorization' => $TW_ANDROID_BASIC_TOKEN, - 'Content-Type' => 'application/x-www-form-urlencoded', - ])->asForm()->post('https://api.twitter.com/oauth2/token', [ - 'grant_type' => 'client_credentials', - ]); + // Requête pour obtenir le bearer token + $response = Http::withHeaders([ + 'Authorization' => $TW_ANDROID_BASIC_TOKEN, + 'Content-Type' => 'application/x-www-form-urlencoded', + ])->asForm()->post('https://api.twitter.com/oauth2/token', [ + 'grant_type' => 'client_credentials', + ]); - $bearerToken = collect($response->json())->implode(' '); + $bearerToken = collect($response->json())->implode(' '); - // Requête pour obtenir le guest token - $curl = curl_init(); + // Requête pour obtenir le guest token + $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_URL => 'https://api.twitter.com/1.1/guest/activate.json', - CURLOPT_RETURNTRANSFER => true, - CURLOPT_ENCODING => '', - CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => 0, - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST => 'POST', - CURLOPT_HTTPHEADER => array( - 'Authorization: ' . $bearerToken - ), - )); + curl_setopt_array($curl, array( + CURLOPT_URL => 'https://api.twitter.com/1.1/guest/activate.json', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_HTTPHEADER => array( + 'Authorization: ' . $bearerToken + ), + )); - $response = curl_exec($curl); + $response = curl_exec($curl); - curl_close($curl); - $reponse = json_decode($response, true); - $guestToken = $reponse['guest_token']; + curl_close($curl); + $reponse = json_decode($response, true); + $guestToken = $reponse['guest_token']; - // Configuration des en-têtes pour les futures requêtes - $twitterHeaders = [ - 'Authorization' => $bearerToken, - 'User-Agent' => 'TwitterAndroid/10.46.0-release.0 (310460000-r-0) Android+SDK+built+for+x86/11 (unknown;Android+SDK+built+for+x86;Android;sdk_phone_x86;0;;1;2013)', - 'x-twitter-api-version' => '5', - 'x-twitter-client' => 'TwitterAndroid', - 'x-twitter-client-version' => '10.46.0-release.0', - 'x-twitter-active-user' => 'yes', - 'os-version' => '30', - 'x-twitter-client-language' => 'en-US', - 'x-attest-token' => 'no_token', - 'X-Guest-Token' => $guestToken, - ]; + // Configuration des en-têtes pour les futures requêtes + $twitterHeaders = [ + 'Authorization' => $bearerToken, + 'User-Agent' => 'TwitterAndroid/10.46.0-release.0 (310460000-r-0) Android+SDK+built+for+x86/11 (unknown;Android+SDK+built+for+x86;Android;sdk_phone_x86;0;;1;2013)', + 'x-twitter-api-version' => '5', + 'x-twitter-client' => 'TwitterAndroid', + 'x-twitter-client-version' => '10.46.0-release.0', + 'x-twitter-active-user' => 'yes', + 'os-version' => '30', + 'x-twitter-client-language' => 'en-US', + 'x-attest-token' => 'no_token', + 'X-Guest-Token' => $guestToken, + ]; - // Initialisation de la session avec Laravel HTTP pour le flux de connexion - // Étape 1 : Commencer le flux de connexion - $task1 = Http::withOptions([ - 'proxy' => $proxy - ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json?flow_name=login&api_version=1&known_device_token=', [ - 'input_flow_data' => [ - 'country_code' => null, - 'flow_context' => [ - 'start_location' => [ - 'location' => 'deeplink', + // Initialisation de la session avec Laravel HTTP pour le flux de connexion + // Étape 1 : Commencer le flux de connexion + $task1 = Http::withOptions([ + 'proxy' => $proxy + ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json?flow_name=login&api_version=1&known_device_token=', [ + 'input_flow_data' => [ + 'country_code' => null, + 'flow_context' => [ + 'start_location' => [ + 'location' => 'deeplink', + ], + ], + 'requested_variant' => null, + 'target_user_id' => 0, + ], + ]); + + // Stockage de l'en-tête 'att' pour les futures requêtes + $twitterHeaders['att'] = $task1->header('att'); + + sleep(5); + + // Étape 2 : Saisie du nom d'utilisateur + $task2 = Http::withOptions([ + 'proxy' => $proxy + ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ + 'flow_token' => $task1->json()['flow_token'], + 'subtask_inputs' => [ + [ + 'enter_text' => [ + 'text' => $username, + 'link' => 'next_link', + ], + 'subtask_id' => 'LoginEnterUserIdentifier', ], ], - 'requested_variant' => null, - 'target_user_id' => 0, - ], - ]); + ]); - // Stockage de l'en-tête 'att' pour les futures requêtes - $twitterHeaders['att'] = $task1->header('att'); + sleep(5); - sleep(5); - - // Étape 2 : Saisie du nom d'utilisateur - $task2 = Http::withOptions([ - 'proxy' => $proxy - ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ - 'flow_token' => $task1->json()['flow_token'], - 'subtask_inputs' => [ - [ - 'enter_text' => [ - 'text' => $username, - 'link' => 'next_link', + if ($task2->json()['subtasks'][0]['subtask_id'] === 'LoginEnterAlternateIdentifierSubtask') { + $task2bis = Http::withOptions([ + 'proxy' => $proxy + ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ + 'flow_token' => $task2->json()['flow_token'], + 'subtask_inputs' => [ + [ + 'enter_text' => [ + 'text' => $email, + 'link' => 'next_link', + ], + 'subtask_id' => 'LoginEnterAlternateIdentifierSubtask', + ], ], - 'subtask_id' => 'LoginEnterUserIdentifier', - ], - ], - ]); + ]); - sleep(5); + $task2 = $task2bis; + } - if ($task2->json()['subtasks'][0]['subtask_id'] === 'LoginEnterAlternateIdentifierSubtask') { - $task2bis = Http::withOptions([ + sleep(5); + + // Étape 3 : Saisie du mot de passe + $task3 = Http::withOptions([ 'proxy' => $proxy ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ 'flow_token' => $task2->json()['flow_token'], 'subtask_inputs' => [ [ - 'enter_text' => [ - 'text' => $email, + 'enter_password' => [ + 'password' => $password, 'link' => 'next_link', ], - 'subtask_id' => 'LoginEnterAlternateIdentifierSubtask', + 'subtask_id' => 'LoginEnterPassword', ], ], ]); - $task2 = $task2bis; - } + if ($task3->json()['subtasks'][0]['subtask_id'] === 'LoginAcid') { + sleep(5); + if(isset($task3->json()['subtasks'][0]['enter_text']['hint_text'])){ + $code = $this->getCodeFromLastEmail($email, $rambler_password); + $task3bis = Http::withOptions([ + 'proxy' => $proxy + ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ + 'flow_token' => $task3->json()['flow_token'], + 'subtask_inputs' => [ + [ + 'enter_text' => [ + 'text' => $code, + 'link' => 'next_link', + ], + 'subtask_id' => 'LoginAcid', + ], + ], + ]); + }else{ + $task3bis = Http::withOptions([ + 'proxy' => $proxy + ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ + 'flow_token' => $task3->json()['flow_token'], + 'subtask_inputs' => [ + [ + 'enter_text' => [ + 'text' => $email, + 'link' => 'next_link', + ], + 'subtask_id' => 'LoginAcid', + ], + ], + ]); + } + $task3 = $task3bis; + } - sleep(5); - - // Étape 3 : Saisie du mot de passe - $task3 = Http::withOptions([ - 'proxy' => $proxy - ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ - 'flow_token' => $task2->json()['flow_token'], - 'subtask_inputs' => [ - [ - 'enter_password' => [ - 'password' => $password, - 'link' => 'next_link', - ], - 'subtask_id' => 'LoginEnterPassword', - ], - ], - ]); - - if ($task3->json()['subtasks'][0]['subtask_id'] === 'LoginAcid') { - sleep(5); - if(isset($task3->json()['subtasks'][0]['enter_text']['hint_text'])){ + if($task3->json()['subtasks'][0]['subtask_id'] === 'LoginEnterOtp'){ $code = $this->getCodeFromLastEmail($email, $rambler_password); $task3bis = Http::withOptions([ 'proxy' => $proxy @@ -167,60 +198,29 @@ class AccountController extends Controller 'text' => $code, 'link' => 'next_link', ], - 'subtask_id' => 'LoginAcid', - ], - ], - ]); - }else{ - $task3bis = Http::withOptions([ - 'proxy' => $proxy - ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ - 'flow_token' => $task3->json()['flow_token'], - 'subtask_inputs' => [ - [ - 'enter_text' => [ - 'text' => $email, - 'link' => 'next_link', - ], - 'subtask_id' => 'LoginAcid', + 'subtask_id' => 'LoginEnterOtp', ], ], ]); + $task3 = $task3bis; } - $task3 = $task3bis; - } - if($task3->json()['subtasks'][0]['subtask_id'] === 'LoginEnterOtp'){ - $code = $this->getCodeFromLastEmail($email, $rambler_password); - $task3bis = Http::withOptions([ - 'proxy' => $proxy - ])->withHeaders($twitterHeaders)->post('https://api.twitter.com/1.1/onboarding/task.json', [ - 'flow_token' => $task3->json()['flow_token'], - 'subtask_inputs' => [ - [ - 'enter_text' => [ - 'text' => $code, - 'link' => 'next_link', - ], - 'subtask_id' => 'LoginEnterOtp', - ], - ], - ]); - $task3 = $task3bis; - } + if($task3->json()['subtasks']['0']['subtask_id'] == 'LoginSuccessSubtask' ){ + $user->update([ + 'oauth_token' => $task3->json()['subtasks']['0']['open_account']['oauth_token'], + 'oauth_token_secret' => $task3->json()['subtasks']['0']['open_account']['oauth_token_secret'], + 'known_device_token' => $task3->json()['subtasks']['0']['open_account']['known_device_token'], + 'enable' => true, + ]); - if($task3->json()['subtasks']['0']['subtask_id'] == 'LoginSuccessSubtask' ){ - $user->update([ - 'oauth_token' => $task3->json()['subtasks']['0']['open_account']['oauth_token'], - 'oauth_token_secret' => $task3->json()['subtasks']['0']['open_account']['oauth_token_secret'], - 'known_device_token' => $task3->json()['subtasks']['0']['open_account']['known_device_token'], - 'enable' => true, - ]); - - return true; - }else{ + return true; + }else{ + return false; + } + }catch (\Exception $e){ return false; } + } private function getCodeFromLastEmail($email, $password) { @@ -269,73 +269,4 @@ class AccountController extends Controller return null; } - - public function tweetnews() - { - // Vérifier si la queue est vide (en fonction de votre driver) - $queue = Queue::getDefaultDriver(); // Par défaut, c'est 'default' - - $jobsCount = Queue::size($queue); - - if ($jobsCount === 0) { - - $accounts = Account::where('enable', true)->get(); - - foreach($accounts as $user){ - - $API = new APIController(); - - //On check les notifs - $API->unread($user); - - if (Cache::has('news')) { - $news = Cache::get('news'); - }else{ - $news = $API->newstweet($user); - } - - shuffle($news); - - $nb = rand(1,3); - - if (count($news) >= $nb) { - $selectedArticles = array_slice($news, 0, $nb); - - foreach ($selectedArticles as $article) { - - $tweetid = $article['conversation_id_str']; - $API->retweet($user, $tweetid); - sleep(15); - } - } - } - } - } - - public - function auto($contestId) - { - $contest = Contest::find($contestId); - - if (!$contest) { - session()->flash('error', 'Concours introuvable.'); - return; - } - - flash()->success('Concours ' . $contest->name . ' en cours de participation'); - - // Récupération des comptes activés - $accounts = Account::where('enable', true)->get(); - - foreach ($accounts as $account) { - ProcessTweet::dispatch($contest->id, $account->id); // Envoi du tweet pour participer - } - - // Mise à jour du concours pour indiquer qu'il a été participé - $contest->participated = true; - $contest->save(); - - // Recharger les concours - $this->resetPage(); // Reset pagination to the first page - } } diff --git a/routes/web.php b/routes/web.php index 81d2704..863ed5f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -18,7 +18,4 @@ Route::view('profile', 'profile.edit') Route::get('/aplifier/list', [ContestController::class, 'twitterlist']); Route::get('/aplifier/search', [ContestController::class, 'searchcontest']); -Route::get('/unread/{user}', [\App\Http\Controllers\APIController::class, 'unread']); - -Route::get('/api/news', [\App\Http\Controllers\AccountController::class, 'tweetnews']);