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']);