4 Commits

6 changed files with 276 additions and 5 deletions

View File

@ -156,6 +156,7 @@ abstract class BrowserJob implements ShouldQueue
'--whitelisted-ips=""',
'--disable-dev-shm-usage',
'--user-data-dir=/home/seluser/profile/',
'--auto-open-devtools-for-tabs',
])->all());
return RemoteWebDriver::create(

View 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');
}
}

View File

@ -0,0 +1,174 @@
<?php
namespace App\Browser\Jobs\EpicGames;
use App\Browser\BrowserJob;
use App\Browser\Components\Hellcase\EpicGamesLogin;
use App\Models\JobInfo;
use App\Models\JobRun;
use App\Notification\Notifications\SimpleNotification;
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
{
// $browser->visit("https://bscscan.com/contractsVerified");
// sleep(3);
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");
$browser->driver->executeScript('window.open("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", "epicgames_account_email")->first()->value;
$password = $jobInfos->where("key", "epicgames_account_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->driver->executeScript('window.open("https://www.epicgames.com/store/en-US/free-games")');
// $browser->visit('https://www.epicgames.com/store/en-US/free-games');
$browser->waitForText("Free Games", 30, true);
$freeGamesLinkElements = $browser->driver->findElements(WebDriverBy::xpath('//a[contains(@aria-label, "Free Now")]'));
$freeGamesLinks = [];
foreach ($freeGamesLinkElements as $element) {
$freeGamesLinks[] = $element->getAttribute("href");
}
foreach ($freeGamesLinks as $link) {
$browser->visit($link);
$this->claimCurrentGame($browser);
}
}
private function claimCurrentGame(Browser $browser)
{
sleep(5);
$this->assertNotDetected($browser);
if ($this->unratedContent($browser)) {
throw new Exception("Le jeu demande un âge et datboi a la flemme de le mettre");
}
$this->waitForAndClickElementContainingText($browser, '//button', "Get", 30, true);
sleep(5);
$this->assertNotDetected($browser);
$browser->waitForText("Place Order", 30, true);
$browser->click("Place Order");
sleep(5);
$this->assertNotDetected($browser);
$browser->waitForText("Order Confirmation", 30, true);
$browser->click("Close");
sleep(5);
AllNotification::send(
new SimpleNotification($this->jobId, "Un jeu a été ajouté à votre bibliothèque", "Un jeu a été ajouté à votre bibliothèque EpicGames")
);
}
private function unratedContent(Browser $browser)
{
try {
$browser->waitForText("please provide your date of birth", 5, true);
return true;
} catch (Exception $_) {
return false;
}
}
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");
}
}

View File

@ -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);

View 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();
}
};

View File

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