Compare commits
1 Commits
update-chr
...
7079206658
Author | SHA1 | Date | |
---|---|---|---|
7079206658 |
5
.gitignore
vendored
5
.gitignore
vendored
@ -21,11 +21,6 @@ yarn-error.log
|
||||
/.nova
|
||||
/.vscode
|
||||
/.zed
|
||||
|
||||
# Python projet
|
||||
venv
|
||||
__pycache__
|
||||
|
||||
# Browser
|
||||
app/Browser/console
|
||||
app/Browser/screenshots
|
||||
|
47
app/Browser/Components/Hellcase/EpicGamesLogin.php
Normal file
47
app/Browser/Components/Hellcase/EpicGamesLogin.php
Normal file
@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace App\Browser\Components\Hellcase;
|
||||
|
||||
use Laravel\Dusk\Browser;
|
||||
use Laravel\Dusk\Component as BaseComponent;
|
||||
|
||||
class EpicGamesLogin extends BaseComponent
|
||||
{
|
||||
/**
|
||||
* Get the root selector for the component.
|
||||
*/
|
||||
public function selector(): string
|
||||
{
|
||||
return 'form';
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that the browser page contains the component.
|
||||
*/
|
||||
public function assert(Browser $browser): void
|
||||
{
|
||||
$browser->assertVisible($this->selector());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the element shortcuts for the component.
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public function elements(): array
|
||||
{
|
||||
return [
|
||||
'@email' => 'input#email',
|
||||
'@password' => 'input#password',
|
||||
'@signin-button' => 'button[type="submit"]',
|
||||
];
|
||||
}
|
||||
|
||||
public function fillForm(Browser $browser, $email, $password) {
|
||||
$browser->type('@email', $email);
|
||||
sleep(1);
|
||||
$browser->type('@password', $password);
|
||||
sleep(1);
|
||||
$browser->click('@signin-button');
|
||||
}
|
||||
}
|
133
app/Browser/Jobs/EpicGames/EpicGamesJob.php
Normal file
133
app/Browser/Jobs/EpicGames/EpicGamesJob.php
Normal file
@ -0,0 +1,133 @@
|
||||
<?php
|
||||
|
||||
namespace App\Browser\Jobs\EpicGames;
|
||||
|
||||
use App\Browser\BrowserJob;
|
||||
use App\Browser\Components\Hellcase\EpicGamesLogin;
|
||||
use App\Browser\Components\Hellcase\MainNav;
|
||||
use App\Browser\Jobs\Hellcase\HellcaseLoginQrCode;
|
||||
use App\Models\JobArtifact;
|
||||
use App\Models\JobInfo;
|
||||
use App\Models\JobRun;
|
||||
use App\Notification\NotificationBody\Hellcase\HellcaseNotificationDailyFreeBody;
|
||||
use App\Notification\NotificationBody\Hellcase\HellcaseNotificationLoginBody;
|
||||
use App\Notification\Notifications\Hellcase\HellcaseNotificationDailyFree;
|
||||
use App\Notification\Notifications\Hellcase\HellcaseNotificationLogin;
|
||||
use App\Notification\Providers\AllNotification;
|
||||
use Exception;
|
||||
use Facebook\WebDriver\WebDriverBy;
|
||||
use Illuminate\Contracts\Queue\ShouldBeUniqueUntilProcessing;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Laravel\Dusk\Browser;
|
||||
|
||||
class EpicGamesJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
||||
{
|
||||
private const APPROXIMATIVE_RUNNING_MINUTES = 2;
|
||||
|
||||
private const WEBSITE_URL = "https://www.epicgames.com/store/en-US/";
|
||||
|
||||
private JobRun $jobRun;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
Log::info("Constructing " . self::class);
|
||||
parent::__construct(3);
|
||||
}
|
||||
|
||||
public function run(Browser $browser): ?JobRun
|
||||
{
|
||||
sleep(40);
|
||||
Log::info("Running " . self::class);
|
||||
$this->jobRun = new JobRun([
|
||||
"job_id" => $this->jobId,
|
||||
"success" => false,
|
||||
]);
|
||||
$this->jobRun->save();
|
||||
|
||||
$this->goToEpicGamesWebsite($browser);
|
||||
$this->removePopups($browser);
|
||||
sleep(5);
|
||||
$this->signin($browser);
|
||||
$this->getFreeGames($browser);
|
||||
|
||||
$this->jobRun->success = true;
|
||||
$this->jobRun->save();
|
||||
|
||||
Log::info( self::class . " run ended");
|
||||
|
||||
return $this->jobRun;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function runTest(Browser $browser): ?JobRun
|
||||
{
|
||||
try {
|
||||
$this->goToEpicGamesWebsite($browser);
|
||||
sleep(2);
|
||||
$this->removePopups($browser);
|
||||
sleep(2);
|
||||
$this->signin($browser);
|
||||
return $this->makeSimpleJobRun(
|
||||
true,
|
||||
"Connexion réussie",
|
||||
"Datboi a réussi à se connecter sur EpicGames"
|
||||
);
|
||||
} catch (Exception $e) {
|
||||
return $this->makeSimpleJobRun(
|
||||
true,
|
||||
"Connexion échouée",
|
||||
"Datboi n'a pas réussi à se connecter sur EpicGames :\n" . $e->getMessage()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private function goToEpicGamesWebsite(Browser $browser)
|
||||
{
|
||||
sleep(3);
|
||||
$browser->visit(self::WEBSITE_URL);
|
||||
sleep(3);
|
||||
$this->assertNotDetected($browser);
|
||||
$browser->waitForText("Store", 30, true);
|
||||
}
|
||||
|
||||
private function signin(Browser $browser)
|
||||
{
|
||||
$browser->visit("https://store.epicgames.com/login?state=%2Fen-US%2F");
|
||||
sleep(5);
|
||||
$this->assertNotDetected($browser);
|
||||
$browser->waitForText("Sign In", 30, true);
|
||||
sleep(3);
|
||||
|
||||
$jobInfos = JobInfo::where("job_id", $this->jobId)->get();
|
||||
$email = $jobInfos->where("key", "email")->first()->value;
|
||||
$password = $jobInfos->where("key", "password")->first()->value;
|
||||
$browser->within(new EpicGamesLogin, function (Browser $browser) use ($email, $password) {
|
||||
$browser->fillForm($email, $password);
|
||||
});
|
||||
|
||||
sleep(40);
|
||||
}
|
||||
|
||||
private function getFreeGames(Browser $browser)
|
||||
{
|
||||
$browser->visit('https://www.epicgames.com/store/en-US/free-games');
|
||||
}
|
||||
|
||||
private function removePopups(Browser $browser)
|
||||
{
|
||||
// $browser->script('document.querySelector("div.app-modal")[0].remove();');
|
||||
// $browser->driver->executeScript('document.querySelector("div.app-modal")[0].remove();');
|
||||
}
|
||||
|
||||
private function assertNotDetected(Browser $browser)
|
||||
{
|
||||
try {
|
||||
$browser->waitForText("One more step", 10, true);
|
||||
} catch (Exception $_) {
|
||||
return;
|
||||
}
|
||||
throw new Exception("Détecté par cloudflare");
|
||||
}
|
||||
}
|
@ -21,25 +21,26 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
||||
{
|
||||
private const STEAM_LOGIN_THRESHOLD = 5 * 60; // 5 minutes
|
||||
private const APPROXIMATIVE_RUNNING_MINUTES = 2;
|
||||
private const WEBSITE_URL = "https://hellcase.com";
|
||||
|
||||
private JobRun $jobRun;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
Log::info("Constructing HellcaseJob");
|
||||
Log::info("Constructing " . self::class);
|
||||
parent::__construct(2);
|
||||
}
|
||||
|
||||
public function run(Browser $browser): ?JobRun
|
||||
{
|
||||
Log::info("Running HellcaseJob");
|
||||
Log::info("Running " . self::class);
|
||||
$this->jobRun = new JobRun([
|
||||
"job_id" => $this->jobId,
|
||||
"success" => false,
|
||||
]);
|
||||
$this->jobRun->save();
|
||||
|
||||
$browser->visit('https://hellcase.com');
|
||||
$browser->visit(self::WEBSITE_URL);
|
||||
$browser->waitForText("CASES", 30, true);
|
||||
$this->removePopups($browser);
|
||||
sleep(5);
|
||||
@ -50,7 +51,7 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
||||
$this->jobRun->success = true;
|
||||
$this->jobRun->save();
|
||||
|
||||
Log::info("HellcaseJob run ended");
|
||||
Log::info(self::class . " run ended");
|
||||
|
||||
return $this->jobRun;
|
||||
}
|
||||
@ -61,7 +62,7 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
||||
public function runTest(Browser $browser): ?JobRun
|
||||
{
|
||||
try {
|
||||
$browser->visit('https://hellcase.com');
|
||||
$browser->visit(self::WEBSITE_URL);
|
||||
$browser->waitForText("CASES", 30, true);
|
||||
$this->removePopups($browser);
|
||||
sleep(2);
|
||||
|
44
database/migrations/2025_02_27_180246_add_epic_games_job.php
Normal file
44
database/migrations/2025_02_27_180246_add_epic_games_job.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
$jobId = 3;
|
||||
\App\Models\Job::forcecreate([
|
||||
'id' => $jobId,
|
||||
'name' => 'Jeu gratuit Epic Games',
|
||||
'description' => 'Prends le jeu gratuit Epic games. Tourne tous les jours.',
|
||||
]);
|
||||
\App\Models\JobInfo::forceCreate([
|
||||
"key" => "epicgames_account_email",
|
||||
"name" => "E-mail",
|
||||
"description" => "L'adresse e-mail utilisée pour votre compte Epic Games.",
|
||||
"job_info_type_id" => 2,
|
||||
"job_id" => $jobId,
|
||||
], );
|
||||
\App\Models\JobInfo::forceCreate([
|
||||
"key" => "epicgames_account_password",
|
||||
"name" => "Mot de passe",
|
||||
"description" => "Le mot de passe utilisé pour votre compte Epic Games.",
|
||||
"job_info_type_id" => 3,
|
||||
"job_id" => $jobId,
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
\App\Models\Job::find(3)->delete();
|
||||
\App\Models\JobInfo::where('job_id', 3)->delete();
|
||||
}
|
||||
};
|
@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
use App\Browser\Jobs\EpicGames\EpicGamesJob;
|
||||
use App\Browser\Jobs\Hellcase\HellcaseJob;
|
||||
use App\Jobs\PruneOldJobRuns;
|
||||
use App\Services\BrowserJobsInstances;
|
||||
@ -21,3 +22,6 @@ Schedule::job(new PruneOldJobRuns)->monthly()->onOneServer()->withoutOverlapping
|
||||
// Jobs
|
||||
Schedule::job(new HellcaseJob)->daily()->onOneServer()->withoutOverlapping()->name('hellcase')->description('Hellcase job');
|
||||
// Schedule::job(new HellcaseJob)->everyMinute()->onOneServer()->withoutOverlapping()->name('hellcase')->description('Hellcase job');
|
||||
|
||||
Schedule::job(new EpicGamesJob())->daily()->onOneServer()->withoutOverlapping()->name('epic-games')->description('Epic Games job');
|
||||
|
||||
|
1
todo.md
1
todo.md
@ -1,7 +1,6 @@
|
||||
|
||||
# TODO
|
||||
|
||||
- Fix hellcase, fermer lespopups à chaque nouvelle visite
|
||||
- Voir si le scheduler fonctionne au démmarage
|
||||
- Mettre un timeout pour pas overwhelm le pc au démmarage
|
||||
- Image pour le join de giveaway
|
||||
|
Binary file not shown.
@ -1,20 +1 @@
|
||||
#!/bin/bash
|
||||
|
||||
# From undetected chromedriver docker
|
||||
#sudo docker run --rm -it -p 3389:3389 -v ./undetectedChromedriver:/root/.local/share/undetected_chromedriver/ ultrafunk/undetected-chromedriver:latest
|
||||
|
||||
# With undetected chromedriver patcher
|
||||
# Run the selenium/standalone-chrome:latest with a specific container name in the background
|
||||
sudo docker run -d --name standalone-chrome selenium/standalone-chrome:latest
|
||||
|
||||
sleep 5
|
||||
|
||||
# Copy the chromedriver binary from the container to the host
|
||||
sudo docker cp -L standalone-chrome:/bin/chromedriver ./chromedriver
|
||||
# Stop the container
|
||||
sudo docker stop standalone-chrome
|
||||
|
||||
sudo chmod 777 ./chromedriver
|
||||
|
||||
# Patch the chromedriver binary
|
||||
python3 ./patchChromedriver.py
|
||||
sudo docker run --rm -it -p 3389:3389 -v ./undetectedChromedriver:/root/.local/share/undetected_chromedriver/ ultrafunk/undetected-chromedriver:latest
|
||||
|
@ -1,8 +0,0 @@
|
||||
#!/bin/python3
|
||||
|
||||
import undetected_chromedriver as uc
|
||||
|
||||
options = uc.ChromeOptions()
|
||||
# Chromedriver is in current directory
|
||||
driver = uc.Chrome(options = options, browser_executable_path="/usr/bin/google-chrome", driver_executable_path="/home/ninluc/Documents/codage/DatBrowser/undetectedChromedriver/chromedriver")
|
||||
driver.get('https://nowsecure.nl')
|
@ -1,7 +1,6 @@
|
||||
# FROM selenium/standalone-chrome:108.0 AS final
|
||||
FROM selenium/standalone-chrome:latest AS final
|
||||
FROM selenium/standalone-chrome:108.0 AS final
|
||||
|
||||
COPY undetectedChromedriver/chromedriver /bin/chromedriver
|
||||
COPY undetectedChromedriver/chromedriver-linux /bin/chromedriver
|
||||
RUN mkdir -p /home/seluser/profile/
|
||||
|
||||
ENV TZ=Europe/Brussels
|
||||
|
Reference in New Issue
Block a user