A sophisticated job application automation bot built with Puppeteer Real Browser that can fill forms, solve captchas, and handle dynamic resume uploads.
- Automated Form Filling: Fills job application forms with user data
- Captcha Solving: Supports hCaptcha, reCAPTCHA, and Turnstile via Solvecaptcha API
- Dynamic Resume Upload: Waits for upload completion with real-time monitoring
- Job Scraping: Scrapes job postings from Lever jobs pages
- Batch Application: Apply to multiple jobs with status tracking
- Proxy Support: Rotate proxies to avoid IP bans
- Resume Capability: Resume interrupted application processes
- Status Tracking: Monitor progress and success rates
Real Browser Job Application Bot/
βββ data/
β βββ json/
β β βββ user_data.json # User application data
β β βββ global_elite_jobs.json # Scraped job postings
β β βββ job_application_tracker.json # Application status tracker
β βββ resumes/
β βββ resume.pdf # Resume file
βββ src/
β βββ core/
β β βββ JobApplicationBot.ts # Main bot logic
β βββ services/
β β βββ CaptchaService.ts # Captcha handling
β β βββ FormService.ts # Form filling
β β βββ SubmissionService.ts # Form submission
β β βββ JobScrapingService.ts # Job scraping
β β βββ JobApplicationManager.ts # Batch application management
β βββ types/
β β βββ index.ts # TypeScript type definitions
β βββ constants/
β β βββ index.ts # Application constants
β βββ utils/
β β βββ index.ts # Utility functions
β β βββ proxy.ts # Proxy management
β β βββ userData.ts # User data loading
β βββ config.ts # Configuration
β βββ index.ts # Main application entry
β βββ scrapeJobs.ts # Job scraping script
β βββ autoApply.ts # Batch application script
βββ package.json
npm installEdit data/json/user_data.json with your information:
{
"personalInfo": {
"name": "Your Name",
"email": "your.email@example.com",
"phone": "+1-555-123-4567",
"location": "Your City, State",
"company": "Your Company"
},
"links": {
"linkedin": "https://linkedin.com/in/yourprofile",
"twitter": "https://x.com/yourhandle",
"github": "https://github.com/yourusername",
"portfolio": "https://yourportfolio.com",
"globalElite": ""
},
"qualifications": {
"age18Plus": "Yes",
"authorizedToWork": "Yes",
"usState": "Your State"
},
"additionalInfo": {
"coverLetter": "Your cover letter text..."
},
"files": {
"resumePath": "./data/resumes/resume.pdf"
}
}Place your resume PDF file in data/resumes/resume.pdf
Create a .env file:
# Solvecaptcha API Key
SOLVECAPTCHA_API_KEY=your_api_key_here
# Proxy Configuration (Optional)
# Single proxy
PROXY_HOST=proxy.example.com
PROXY_PORT=8080
PROXY_USERNAME=username
PROXY_PASSWORD=password
# Or multiple proxies (comma-separated)
PROXY_LIST=proxy1.example.com:8080:user1:pass1,proxy2.example.com:8080:user2:pass2Edit src/config.ts to set your Solvecaptcha API key and other settings.
npm startScrape job postings from Lever:
npm run scrape-jobsThis will:
- Scrape jobs from
https://jobs.lever.co/global-elite - Save job data to
data/json/global_elite_jobs.json - Extract job titles, locations, URLs, and other details
Apply to multiple jobs with status tracking:
# Start new application process
npm run auto-apply
# Resume interrupted process
npm run auto-apply-resume
# Check current status
npm run auto-apply-statusThe batch application system:
- Loads jobs from
data/json/global_elite_jobs.json - Automatically adds
/applyto job URLs - Tracks progress in
data/json/job_application_tracker.json - Supports proxy rotation to avoid IP bans
- Provides detailed status reporting
Modify src/config.ts to adjust browser behavior:
BROWSER_CONFIG: {
headless: false, // Set to true for headless mode
args: [], // Additional browser arguments
customConfig: {}, // Custom browser configuration
turnstile: true, // Enable Turnstile support
connectOption: {}, // Connection options
disableXvfb: false, // Disable Xvfb
ignoreAllFlags: false, // Ignore browser flags
}Adjust timing settings for different scenarios:
TIMING: {
pageLoadWait: 3000, // Wait after page load
locationDropdownWait: 2000, // Wait for dropdowns
resumeProcessingWait: 3000, // Wait for resume upload
submissionWait: 5000, // Wait after submission
captchaCheckInterval: 5000, // Captcha check frequency
maxCaptchaAttempts: 60, // Max captcha attempts
captchaAppearanceTimeout: 10000, // Wait for captcha to appear
captchaProcessingWait: 2000, // Wait after solving captcha
}Handles different captcha types:
- hCaptcha: Detects and solves hCaptcha challenges
- reCAPTCHA: Supports reCAPTCHA v2 and v3
- Turnstile: Handles Cloudflare Turnstile
Fills application forms with:
- Personal information
- Contact details
- Links (LinkedIn, GitHub, etc.)
- Qualifications
- Cover letter
- Resume upload
Manages form submission:
- Detects submit buttons
- Handles captcha submission
- Monitors submission completion
- Validates success indicators
Scrapes job postings:
- Extracts job details from Lever pages
- Handles pagination
- Saves structured data to JSON
Manages batch applications:
- Loads job data from JSON
- Tracks application status
- Handles retry logic
- Provides progress reporting
- Supports proxy rotation
The application tracker provides detailed status information:
{
"startedAt": "2024-01-01T00:00:00.000Z",
"totalJobs": 100,
"appliedJobs": 50,
"successfulJobs": 45,
"failedJobs": 3,
"skippedJobs": 2,
"currentJobIndex": 50,
"isComplete": false,
"jobs": [...]
}The bot supports both single and multiple proxy configurations:
PROXY_HOST=proxy.example.com
PROXY_PORT=8080
PROXY_USERNAME=username
PROXY_PASSWORD=passwordPROXY_LIST=proxy1.example.com:8080:user1:pass1,proxy2.example.com:8080:user2:pass2Proxies are rotated per job application to avoid IP bans.
- Captcha Not Detected: Check Solvecaptcha API key and balance
- Resume Upload Fails: Ensure resume file exists and is accessible
- Form Fields Not Found: Update selectors in constants
- Proxy Connection Issues: Verify proxy credentials and connectivity
Enable debug logging by modifying the log level in src/utils/index.ts.
This project is for educational purposes. Please use responsibly and in accordance with website terms of service.
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
This tool is for educational and personal use only. Users are responsible for complying with website terms of service and applicable laws. Use at your own risk.