Correction des différents bugs

This commit is contained in:
2024-11-27 16:30:59 +01:00
parent 780798ff25
commit cda2104b11
25 changed files with 1096 additions and 334 deletions

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use Exception;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Subscriber\Oauth\Oauth1;
@@ -306,60 +307,85 @@ class APIController extends Controller
public function unread($user)
{
$stack = $this->Oauth1($user);
try{
$stack = $this->Oauth1($user);
// Créer le client Guzzle avec le handler stack
$client = new Client([
'base_uri' => 'https://api.twitter.com/2/',
'handler' => $stack,
'proxy' => [
'http' => $user->proxy,
]
]);
// Effectuer la requête POST avec OAuth et les en-têtes personnalisés
$res = $client->get('badge_count/badge_count.json?supports_ntab_urt=true', [
'headers' => $this->twitterHeaders, // Ajouter les en-têtes ici
'auth' => 'oauth' // Assurez-vous que l'authentification OAuth est incluse
]);
$unred = json_decode($res->getBody()->getContents(), true);
// L'URL des deux liens
$url = 'https://myx.ovh/accounts/'.$user->id;
$keyboard = [
'inline_keyboard' => [
[
['text' => 'Cliquez ici pour plus d\'infos', 'url' => $url]
// Créer le client Guzzle avec le handler stack
$client = new Client([
'base_uri' => 'https://api.twitter.com/2/',
'handler' => $stack,
'proxy' => [
'http' => $user->proxy,
]
]
];
]);
// Convertir le tableau de clavier en JSON
$keyboardJson = json_encode($keyboard);
if ($unred['dm_unread_count'] > 0) {
// Effectuer la requête POST avec OAuth et les en-têtes personnalisés
$res = $client->get('badge_count/badge_count.json?supports_ntab_urt=true', [
'headers' => $this->twitterHeaders, // Ajouter les en-têtes ici
'auth' => 'oauth' // Assurez-vous que l'authentification OAuth est incluse
]);
$text = "Un nouveau message pour le compte ".$user->name;
$unred = json_decode($res->getBody()->getContents(), true);
// L'URL des deux liens
$url = 'https://myx.ovh/accounts/'.$user->id;
$keyboard = [
'inline_keyboard' => [
[
['text' => 'Cliquez ici pour plus d\'infos', 'url' => $url]
]
]
];
// Convertir le tableau de clavier en JSON
$keyboardJson = json_encode($keyboard);
if ($unred['dm_unread_count'] > 0) {
$text = "Un nouveau message pour le compte ".$user->name;
Http::get('https://api.telegram.org/bot6784810105:AAEq3emnkRwdyvCLC-iqdIjVJ2Ke6HwwGjg/sendMessage', [
'chat_id' => '1970698501', // Remplacez par votre chat_id
'text' => $text,
'reply_markup' => $keyboardJson
]);
}elseif ($unred['ntab_unread_count'] > 1) {
$text = "Une notification pour le compte ".$user->name;
Http::get('https://api.telegram.org/bot6784810105:AAEq3emnkRwdyvCLC-iqdIjVJ2Ke6HwwGjg/sendMessage', [
'chat_id' => '1970698501', // Remplacez par votre chat_id
'text' => $text,
'reply_markup' => $keyboardJson
]);
}
}catch (Exception $exception){
$text = "Le compte Twitter " . $user->name . " : " . $exception->getMessage();
// L'URL des deux liens
$url = 'https://myx.ovh/accounts/'.$user->id;
$keyboard = [
'inline_keyboard' => [
[
['text' => 'Cliquez ici pour plus d\'infos', 'url' => $url]
]
]
];
// Convertir le tableau de clavier en JSON
$keyboardJson = json_encode($keyboard);
// Envoyer le message avec les deux boutons
Http::get('https://api.telegram.org/bot6784810105:AAEq3emnkRwdyvCLC-iqdIjVJ2Ke6HwwGjg/sendMessage', [
'chat_id' => '1970698501', // Remplacez par votre chat_id
'text' => $text,
'reply_markup' => $keyboardJson
]);
}elseif ($unred['ntab_unread_count'] > 0) {
$text = "Une notification pour le compte ".$user->name;
Http::get('https://api.telegram.org/bot6784810105:AAEq3emnkRwdyvCLC-iqdIjVJ2Ke6HwwGjg/sendMessage', [
'chat_id' => '1970698501', // Remplacez par votre chat_id
'text' => $text,
'reply_markup' => $keyboardJson
]);
}
}

View File

@@ -2,27 +2,198 @@
namespace App\Http\Controllers;
use App\Http\Controllers\TwitterController;
use App\Models\Account;
use App\Models\Block;
use App\Models\Concour;
use App\Models\Contest;
use Carbon\Carbon;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Laravel\Dusk\Browser;
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;
use Illuminate\Http\Request;
use Throwable;
class BotController extends Controller
{
public function test($user,$contest){
public function index()
{
$response = Http::get('https://rtandfollow.com/apibot');
$tweets = $response->json();
$accounts = Account::where('enable', true)->get();
foreach($accounts as $account){
try{
$user = $account;
$twitter = new TwitterController();
$browser = $twitter->connexion($user);
$url = $browser->driver->getCurrentURL();
if($url == 'https://x.com/account/access'){
$browser->quit();
exec('taskkill /f /im chrome.exe');
}else{
shuffle($tweets);
$a = 1;
foreach($tweets as $status) {
$tweetid = $status['tweetid'];
$screen_name = $status['organizer']['screen_name'];
$text = $status['description'];
$concours = DB::table('concours')->where('tweet_id', $tweetid)->where('user', $user->id)->first();
$blocking = DB::table('blocks')->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')) {
try {
$tweetspecial = $this->getSpecialComment($text,$tweetid,$screen_name);
$tweetcomment = $this->getComment($text);
$tags = $this->getTags($text);
$hashtags = $this->getHashtags($text);
$follows = $this->getFollows($text);
$concours = Concour::create([
'description' => $text,
'tweet_id' => $tweetid,
'name' => $screen_name,
'fin' => $fin,
'user' => $user->id,
]);
$twitter->retweet($browser, $tweetid);
if (isset($tweetspecial) && isset($tags)) {
$retweet = $tweetspecial . ' ' . $tags . ' ' . $hashtags;
$encode = urlencode($retweet);
//On reply
$twitter->reply($browser, $tweetid, $encode);
}elseif(isset($tweetcomment) && isset($tags)) {
$comments = config('twitter.sentence_for_tag');
$comment = Arr::random($comments);
$retweet = $comment . ' ' . $tags . ' ' . $hashtags;
$encode = urlencode($retweet);
//On reply
$twitter->reply($browser, $tweetid, $encode);
}elseif(isset($tweetspecial)){
$retweet = $tweetspecial . ' ' . $hashtags;
$encode = urlencode($retweet);
//On reply
$twitter->reply($browser, $tweetid, $encode);
}elseif(isset($tweetcomment)){
$comments = config('twitter.sentence_for_random_comment');
$comment = Arr::random($comments);
$retweet = $comment . ' ' . $hashtags;
$encode = urlencode($retweet);
//On reply
$twitter->reply($browser, $tweetid, $encode);
}elseif(isset($tags)){
$retweet = $tags;
$encode = urlencode($retweet);
//On reply
$twitter->reply($browser, $tweetid, $encode);
}
//On follow le créateur
$twitter->follow($browser, $screen_name);
if(isset($follows)){
foreach ($follows as $follow){
$twitter->follow($browser, $follow);
}
}
//On like si besoin
preg_match("/LIKE/i", $text, $like);
if (isset($like[0])) {
$twitter->like($browser, $tweetid);
}
$yes = rand(0,2);
if($yes == 1){
$new = $this->combinefeeds()[0];
$title = (strlen($new['title']) > 205) ? substr($new['title'],0,205).'...' : $new['title'];
//$url = $this->urlshort($new['url']);
$short = $title.' '.$new['url'];
$short = urlencode($short);
//On tweet une info
$twitter->tweet($browser, $short);
}
$a++;
if ($a > 2) {
echo $user->name.' a bien participé; ';
break;
}
} catch (Throwable $e) {
report($e);
$a++;
if ($a > 2) {
break;
}
}
}
}
}
if (isset($browser) && $browser instanceof Browser) {
// Récupérez les cookies de la session actuelle
$cookies = $browser->driver->manage()->getCookies();
// Sauvegardez les cookies dans un fichier au format JSON
$user->cookies = serialize($cookies);
$user->save();
$browser->quit();
}
}
}catch (Throwable $e) {
report($e);
}
}
exec('taskkill /f /im chrome.exe');
}
public function process($user,$id){
$user = Account::find($user);
$contest = Contest::findOrFail($contest);
$contest = Contest::findOrFail($id);
$text = $contest->description;
@@ -77,14 +248,7 @@ class BotController extends Controller
// 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);
@@ -189,6 +353,18 @@ class BotController extends Controller
return $dotProduct / ($magnitude1 * $magnitude2);
}
private function getFollows(mixed $text)
{
preg_match_all("/\s@([\w_-]+)/", $text, $mentions);
if(isset($mentions[1])){
$mentions = array_unique($mentions[1]);
return $mentions;
}else{
return '';
}
}
private function remove_emojis($string)
{
// Match all emojis (including extended ones)
@@ -198,4 +374,6 @@ class BotController extends Controller
return $clear_string;
}
}
}

View File

@@ -8,6 +8,7 @@ use Artesaos\SEOTools\Facades\SEOTools;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use LanguageDetector\LanguageDetector;
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;
@@ -29,7 +30,7 @@ class ContestController extends Controller
$i = 1;
while ($i < 10){
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');
@@ -61,7 +62,14 @@ class ContestController extends Controller
$fake = Block::where('screen_name', $screen)->first();
$containsBlacklistedWord = preg_match('/' . implode('|', array_map('preg_quote', config('twitter.giveaway_to_blacklist'), ['/'])) . '/i', $text) === 1;
if(!$contest && !$fake && $nbretweet > 100 && $containsBlacklistedWord !== true) {
$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/",
@@ -101,6 +109,7 @@ class ContestController extends Controller
'nbretweet' => $nbretweet,
'nblike' => $nblike,
'nbreply' => $nbreply,
'created_at' => $created_at,
]);
}
@@ -125,33 +134,14 @@ class ContestController extends Controller
public function searchcontest()
{
$search = [
'giveaway',
'#concours',
'concours like',
'concours rt',
'concours follow',
'#JeuConcours',
'JeuConcours',
'jeu concours',
'offre follow gagnant',
'concours pour gagner',
'gagner rt',
'Gagnez rt follow',
'RT follow',
'concours rt like',
'concours rt fav',
'RT tweet Follow',
'concours rt follow',
'rt follow tas',
'rt follow tirage au sort',
'rt follow gagner',
'rt follow commente',
'rt suivre concours',
'rt suivez concours',
'rt suivre tirage au sort',
'rt suivre tas',
'concours remporter',
'remporter rt',
'concours tas le',
'concours résultats le rt',
'tirage au sort concours',
@@ -208,7 +198,14 @@ class ContestController extends Controller
$fake = Block::where('screen_name', $screen)->first();
$containsBlacklistedWord = preg_match('/' . implode('|', array_map('preg_quote', config('twitter.giveaway_to_blacklist'), ['/'])) . '/i', $text) === 1;
if (!$contest && !$fake && $nbretweet > 1000 && $containsBlacklistedWord !== true) {
$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 =
[
@@ -252,6 +249,7 @@ class ContestController extends Controller
'nbretweet' => $nbretweet,
'nblike' => $nblike,
'nbreply' => $nbreply,
'created_at' => $created_at,
]);
}
@@ -438,72 +436,72 @@ class ContestController extends Controller
}
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 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';
// 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 = [];
// 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);
// Chercher les dates au format JJ/MM ou JJ.MM
if (preg_match_all($pattern_jjmm, $string, $matches)) {
$correspondances = array_merge($correspondances, $matches[0]);
}
$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;
}
// 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
@@ -534,9 +532,9 @@ class ContestController extends Controller
}
}
public function all()
public function all()
{
$contests = Contest::where('fin', '>=', Carbon::now()->format('Y-m-d'))->where('participated', 0)->where('enable', 1)->paginate(20);
$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();
@@ -544,4 +542,4 @@ class ContestController extends Controller
return view('contests', compact('contests', 'count'));
}
}
}

View File

@@ -18,10 +18,10 @@ 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');
return view('history', compact('contests'));
}
}
}