false, 'verify_host' => false, 'timeout' => '60'])); // Création des informations d'authentification $username = 'MyX'; $password = '@Gaudin95'; $credentials = base64_encode("$username:$password"); // Ajout des informations d'authentification à l'en-tête de la demande HTTP $client->setServerParameter('HTTP_AUTHORIZATION', 'Basic ' . $credentials); $client->setServerParameter('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'); $crawler = $client->request('GET', 'https://nitter-myx.fly.dev/i/lists/1686126753205387264'); $i = 1; while ($i < 25){ $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'); $text = ($node->filterXPath('//*[@class="tweet-content media-body"]'))->text(); $screen = ($node->filterXPath('//a[@class="username"]'))->text(); $fullname = ($node->filterXPath('//a[@class="fullname"]'))->text(); $imageNode = $node->filterXPath('//a[@class="still-image"]'); $nbretweet = ($node->filterXPath('//*[@class="tweet-stat"][2]'))->text(); $nbretweet = str_replace(',', '', $nbretweet); $nblike = ($node->filterXPath('//*[@class="tweet-stat"][4]'))->text(); $nblike = str_replace(',', '', $nblike); $nbreply = ($node->filterXPath('//*[@class="tweet-stat"][1]'))->text(); $nbreply = str_replace(',', '', $nbreply); //Modifications if ($imageNode->count() > 0) { $picture = $imageNode->attr('href'); $picture = urldecode($picture); $picture = str_replace('/pic/orig/', 'https://pbs.twimg.com/', $picture); }else{ $picture = null; } $screen = str_replace('@', '', $screen); $id = str_replace('/'.$screen.'/status/', '', $id); $id = str_replace('#m', '', $id); $contest = Contest::where('tweetid', $id)->first(); $fake = Block::where('screen_name', $screen)->first(); $containsBlacklistedWord = preg_match('/' . implode('|', array_map('preg_quote', config('twitter.giveaway_to_blacklist'), ['/'])) . '/i', $text) === 1; $language = new LanguageDetector(); $lang = $language->evaluate($text); $created_at = str_replace(' · ', ' ', $created_at); $created_at = Carbon::parse($created_at)->format('Y-m-d H:i:s'); $nowMinusOneMonth = Carbon::now()->subMonth(); if(!$contest && !$fake && $nbretweet > 100 && $containsBlacklistedWord !== true && $lang == 'fr' && $created_at >= $nowMinusOneMonth){ $regex_detect_rts = [ "/\bRT\b/", "/RETWEET/i", "/REPUBL/i", "/REPOST/i", ]; foreach ($regex_detect_rts as $regex_detect_rt) { //if (strstr($string, $url)) { // mine version preg_match($regex_detect_rt, $text, $invites); if (isset($invites[0])) { $rt = true; } } //On verifie que si RT if (isset($rt)) { $inputs = array(); //On recherche la date de fin du concours $date = $this->getDate($text); if ($date != null) { $fin = $date; } else { $fin = $this->getTwitterDate($created_at); } //On recherche la date de fin du concours if ($fin >= Carbon::now()->format('Y-m-d')) { Contest::create([ 'name' => $fullname, 'screen' => $screen, 'description' => $text, 'url' => 'https://x.com/'.$screen.'/status/'.$id, 'picture' => $picture, 'tweetid' => $id, 'fin' => $fin, 'nbretweet' => $nbretweet, 'nblike' => $nblike, 'nbreply' => $nbreply, 'created_at' => $created_at, ]); } } } }); $nextPageButton = $crawler->filterXPath('//div[@class="show-more"]/a')->link(); $url = $nextPageButton->getUri(); $crawler = $client->request('GET', $url); $i++; } $reponse = $client->getResponse(); var_dump($reponse); echo 'Fait !'; } public function searchcontest() { $search = [ '#concours', '#JeuConcours', 'JeuConcours', 'jeu concours', 'concours pour gagner', 'concours rt like', 'concours rt fav', 'concours remporter', 'concours tas le', 'concours résultats le rt', 'tirage au sort concours', 'concours résultat le rt' ]; $k = array_rand($search); $phrase = $search[$k]; $date = Carbon::now()->subDays(2)->format('Y-m-d'); $url = 'https://nitter-myx.fly.dev/search?f=tweets&q='.urlencode('min_replies:100 '.$phrase).'&e-nativeretweets=on&e-replies=on&&since='.$date; $client = new HttpBrowser(HttpClient::create(['verify_peer' => false, 'verify_host' => false, 'timeout' => '60'])); // Création des informations d'authentification $username = 'MyX'; $password = '@Gaudin95'; $credentials = base64_encode("$username:$password"); // Ajout des informations d'authentification à l'en-tête de la demande HTTP $client->setServerParameter('HTTP_AUTHORIZATION', 'Basic ' . $credentials); $client->setServerParameter('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'); $crawler = $client->request('GET', $url); $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'); $text = ($node->filterXPath('//*[@class="tweet-content media-body"]'))->text(); $screen = ($node->filterXPath('//a[@class="username"]'))->text(); $fullname = ($node->filterXPath('//a[@class="fullname"]'))->text(); $imageNode = $node->filterXPath('//a[@class="still-image"]'); $nbretweet = ($node->filterXPath('//*[@class="tweet-stat"][2]'))->text(); $nbretweet = str_replace(',', '', $nbretweet); $nblike = ($node->filterXPath('//*[@class="tweet-stat"][4]'))->text(); $nblike = str_replace(',', '', $nblike); $nbreply = ($node->filterXPath('//*[@class="tweet-stat"][1]'))->text(); $nbreply = str_replace(',', '', $nbreply); //Modifications if ($imageNode->count() > 0) { $picture = $imageNode->attr('href'); $picture = urldecode($picture); $picture = str_replace('/pic/orig/', 'https://pbs.twimg.com/', $picture); } else { $picture = null; } $screen = str_replace('@', '', $screen); $id = str_replace('/' . $screen . '/status/', '', $id); $id = str_replace('#m', '', $id); $contest = Contest::where('tweetid', $id)->first(); $fake = Block::where('screen_name', $screen)->first(); $containsBlacklistedWord = preg_match('/' . implode('|', array_map('preg_quote', config('twitter.giveaway_to_blacklist'), ['/'])) . '/i', $text) === 1; $language = new LanguageDetector(); $lang = $language->evaluate($text); $created_at = str_replace(' · ', ' ', $created_at); $created_at = Carbon::parse($created_at)->format('Y-m-d H:i:s'); $nowMinusOneMonth = Carbon::now()->subMonth(); if (!$contest && !$fake && $nbretweet > 500 && $containsBlacklistedWord !== true && $lang == 'fr' && $created_at >= $nowMinusOneMonth) { $regex_detect_rts = [ "/\bRT\b/", "/RETWEET/i", "/REPUBL/i", "/REPOST/i", "/LIKE/i", "/MENTION/i", ]; foreach ($regex_detect_rts as $regex_detect_rt) { //if (strstr($string, $url)) { // mine version preg_match($regex_detect_rt, $text, $invites); if (isset($invites[0])) { $rt = true; } } //On verifie que si RT if (isset($rt)) { $inputs = array(); //On recherche la date de fin du concours $date = $this->getDate($text); if ($date != null) { $fin = $date; } else { $fin = $this->getTwitterDate($created_at); } //On recherche la date de fin du concours if ($fin >= Carbon::now()->format('Y-m-d')) { Contest::create([ 'name' => $fullname, 'screen' => $screen, 'description' => $text, 'url' => 'https://x.com/' . $screen . '/status/' . $id, 'picture' => $picture, 'tweetid' => $id, 'fin' => $fin, 'nbretweet' => $nbretweet, 'nblike' => $nblike, 'nbreply' => $nbreply, 'created_at' => $created_at, ]); } } } }); $reponse = $client->getResponse(); var_dump($reponse); echo 'Fait !'; } public function import() { $response = Http::get('https://rtandfollow.com/apibot'); $tweets = $response->json(); foreach($tweets as $status) { $tweetid = $status['tweetid']; $screen_name = $status['organizer']['screen_name']; $text = $status['description']; $concours = Contest::where('tweetid', $tweetid)->first(); $blocking = Block::where('screen_name', $screen_name)->first(); $containsBlacklistedWord = preg_match('/' . implode('|', array_map('preg_quote', config('twitter.giveaway_to_blacklist'), ['/'])) . '/i', $text) === 1; //On verifie que le concours n'est pas dans la BDD ou que l'utilisateur n'est pas bloqué if (empty($concours) and empty($blocking) and $containsBlacklistedWord !== true) { //On recherche la date de fin du concours $fin = $status['fin']; if ($fin >= Carbon::now()->format('Y-m-d')) { Contest::create([ 'name' => $status['organizer']['name'], 'screen' => $screen_name, 'description' => $text, 'url' => $status['url'], 'picture' => '', 'tweetid' => $tweetid, 'fin' => $fin, 'nbretweet' => $status['nbretweet'], 'nblike' => $status['nblike'], 'nbreply' => $status['nbreply'], ]); } } } } public function getOrganizer($screen) { $organiser = Organizer::where('screen_name', $screen)->first(); if ($organiser){ return $organiser->id; }else { $client = new HttpBrowser(HttpClient::create(['verify_peer' => false, 'verify_host' => false, 'timeout' => '60'])); // Création des informations d'authentification $username = 'autokdo'; $password = '@Gaudin95'; $credentials = base64_encode("$username:$password"); // Ajout des informations d'authentification à l'en-tête de la demande HTTP $client->setServerParameter('HTTP_AUTHORIZATION', 'Basic ' . $credentials); $client->setServerParameter('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'); $crawler = $client->request('GET', 'https://nitter-autokdo.fly.dev/'.$screen); try{ $name = $crawler->filterXPath('//*[@class="profile-card-fullname"]')->text(); $description = $crawler->filterXPath('//*[@class="profile-bio"]')->text(); $profileUrl = $crawler->getUri(); $parsedUrl = parse_url($profileUrl); $baseTwitterUrl = $parsedUrl['scheme'] . '://' . $parsedUrl['host']; $image = $crawler->filterXPath('//meta[@property="og:image"]')->attr('content'); $url = str_replace("http://nitter-autokdo.fly.dev/pic/", "", $image); $url = urldecode($url); $url = 'https://'.$url; $response = Http::get($url); $contents = $response->body(); // Utilisation de getimagesize pour obtenir les informations sur l'image $imageInfo = getimagesizefromstring($contents); if ($imageInfo === false) { $filename = 'icon-96x96.png'; } $format = image_type_to_extension($imageInfo[2], false); $filename = uniqid() . '.' . $format; // Stocker l'image dans le répertoire 'ads' du stockage Storage::put('/public/logo/'.$filename, $contents); $organiser = Organizer::create([ 'name' => $name, 'screen_name' => $screen, 'description' => $description, 'logo' => $filename, 'url' => 'https://twitter.com/'.$screen, ]); return $organiser->id; } catch (\Exception $e) { dd($e); } } } private function getCategorie($data) { $client = new HttpBrowser(HttpClient::create(['verify_peer' => false, 'verify_host' => false, 'timeout' => '60'])); $client->request('GET', 'https://api.uclassify.com/v1/twittercontests/categories/classify/?readKey=c7ivTcoN2ycU&text='.$data); $json = $client->getResponse()->getContent(); $array = json_decode($json,true); $laravelArray = collect($array); $laravelArray = $laravelArray->sortDesc(); $value = $laravelArray->first(); if($value < '0.5'){ $categorie = '20'; } else{ $cat = $laravelArray->keys()->first(); if($cat == 'argent'){ $categorie = '1'; }elseif($cat == 'beaute'){ $categorie = '2'; }elseif($cat == 'console'){ $categorie = '3'; }elseif($cat == 'cuisine'){ $categorie = '4'; }elseif($cat == 'dvd'){ $categorie = '5'; }elseif($cat == 'enfant'){ $categorie = '6'; }elseif($cat == 'goodies'){ $categorie = '7'; }elseif($cat == 'invitation'){ $categorie = '8'; }elseif($cat == 'livre'){ $categorie = '9'; }elseif($cat == 'maison'){ $categorie = '10'; }elseif($cat == 'mode'){ $categorie = '11'; }elseif($cat == 'pc'){ $categorie = '12'; }elseif($cat == 'sport'){ $categorie = '13'; }elseif($cat == 'telephone'){ $categorie = '14'; }elseif($cat == 'voiture'){ $categorie = '15'; }elseif($cat == 'voyage'){ $categorie = '16'; }else{ $categorie = '20'; } } return $categorie; } private function getDate($string) { // Pattern pour détecter les dates au format JJ/MM ou JJ.MM $pattern_jjmm = '/\b(\d{1,2})(\/|\.)\d{1,2}\b/'; // Pattern pour détecter les dates du style "1 août" (ou autre mois en français) $mois_fr = array( 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre' ); $pattern_jj_mois_fr = '/\b(\d{1,2}) (' . implode('|', $mois_fr) . ')\b/i'; // Stocker les correspondances dans un tableau $correspondances = []; // Chercher les dates au format JJ/MM ou JJ.MM if (preg_match_all($pattern_jjmm, $string, $matches)) { $correspondances = array_merge($correspondances, $matches[0]); } // Chercher les dates du style "1 août" (ou autre mois en français) if (preg_match_all($pattern_jj_mois_fr, $string, $matches)) { // Convertir le mois en format numérique (1 pour janvier, 2 pour février, etc.) $mois_numerique = array_flip($mois_fr); foreach ($matches[2] as $index => $mois) { $matches[0][$index] = $matches[1][$index] . '/' . str_pad($mois_numerique[strtolower($mois)] + 1, 2, '0', STR_PAD_LEFT); } $correspondances = array_merge($correspondances, $matches[0]); } // Vérifier s'il y a des dates détectées if (empty($correspondances)) { return ""; // Retourne une chaîne vide si aucune date n'est trouvée } // Si plusieurs dates sont trouvées, trier les dates et récupérer la dernière usort($correspondances, function ($a, $b) { $dateA = strtotime($a); $dateB = strtotime($b); return $dateB - $dateA; // Tri décroissant }); // Récupérer la dernière date détectée après le tri $derniere_date = $correspondances[0]; // Convertir la dernière date au format "Y-m-d" (année-mois-jour) if (strpos($derniere_date, '/') !== false) { // Format JJ/MM list($jour, $mois) = explode('/', $derniere_date); $annee = date('Y'); } elseif (strpos($derniere_date, '.') !== false) { // Format JJ.MM list($jour, $mois) = explode('.', $derniere_date); $annee = date('Y'); } else { return ""; // Cas inattendu (ne devrait pas se produire) } // Convertir en date avec gestion des erreurs (ex. : février 30) try { $date_convertie = date('Y-m-d', strtotime("$annee-$mois-$jour")); } catch (Exception $e) { return ""; // Retourne une chaîne vide si la conversion échoue } return $date_convertie; } private function getTwitterDate($text) { // Utilisez une expression régulière pour extraire toutes les dates $pattern = '/(\w{3} \d{1,2}, \d{4})/'; preg_match_all($pattern, $text, $matches); if (!empty($matches[1])) { // Trier les dates pour obtenir la plus récente (dernière) usort($matches[1], function ($a, $b) { $dateA = Carbon::createFromFormat('M d, Y', $a); $dateB = Carbon::createFromFormat('M d, Y', $b); return $dateB->timestamp - $dateA->timestamp; // Tri décroissant }); // Récupérer la dernière date trouvée après le tri $lastDateString = $matches[1][0]; // Analyse de la date $date = Carbon::createFromFormat('M d, Y', $lastDateString); // Obtenez la date au format Y-m-d $formattedDate = $date->addDays(1)->format('Y-m-d'); return $formattedDate; } else { // Retourne la date actuelle +1 jour si aucune date n'est trouvée return Carbon::now()->addDays(1)->format('Y-m-d'); } } public function all() { $contests = Contest::where('fin', '>=', Carbon::now()->format('Y-m-d'))->where('participated', 0)->where('enable', 1)->orderby('id', 'desc')->paginate(20); $count = Contest::where('fin', '>=', Carbon::now()->format('Y-m-d'))->where('participated', 0)->where('enable', 1)->count(); SEOTools::setTitle('Les concours à venir'); return view('contests', compact('contests', 'count')); } }