GPTLogin.

Một NestJS API tự động đăng nhập ChatGPT qua puppeteer-real-browser, hỗ trợ xác thực OTP và lưu session sau khi đăng nhập thành công. Route /ask nhận prompt và chuyển thẳng vào ChatGPT bằng session đang sống — không qua API key, không tốn credit. Cron job chạy mỗi giờ để kiểm tra trạng thái session; nếu hết hạn hoặc bị kick, cảnh báo được đẩy ngay về Telegram để xử lý kịp thời.

Year2024
RoleSolo · backend + browser automation
Timeline6 tuần
Status● Live · self-hosted

01.Overview

Tổng quan

GPT-login ra đời từ một nhu cầu rất cụ thể: gọi ChatGPT từ internal tool qua HTTP mà không trả tiền theo token. Vấn đề đầu tiên gặp phải là Puppeteer chuẩn vào chatgpt.com thì chết ngay ở Cloudflare — fingerprint bị flag, Turnstile challenge không bao giờ pass. Vấn đề thứ hai: ChatGPT yêu cầu OTP qua email mỗi lần login, không thể hardcode luồng xác thực.

Giải pháp gói lại thành một service NestJS đứng trước browser: puppeteer-real-browser để bypass anti-bot, một state machine bốn trạng thái (idle → logging_in ⇄ waiting_otp → logged_in) cho phép client poll và submit OTP bất đồng bộ mà không cần block luồng chính. Session sau khi đăng nhập — cookies và localStorage — được serialize ra 2 file JSON để tái sử dụng cho mọi request /ask về sau. Cron job chạy mỗi giờ mở một browser tạm để kiểm tra session còn sống không; nếu hết hạn, alert được đẩy ngay về Telegram. Kết quả là một HTTP endpoint nhận prompt và trả về câu trả lời từ ChatGPT — không cần mở trình duyệt, không cần API key, phù hợp để nhúng vào bất kỳ dự án nào cần AI.

02.Features

Tính năng
  • 01
    Bypass Cloudflare + fingerprintpuppeteer-real-browser · Turnstile

    puppeteer-real-browser 1.4.x được dùng để patch navigator.webdriver và fix toàn bộ fingerprint — WebGL, Audio, Canvas — đủ để pass Cloudflare Turnstile mà không cần tự code resolver. Chrome chạy với user data dir riêng để giữ profile độc lập giữa các lần khởi động, kèm cờ --shm-size=2g đảm bảo bộ nhớ shared đủ cho headless chạy ổn định nhiều giờ liên tục mà không bị crash.

  • 02
    Flow login bất đồng bộBackground job + state machine + polling

    POST /gptlogin/login trả về ngay, login chạy nền. State machine 4 trạng thái: idle · logging_in · waiting_otp · logged_in / error. Client poll GET /status và submit OTP qua POST /submit-otp khi cần — mỗi step là một HTTP call rõ ràng.

  • 03
    OTP retry + detect3 attempts · polling 30s · password-or-otp

    POST /gptlogin/login trả về ngay lập tức — login chạy hoàn toàn nền, không block request. Luồng xác thực được quản lý bởi một state machine 4 trạng thái: idle · logging_in · waiting_otp · logged_in / error. Client chủ động poll GET /status để theo dõi tiến trình, và khi hệ thống chuyển sang waiting_otp thì submit mã xác thực qua POST /submit-otp — mỗi bước là một HTTP call độc lập, rõ ràng, dễ tích hợp vào bất kỳ client nào.

  • 04
    Session persistentcookies.json + localStorage.json

    Sau khi login thành công, toàn bộ cookies của chatgpt.comlocalStorage được dump ra 2 file JSON lưu trong session-data/. Mỗi lần gọi POST /ask, service tự load session từ file, inject vào browser, gửi message và scrape response — không cần đăng nhập lại. Nếu phát hiện nút "Log in" xuất hiện thay vì khung chat, hệ thống tự động kích hoạt luồng re-login và trả về session_expired: true để client biết cần xử lý tiếp.

  • 05
    Cron + Telegram alert@Cron("0 * * * *") · ✅ / ❌ / ⚠️

    Mỗi giờ vào đúng phút 0, một browser tách biệt được mở lên với session đang lưu, truy cập chatgpt.com và kiểm tra đơn giản: có nút "Log in" không. Kết quả được đẩy ngay về Telegram Bot API — ✅ session còn sống, ❌ session đã hết hạn, ⚠️ có lỗi trong quá trình check. Nếu chưa cấu hình Telegram token thì cron vẫn chạy bình thường, bỏ qua bước notify mà không crash.

03.Tech stack

Công nghệ sử dụng
APINestJS 11 · TypeScript 6 · @nestjs/config · @nestjs/jwt · @nestjs/passport · passport-jwt · @nestjs/schedule (cron)
Browserpuppeteer-real-browser 1.4.x · Google Chrome stable · anti-bot patch (navigator.webdriver, WebGL/Audio/Canvas) · Cloudflare Turnstile auto-pass
AuthJWT HS256 · secret từ .env · expiry 7 ngày · JwtAuthGuard cho route nhạy cảm · admin credentials qua biến môi trường
StateIn-memory state machine (idle / logging_in / waiting_otp / logged_in / error) · session-data/cookies.json + localStorage.json
NotificationsTelegram Bot API qua HTTPS · 3 mức (✅ / ❌ / ⚠️) · soft-fail khi thiếu BOT_TOKEN / CHAT_ID
DeployDocker Ubuntu 22.04 + Chrome + Node 20 · Xvfb cho headed-trong-container · shm_size 2GB · volume sync session-data/ giữa host và container

04.How it works

Kiến trúc tổng thể

Phần khó nhất không phải code, mà là không biết bước tiếp theo. Sau khi nhập email, ChatGPT có thể hỏi password — hoặc nhảy thẳng vào OTP — tuỳ trust score của session hiện tại. Thay vì hardcode thứ tự, bot polling mỗi 30 giây để tìm input kế tiếp, rồi classify theo selector và aria-label: thấy type="password" → chuyển sang bước password, thấy input[autocomplete="one-time-code"] → chuyển sang bước OTP. State machine đi theo những gì thực sự xuất hiện trên trang, không theo kịch bản cố định.

Sau khi #prompt-textarea xuất hiện (timeout 60s), bot lập tức ghi session: cookies = await page.cookies()localStorage = await page.evaluate(() => ({...window.localStorage})), dump ra 2 file JSON trong session-data/. Mọi request /ask sau đó đều load lại 2 file này trước khi navigate — session ấm, không cần đăng nhập lại. Cron @Cron("0 * * * *") chạy trên một browser tách biệt hoàn toàn, không can thiệp vào browser chính đang phục vụ /ask. Latency trung bình với session ấm: ~6-9s — phần lớn là thời gian ChatGPT generate, không phải overhead của service.

Design decision

GPT-login không phải dự án độc lập — nó là mảnh ghép để khép kín vòng lặp automation. Thay vì mở trình duyệt tay, copy prompt, dán kết quả, toàn bộ bước đó thu gọn thành một HTTP call. Bất kỳ dự án nào trong hệ thống cần AI xử lý một bước nào đó — phân tích, sinh nội dung, đánh giá — đều có thể gọi thẳng vào /ask và nhận về response mà không cần con người ngồi giữa.

05.Bình luận

Ý kiến của bạn

Chưa có bình luận nào.

Xem tiep
mysql-manager-mobile preview
M
MySQL Manager

MySQL admin client viết bằng Flutter — saved connections, browse databases → tables → rows, CRUD theo primary key với safety guard, và SQL shell tự do; chạy trên Android, iOS, macOS, Linux, Windows từ một codebase Dart duy nhất.

bank-notify-bridge preview
B
Bank Notify

BankNotify biến một chiếc điện thoại Android cũ thành cổng thanh toán DIY cho merchant nhỏ. App Flutter + Kotlin chạy nền trên điện thoại, đọc thông báo biến động số dư từ app ngân hàng và forward ngay về backend qua HTTP. Backend nhận thông báo, match với đơn hàng đang pending, rồi gọi callback để hoàn thành thanh toán — tất cả xảy ra trong vài giây, không cần tích hợp cổng thanh toán chính thức, không cần phí hàng tháng.

zoom-bot preview
Z
Zoom Bot

ZoomBot là một pool các bot Chrome tự động tham gia Zoom meeting và chờ lệnh điều khiển từ xa qua HTTP API. Mỗi bot chạy trên một instance Chrome riêng biệt, có lock riêng, hoàn toàn thread-safe — các bot không can thiệp lẫn nhau dù chạy song song. Từ một API call duy nhất, có thể điều khiển từng bot gửi chat, bật/tắt mic, bật/tắt video, rời phòng hoặc rejoin. Khi bot crash, hệ thống tự phát hiện và khởi động lại mà không cần can thiệp tay. Toàn bộ được viết bằng Python, Selenium và Flask — đủ gọn để chạy trên một máy chủ thông thường mà không cần hạ tầng phức tạp.

python-ocr preview
O
Captcha OCR

CaptchaOCR là một micro-service FastAPI nhận ảnh captcha 4 chữ số dưới dạng base64 và trả về số nguyên tương ứng. Model ddddocr pretrained được load một lần duy nhất lúc process khởi động — mọi request sau đó chỉ là inference, latency vài chục ms mỗi ảnh. Service deploy bằng PM2 với auto-restart và giới hạn RAM cứng, đảm bảo chạy ổn định dài hạn mà không cần giám sát thủ công.