🔧 Potrzebny programista (Node.js) — naprawa istniejącej aplikacji Chrome CDP
Jest gotowa aplikacja Windows, która działała przez miesiące, ale nagle przestała działać bez zmian w kodzie.
Co robi aplikacja:
Kolejno otwiera prawdziwe profile Chrome, wchodzi na threeplus.three.co.uk, klika Get Reward → My Codes, odczytuje 1 kod i zapisuje go w CSV. Działa jeden po drugim, bez równoległych uruchomień.
Problem:
Po pierwszym profilu Chrome nie zamyka się fizycznie, chrome.exe pozostaje, a następne uruchomienie kończy się błędem:
Błąd protokołu (Target.setAutoAttach): Cel zamknięty
Już sprawdzone (to NIE jest przyczyna):
JSON / konfiguracja / liczba profili
maxProcessCount
rewards_url / logika strony
antywirus / Defender
ścieżka Chrome / zgodność chrome.exe
tymczasowy czysty profil działa
aplikacja działała wczoraj bez zmian
Zadanie:
Naprawić poprawne zamknięcie Chrome / CDP, bez przepisywania aplikacji.
❌ Selenium / headless / proxy
✅ Prawdziwy Chrome, CDP, istniejące profile
💸 Liczyłem na niedrogą realizację
(w tym — ponieważ strona zmienia się kilka razy w miesiącu — regularnie będę się do Ciebie zwracał z płatnością za drobne poprawki).
Poniżej część oryginalnego zamówienia, kiedy zamawiałem aplikację.
🎯 Cel
Stworzyć aplikację desktopową (w Pythonie lub Node.js), która automatycznie otwiera prawdziwe profile Chrome, wchodzi do 20 kont Three+, klika Get Reward, przechodzi do My Codes, wyciąga kod w formacie TH3DC\d{9,} i dodaje go do odpowiedniego wiersza CSV.
⚙️ Funkcjonalność
Uruchamiana ręcznie na Windows (bez autostartu ani usług).
Działa przez prawdziwy Chrome z lokalnymi profilami (user-data-dir + profile-directory).
Nie używa trybu headless, Selenium, zapytań HTTP ani proxy.
Imituje ludzkie działania: uruchamianie przeglądarki, klikanie, przejścia, pauzy.
Obsługuje do 20 kont na uruchomienie (określone w konfiguracji).
Pomija konta, gdzie kod już znajduje się w CSV.
🔄 Algorytm działania
Krok 1: Ładowanie konfiguracji
Odczytuje settings.json (ścieżka chrome, lista profili, ścieżka CSV, opóźnienia).
Odczytuje CSV, określa konta bez kodu.
Krok 2: Przetwarzanie każdego profilu
Uruchamia Chrome z określonym profilem:
iniCopyEdit--user-data-dir=<user_data_dir>
--profile-directory=<profile_dir>
--remote-debugging-port=9222
Łączy się przez CDP (Playwright lub Puppeteer).
Otwiera rewards_url.
Czeka na pełne załadowanie strony.
Klika przycisk Get Reward (ważnym kliknięciem, nie .click()): ważne kliknięcie (przez Playwright/Puppeteer z mouse.move + mouse.down + mouse.up, bez .click()).
Czeka 3–5 sekund.
Krok 3: Odczytywanie kodu z My Codes
Przechodzi na stronę https://threeplus.three.co.uk/my-rewards
(lub klika Go to my codes, jeśli pojawiła się po Get Reward).
Szuka ostatniego kodu w formacie TH3DC\d{9,} w DOM (przez innerText / textContent).
Zapisuje w CSV w formacie:
CopyEditProfile_01,TH3DC103897998490
Zamyka przeglądarkę (ale nie wylogowuje się z konta).
Czeka na losowe opóźnienie (20–40 sekund).
Powtarza do 20 kont.
🧠 Jak dokładnie odczytywany jest kod (jasny algorytm)
OCR, zrzuty ekranu i okna modalne nie są używane.
Kod zawsze odczytywany jest ze strony My Codes - po kliknięciu "Get Reward"
Wygląd kodu: TH3DC103897998490 (wzór: TH3DC\d{9,}).
Odczyt: przez DOM (innerText, textContent, evaluate()).
⚙️ Konfiguracja (settings.json)
jsonCopyEdit{
"chrome_path": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
"profiles": [
{
"user_data_dir": "C:\\Users\\User\\AppData\\Local\\Google\\Chrome\\User Data",
"profile_dir": "Profile 1"
}
// ...
],
"rewards_url": "https://threeplus.three.co.uk/rewards",
"csv_path": "C:\\path\\to\\accounts.csv",
"delay_range_seconds": [90, 240]
}
📄 Format CSV
csvCopyEditaccount,code
profile_01,
profile_02,
🚫 Zabronione
| Działanie | Powód |
|---|
| Selenium/WebDriver | Łatwo wykrywalne, wywołuje SMS |
| Tryb headless | Wykrywane przez stronę |
| HTTP/API zapytania | Flutter Web, renderowanie Canvas |
| Wielowątkowe przetwarzanie | Wywołuje podejrzenie/blokadę |
| Proxy lub zmiana IP | Wywołuje ponowną autoryzację |
| Opóźnienia < 5 sekund | Nietypowe zachowanie |
📦 Oczekiwane pliki na wyjściu