From 614b5a5e7f6bb094a0e4f342e9f34e0290052f9a Mon Sep 17 00:00:00 2001 From: hugol Date: Fri, 22 Nov 2024 19:56:56 +0100 Subject: [PATCH] Correction du probleme sur les commentaires speciaux --- app/Http/Controllers/APIController.php | 22 ++- app/Http/Controllers/BotController.php | 177 +++++++++++++++------ app/Http/Controllers/ContestController.php | 2 +- app/Http/Controllers/HomeController.php | 2 +- app/Jobs/ProcessTweet.php | 6 - routes/web.php | 2 + 6 files changed, 154 insertions(+), 57 deletions(-) diff --git a/app/Http/Controllers/APIController.php b/app/Http/Controllers/APIController.php index 8a847a6..606acae 100644 --- a/app/Http/Controllers/APIController.php +++ b/app/Http/Controllers/APIController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\Account; use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; use GuzzleHttp\Subscriber\Oauth\Oauth1; @@ -450,7 +451,14 @@ class APIController extends Controller // Vérifier si l'entrée contient un tweet if (isset($entry['content']['items'][0]['item']['content']['tweetResult'])) { // Récupérer le texte complet du tweet - $tweets[] = $entry['content']['items'][0]['item']['content']['tweetResult']['result']['legacy']['full_text'] ?? ''; + $tweet= $entry['content']['items'][0]['item']['content']['tweetResult']['result']['legacy']['full_text'] ?? ''; + // Supprimer les hashtags + $tweet = preg_replace('/#\w+\s?/', '', $tweet); + + // Supprimer les tags + $tweet = preg_replace('/@\w+\s?/', '', $tweet); + + $tweets[] = $tweet; } // Vérifier si l'entrée contient un curseur, dont l'entryId commence par 'cursor-bottom' @@ -470,6 +478,8 @@ class APIController extends Controller public function newstweet($user) { + $user = Account::find($user); + $stack = $this->Oauth1($user); $newArray = []; @@ -483,7 +493,9 @@ class APIController extends Controller '1493931667731406848', '1513789977938776070', '1531291630040391682', - '1741188576845455676' + '1741188576845455676', + '1191374346473873409', + '55882909' ]; foreach ($search as $list) { @@ -561,6 +573,10 @@ class APIController extends Controller continue; // Si le tweet existe déjà, passer à l'itération suivante } + if (str_contains(strtolower($news['full_text']), ' rt ')) { + continue; // Si le texte contient "rt", passer à l'itération suivante + } + // Ajouter l'ID de conversation à la liste des IDs déjà vus $existingConversationIds[] = $conversationId; @@ -572,6 +588,8 @@ class APIController extends Controller } } + dd($newArray); + Cache::put('news', $newArray, 1800); return $newArray; diff --git a/app/Http/Controllers/BotController.php b/app/Http/Controllers/BotController.php index e9ec6df..dc07ae2 100644 --- a/app/Http/Controllers/BotController.php +++ b/app/Http/Controllers/BotController.php @@ -19,62 +19,146 @@ use Throwable; class BotController extends Controller { - - public function getSpecialComment($user,$id){ - + public function test($user,$contest){ $user = Account::find($user); - $API = new APIController(); + $contest = Contest::findOrFail($contest); - // On check les notifs - $texts = $API->getweets($user, $id); + $text = $contest->description; - // Filtrer les phrases vides - $texts = array_filter($texts, function($phrase) { - return !empty(trim($phrase)); // Ignore les chaînes vides ou contenant uniquement des espaces - }); + $tweetspecial = $this->getSpecialComment($text,$user,$contest->tweetid); - // Initialiser un tableau pour stocker les occurrences des phrases - $occurrences = []; + $tweetcomment = $this->getComment($text); - foreach ($texts as $index1 => $phrase1) { - foreach ($texts as $index2 => $phrase2) { - if ($index1 !== $index2) { - $similarity = $this->cosineSimilarity($phrase1, $phrase2); - // Vous pouvez ajuster le seuil de similarité en fonction de vos besoins - if ($similarity > 0.5) { - // Incrémenter le compteur pour les deux phrases - $occurrences[$index1] = isset($occurrences[$index1]) ? $occurrences[$index1] + 1 : 1; - $occurrences[$index2] = isset($occurrences[$index2]) ? $occurrences[$index2] + 1 : 1; - } - } - } - } + $tags = $this->getTags($text); - // Trouver l'index de la phrase avec le comptage le plus élevé - $indexPhrasePlusFrequente = (!empty($occurrences)) ? array_search(max($occurrences), $occurrences) : null; - - // Récupérer la phrase avec le comptage le plus élevé - $phrasePlusFrequente = ($indexPhrasePlusFrequente !== null) ? $texts[$indexPhrasePlusFrequente] : null; - - if ($phrasePlusFrequente != null) { - // Supprimer les hashtags - $phrasePlusFrequente = preg_replace('/#\w+\s?/', '', $phrasePlusFrequente); - - // Supprimer les tags - $phrasePlusFrequente = preg_replace('/@\w+\s?/', '', $phrasePlusFrequente); - - // Supprimer les emojis - $phrasePlusFrequente = $this->remove_emojis($phrasePlusFrequente); - - return $phrasePlusFrequente; - } else { - $tweetcomments = config('twitter.sentence_for_random_comment'); - return Arr::random($tweetcomments); - } + $hashtags = $this->getHashtags($text); + dd($tweetspecial,$tweetcomment,$tags,$hashtags); } + private function getSpecialComment($text,$user,$id){ + + //On recherche si une reponse special est attendu + $word_special_comments = config('twitter.word_special_comment'); + $combined_regex = implode('|', array_map('preg_quote', $word_special_comments, array_fill(0, count($word_special_comments), '/'))); + if (preg_match('/' . $combined_regex . '/i', $text, $matches)) { + try { + $API = new APIController(); + + // On check les notifs + $texts = $API->getweets($user, $id); + + // Filtrer les phrases vides + $texts = array_filter($texts, function($phrase) { + return !empty(trim($phrase)); // Ignore les chaînes vides ou contenant uniquement des espaces + }); + + // Initialiser un tableau pour stocker les occurrences des phrases + $occurrences = []; + + foreach ($texts as $index1 => $phrase1) { + foreach ($texts as $index2 => $phrase2) { + if ($index1 !== $index2) { + $similarity = $this->cosineSimilarity($phrase1, $phrase2); + // Vous pouvez ajuster le seuil de similarité en fonction de vos besoins + if ($similarity > 0.5) { + // Incrémenter le compteur pour les deux phrases + $occurrences[$index1] = isset($occurrences[$index1]) ? $occurrences[$index1] + 1 : 1; + $occurrences[$index2] = isset($occurrences[$index2]) ? $occurrences[$index2] + 1 : 1; + } + } + } + } + + // Trouver l'index de la phrase avec le comptage le plus élevé + $indexPhrasePlusFrequente = (!empty($occurrences)) ? array_search(max($occurrences), $occurrences) : null; + + // Récupérer la phrase avec le comptage le plus élevé + $phrasePlusFrequente = ($indexPhrasePlusFrequente !== null) ? $texts[$indexPhrasePlusFrequente] : null; + + + if ($phrasePlusFrequente != null) { + // Supprimer les hashtags + $phrasePlusFrequente = preg_replace('/#\w+\s?/', '', $phrasePlusFrequente); + + // Supprimer les tags + $phrasePlusFrequente = preg_replace('/@\w+\s?/', '', $phrasePlusFrequente); + + // Supprimer les emojis + $phrasePlusFrequente = $this->remove_emojis($phrasePlusFrequente); + + return $phrasePlusFrequente; + } else { + $tweetcomments = config('twitter.sentence_for_random_comment'); + return Arr::random($tweetcomments); + } + + } catch (\Exception $e) { + $tweetcomments = config('twitter.sentence_for_random_comment'); + return Arr::random($tweetcomments); + } + } + } + private function getComment($text){ + //On recherche si un commentaire est attendu + $word_comments = config('twitter.word_comment'); + $combined_regex = implode('|', array_map('preg_quote', $word_comments, array_fill(0, count($word_comments), '/'))); + if (preg_match('/' . $combined_regex . '/i', $text, $matches)) { + return true; + } + } + private function getTags($text){ + //On recherche si ça demande un tag + $word_tags = config('twitter.word_tag'); + $combined_regex = implode('|', array_map('preg_quote', $word_tags, array_fill(0, count($word_tags), '/'))); + $tags = collect(config('twitter.tags')); + if (preg_match('/' . $combined_regex . '/i', $text, $matches)) { + + //On recherche si ça demande 1 tag + $one_people_lists = config('twitter.one_people_list'); + $combined_regex = implode('|', array_map('preg_quote', $one_people_lists, array_fill(0, count($one_people_lists), '/'))); + if (preg_match('/' . $combined_regex . '/i', $text, $matches)) { + $values = $tags->random(1); + return '@' . $values[0]; + } + + //On recherche si ça demande 2 tags + $two_people_lists = config('twitter.two_people_list'); + $combined_regex = implode('|', array_map('preg_quote', $two_people_lists, array_fill(0, count($two_people_lists), '/'))); + if (preg_match('/' . $combined_regex . '/i', $text, $matches)) { + $values = $tags->random(2); + return '@' . $values[0]. ' @' . $values[1]; + } + + //On recherche si ça demande 3 tags ou plus + $three_or_more_people_lists = config('twitter.three_or_more_people_list'); + $combined_regex = implode('|', array_map('preg_quote', $three_or_more_people_lists, array_fill(0, count($three_or_more_people_lists), '/'))); + if (preg_match('/' . $combined_regex . '/i', $text, $matches)) { + $values = $tags->random(3); + return '@' . $values[0]. ' @' . $values[1]. ' @' . $values[2]; + } + } + } + private function getHashtags($text){ + preg_match_all("/#[a-zA-Z0-9]+/", $text, $hashtags); + + if (isset($hashtags[0])) { + $hashtags = array_unique($hashtags[0]); + $blacklist = config('twitter.hashtag_to_blacklist'); + + // Comparer les deux tableaux et supprimer les correspondances du premier tableau + $resultLower = array_udiff($hashtags, $blacklist, 'strcasecmp'); + + // Construire la chaîne finale des hashtags restants + $final = implode(" ", $resultLower); + + return $final; + } + else{ + return ''; + } + } private function cosineSimilarity($text1, $text2) { $words1 = str_word_count(strtolower($text1), 1); @@ -105,7 +189,6 @@ class BotController extends Controller return $dotProduct / ($magnitude1 * $magnitude2); } - private function remove_emojis($string) { // Match all emojis (including extended ones) diff --git a/app/Http/Controllers/ContestController.php b/app/Http/Controllers/ContestController.php index 83adecd..5f87e5e 100644 --- a/app/Http/Controllers/ContestController.php +++ b/app/Http/Controllers/ContestController.php @@ -29,7 +29,7 @@ class ContestController extends Controller $i = 1; - while ($i < 50){ + while ($i < 10){ $results = $crawler->filterXPath('//div[@class="timeline-item "]')->each(function ($node) { $id = ($node->filterXPath('//*[@class="tweet-link"]'))->attr('href'); $created_at = ($node->filterXPath('//span[@class="tweet-date"]/a'))->attr('title'); diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index c91063b..3dcfdfb 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -18,7 +18,7 @@ class HomeController extends Controller public function history() { - $contests = Contest::where('participated',true)->orderby('updated_at','desc')->paginate(20); + $contests = Contest::where('participated', true)->orderby('updated_at', 'desc')->paginate(20); SEOTools::setTitle('Mon historique'); diff --git a/app/Jobs/ProcessTweet.php b/app/Jobs/ProcessTweet.php index 4f43632..e3e3d4f 100644 --- a/app/Jobs/ProcessTweet.php +++ b/app/Jobs/ProcessTweet.php @@ -213,12 +213,6 @@ class ProcessTweet implements ShouldQueue $phrasePlusFrequente = ($indexPhrasePlusFrequente !== null) ? $texts[$indexPhrasePlusFrequente] : null; if ($phrasePlusFrequente != null) { - // Supprimer les hashtags - $phrasePlusFrequente = preg_replace('/#\w+\s?/', '', $phrasePlusFrequente); - - // Supprimer les tags - $phrasePlusFrequente = preg_replace('/@\w+\s?/', '', $phrasePlusFrequente); - // Supprimer les emojis $phrasePlusFrequente = $this->remove_emojis($phrasePlusFrequente); diff --git a/routes/web.php b/routes/web.php index a3e1c6f..3fea0bc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -24,4 +24,6 @@ Route::get('/aplifier/list', [ContestController::class, 'twitterlist']); Route::get('/aplifier/search', [ContestController::class, 'searchcontest']); Route::get('/aplifier/news', [AccountController::class, 'tweetnews']); +Route::get('/tweet/{user}/{contest}', [\App\Http\Controllers\BotController::class, 'test']); +