Files
Microsoft-Rewards-Script/docs/schedule.md
Light 15f62963f8 V2 (#365)
* first commit

* Addition of a personalized activity manager and refactoring of the logic of activities

* Adding diagnostics management, including screenshot and HTML content, as well as improvements to humanize page interactions and +.

* Adding the management of newspapers and webhook settings, including filtering messages and improving the structure of the summaries sent.

* Adding a post-execution auto-date functionality, including options to update via Git and Docker, as well as a new configuration interface to manage these parameters.

* Adding accounts in Docker, with options to use an environmental file or online JSON data, as well as minimum validations for responsible accounts.

* Improving the Microsoft Rewards script display with a new headband and better log management, including colors and improved formatting for the console.

* v2

* Refactor ESLint configuration and scripts for improved TypeScript support and project structure

* Addition of the detection of suspended accounts with the gesture of the improved errors and journalization of banishment reasons

* Adding an integrated planner for programmed task execution, with configuration in Config.json and +

* Edit

* Remove texte

* Updating of documentation and adding the management of humanization in the configuration and +.

* Adding manual purchase method allowing users to spend points without automation, with monitoring of expenses and notifications.

* Correction of documentation and improvement of configuration management for manual purchase mode, adding complete documentation and appropriate banner display.

* Add comprehensive documentation for job state persistence, NTFY notifications, proxy configuration, scheduling, and auto-update features

- Introduced job state persistence documentation to track progress and resume tasks.
- Added NTFY push notifications integration guide for real-time alerts.
- Documented proxy configuration options for enhanced privacy and network management.
- Included scheduling configuration for automated script execution.
- Implemented auto-update configuration to keep installations current with Git and Docker options.

* Ajout d'Unt Système de Rapport d'Erreurs Communautaire pour Améliorerer le Débogage, incluant la Configuration et l'Envoi de Résumés D'Erreurs Anonyés à un webhook Discord.

* Mini Edit

* Mise à Jour du Readme.md pour Améliorerer la Présentation et La Claté, Ajout d'Un section sur les notifications en Temps Raine et Mise à Jour des badges pour la meille unibilité.

* Documentation update

* Edit README.md

* Edit

* Update README with legacy version link

* Improvement of location data management and webhooks, adding configurations normalization

* Force update for PR

* Improvement of documentation and configuration options for Cron integration and Docker use

* Improvement of planning documentation and adding a multi-pan-pancake in the daily execution script

* Deletion of the CommunityReport functionality in accordance with the project policy

* Addition of randomization of start -up schedules and surveillance time for planner executions

* Refactor Docker setup to use built-in scheduler, removing cron dependencies and simplifying configuration options

* Adding TOTP support for authentication, update of interfaces and configuration files to include Totp secret, and automatic generation of the Totp code when connecting.

* Fix [LOGIN-NO-PROMPT] No dialogs (xX)

* Reset the Totp field for email_1 in the accounts.example.json file

* Reset the Totp field for email_1 in the Readme.md file

* Improvement of Bing Research: Use of the 'Attacked' method for the research field, management of overlays and adding direct navigation in the event of entry failure.

* Adding a complete security policy, including directives on vulnerability management, coordinated disclosure and user security advice.

* Remove advanced environment variables section from README

* Configuration and dockerfile update: Passage to Node 22, addition of management of the purchase method, deletion of obsolete scripts

* Correction of the order of the sections in the Readme.md for better readability

* Update of Readm and Security Policy: Addition of the method of purchase and clarification of security and confidentiality practices.

* Improvement of the readability of the Readm and deletion of the mention of reporting of vulnerabilities in the security document.

* Addition of humanization management and adaptive throttling to simulate more human behavior in bot activities.

* Addition of humanization management: activation/deactivation of human gestures, configuration update and adding documentation on human mode.

* Deletion of community error report functionality to respect the privacy policy

* Addition of immediate banning alerts and vacation configuration in the Microsoft Rewards bot

* Addition of immediate banning alerts and vacation configuration in the Microsoft Rewards bot

* Added scheduling support: support for 12h and 24h formats, added options for time zone, and immediate execution on startup.

* Added window size normalization and page rendering to fit typical screens, with injected CSS styles to prevent excessive zooming.

* Added security incident management: detection of hidden recovery emails, automation blocking, and global alerts. Updated configuration files and interfaces to include recovery emails. Improved security incident documentation.

* Refactor incident alert handling: unified alert sender

* s

* Added security incident management: detect recovery email inconsistencies and send unified alerts. Implemented helper methods to manage alerts and compromised modes.

* Added heartbeat management for the scheduler: integrated a heartbeat file to report liveliness and adjusted the watchdog configuration to account for heartbeat updates.

* Edit webook

* Updated security alert management: fixed the recovery email hidden in the documentation and enabled the conclusion webhook for notifications.

* Improved security alert handling: added structured sending to webhooks for better visibility and updated callback interval in compromised mode.

* Edit conf

* Improved dependency installation: Added the --ignore-scripts option for npm ci and npm install. Updated comments in compose.yaml for clarity.

* Refactor documentation structure and enhance logging:
- Moved documentation files from 'information' to 'docs' directory for better organization.
- Added live logging configuration to support webhook logs with email redaction.
- Updated file paths in configuration and loading functions to accommodate new structure.
- Adjusted scheduler behavior to prevent immediate runs unless explicitly set.
- Improved error handling for account and config file loading.
- Enhanced security incident documentation with detailed recovery steps.

* Fix docs

* Remove outdated documentation on NTFY, Proxy, Scheduling, Security, and Auto-Update configurations; update Browser class to prioritize headless mode based on environment variable.

* Addition of documentation for account management and Totp, Docker Guide, and Update of the Documentation Index.

* Updating Docker documentation: simplification of instructions and adding links to detailed guides. Revision of configuration options and troubleshooting sections.

* Edit

* Edit docs

* Enhance documentation for Scheduler, Security, and Auto-Update features

- Revamped the Scheduler documentation to include detailed features, configuration options, and usage examples.
- Expanded the Security guide with comprehensive incident response strategies, privacy measures, and monitoring practices.
- Updated the Auto-Update section to clarify configuration, methods, and best practices for maintaining system integrity.

* Improved error handling and added crash recovery in the Microsoft Rewards bot. Added configuration for automatic restart and handling of local search queries when trends fail.

* Fixed initial point counting in MicrosoftRewardsBot and improved error handling when sending summaries to webhooks.

* Added unified support for notifications and improved handling of webhook configurations in the normalizeConfig and log functions.

* UPDATE LOGIN

* EDIT LOGIN

* Improved login error handling: added recovery mismatch detection and the ability to switch to password authentication.

* Added a full reference to configuration in the documentation and improved log and error handling in the code.

* Added context management for conclusion webhooks and improved user configuration for notifications.

* Mini edit

* Improved logic for extracting masked emails for more accurate matching during account recovery.
2025-09-26 18:58:33 +02:00

16 KiB
Raw Blame History

Scheduler & Automation

🚀 Built-in scheduler for automated daily execution
Set it and forget it


🎯 What is the Scheduler?

The built-in scheduler provides automated script execution at specified times without requiring external cron jobs or task schedulers.

Key Features

  • 📅 Daily automation — Run at the same time every day
  • 🌍 Timezone aware — Handles DST automatically
  • 🔄 Multiple passes — Execute script multiple times per run
  • 🏖️ Vacation mode — Skip random days monthly
  • 🎲 Jitter support — Randomize execution times
  • Immediate start — Option to run on startup

⚙️ Configuration

Basic Setup

{
  "schedule": {
    "enabled": true,
    "time": "09:00",
    "timeZone": "America/New_York",
    "runImmediatelyOnStart": true
  },
  "passesPerRun": 2
}

Advanced Setup with Vacation Mode

{
  "schedule": {
    "enabled": true,
    "time": "10:00",
    "timeZone": "Europe/Paris",
    "runImmediatelyOnStart": false
  },
  "passesPerRun": 3,
  "vacation": {
    "enabled": true,
    "minDays": 3,
    "maxDays": 5
  }
}

Configuration Options

Setting Default Description
enabled false Enable built-in scheduler
time "09:00" Daily execution time (24-hour format)
timeZone "UTC" IANA timezone identifier
runImmediatelyOnStart true Execute once on process startup
passesPerRun 1 Number of complete runs per execution
vacation.enabled false Skip random monthly off-block
vacation.minDays 3 Minimum vacation days
vacation.maxDays 5 Maximum vacation days

🚀 How It Works

Daily Scheduling

  1. Calculate next run — Timezone-aware scheduling
  2. Wait until time — Minimal resource usage
  3. Execute passes — Run script specified number of times
  4. Schedule next day — Automatic DST adjustment

Startup Behavior

Immediate Start Enabled (true)

  • Before scheduled time → Run immediately + wait for next scheduled time
  • After scheduled time → Run immediately + wait for tomorrow's time

Immediate Start Disabled (false)

  • Any time → Always wait for next scheduled time

Multiple Passes

  • Each pass processes all accounts through all tasks
  • Useful for maximum point collection
  • Higher passes = more points but increased detection risk

🏖️ Vacation Mode

Monthly Off-Blocks

Vacation mode randomly selects a contiguous block of days each month to skip execution.

Configuration

{
  "vacation": {
    "enabled": true,
    "minDays": 3,
    "maxDays": 5
  }
}

How It Works

  • Random selection — Different days each month
  • Contiguous block — Skip consecutive days, not scattered
  • Independent — Works with weekly random off-days
  • Logged — Shows selected vacation period

Example Output

[SCHEDULE] Selected vacation block this month: 2025-01-15 → 2025-01-18
[SCHEDULE] Skipping run - vacation mode (3 days remaining)

🌍 Supported Timezones

North America

  • America/New_York — Eastern Time
  • America/Chicago — Central Time
  • America/Denver — Mountain Time
  • America/Los_Angeles — Pacific Time
  • America/Phoenix — Arizona (no DST)

Europe

  • Europe/London — GMT/BST
  • Europe/Paris — CET/CEST
  • Europe/Berlin — CET/CEST
  • Europe/Rome — CET/CEST
  • Europe/Moscow — MSK

Asia Pacific

  • Asia/Tokyo — JST
  • Asia/Shanghai — CST
  • Asia/Kolkata — IST
  • Australia/Sydney — AEST/AEDT
  • Pacific/Auckland — NZST/NZDT

🎲 Randomization & Watchdog

Environment Variables

# Add random delay before first run (5-20 minutes)
$env:SCHEDULER_INITIAL_JITTER_MINUTES_MIN=5
$env:SCHEDULER_INITIAL_JITTER_MINUTES_MAX=20

# Add daily jitter to scheduled time (2-10 minutes)
$env:SCHEDULER_DAILY_JITTER_MINUTES_MIN=2
$env:SCHEDULER_DAILY_JITTER_MINUTES_MAX=10

# Kill stuck passes after N minutes
$env:SCHEDULER_PASS_TIMEOUT_MINUTES=180

# Run each pass in separate process (recommended)
$env:SCHEDULER_FORK_PER_PASS=true

Benefits

  • Avoid patterns — Prevents exact-time repetition
  • Protection — Kills stuck processes
  • Isolation — Process separation for stability

🖥️ Running the Scheduler

Development Mode

npm run ts-schedule

Production Mode

npm run build
npm run start:schedule

Background Execution

# Windows Background (PowerShell)
Start-Process -NoNewWindow -FilePath "npm" -ArgumentList "run", "start:schedule"

# Alternative: Windows Task Scheduler (recommended)
# Create scheduled task via GUI or schtasks command

📊 Usage Examples

Basic Daily Automation

{
  "schedule": {
    "enabled": true,
    "time": "08:00",
    "timeZone": "America/New_York"
  }
}

Perfect for morning routine — Catch daily resets

Multiple Daily Passes

{
  "schedule": {
    "enabled": true,
    "time": "10:00",
    "timeZone": "Europe/London",
    "runImmediatelyOnStart": false
  },
  "passesPerRun": 3
}

🔄 Maximum points with higher detection risk

Conservative with Vacation

{
  "schedule": {
    "enabled": true,
    "time": "20:00",
    "timeZone": "America/Los_Angeles"
  },
  "passesPerRun": 1,
  "vacation": {
    "enabled": true,
    "minDays": 4,
    "maxDays": 6
  }
}

🏖️ Natural patterns with monthly breaks


🐳 Docker Integration

services:
  microsoft-rewards-script:
    build: .
    environment:
      TZ: Europe/Paris
    command: ["npm", "run", "start:schedule"]
  • Uses passesPerRun from config
  • Single long-running process
  • No external cron needed

External Cron (Project Default)

services:
  microsoft-rewards-script:
    build: .
    environment:
      CRON_SCHEDULE: "0 7,16,20 * * *"
      RUN_ON_START: "true"
  • Uses run_daily.sh with random delays
  • Multiple cron executions
  • Lockfile prevents overlaps

📋 Logging Output

Scheduler Initialization

[SCHEDULE] Scheduler initialized for daily 09:00 America/New_York
[SCHEDULE] Next run scheduled for 2025-01-21 09:00:00 EST

Daily Execution

[SCHEDULE] Starting scheduled run (pass 1 of 2)
[SCHEDULE] Completed scheduled run in 12m 34s
[SCHEDULE] Next run scheduled for 2025-01-22 09:00:00 EST

Time Calculations

[SCHEDULE] Current time: 2025-01-20 15:30:00 EDT
[SCHEDULE] Target time: 2025-01-21 09:00:00 EDT  
[SCHEDULE] Waiting 17h 30m until next run

🛠️ Troubleshooting

Problem Solution
Scheduler not running Check enabled: true; verify timezone format
Wrong execution time Verify system clock; check DST effects
Memory growth Restart process weekly; monitor logs
Missed executions Check system sleep/hibernation; verify process

Debug Commands

# Test timezone calculation
node -e "console.log(new Date().toLocaleString('en-US', {timeZone: 'America/New_York'}))"

# Verify config syntax
node -e "console.log(JSON.parse((Get-Content 'src/config.json' | Out-String)))"

# Check running processes
Get-Process | Where-Object {$_.ProcessName -eq "node"}

Performance & Best Practices

Optimal Timing

  • 🌅 Morning (7-10 AM) — Catch daily resets
  • 🌆 Evening (7-10 PM) — Complete remaining tasks
  • Avoid peak hours — Reduce detection during high traffic

Pass Recommendations

  • 1 pass — Safest, good for most users
  • 2-3 passes — Balance of points vs. risk
  • 4+ passes — Higher risk, development only

Monitoring

  • Check logs regularly for errors
  • Monitor point collection trends
  • Verify scheduler status weekly

🔗 Alternative Solutions

Windows Task Scheduler

# Create scheduled task
schtasks /create /tn "MS-Rewards" /tr "npm start" /sc daily /st 09:00 /sd 01/01/2025

PowerShell Scheduled Job

# Register scheduled job
Register-ScheduledJob -Name "MSRewards" -ScriptBlock {cd "C:\path\to\project"; npm start} -Trigger (New-JobTrigger -Daily -At 9am)

Usage Examples

Basic Daily Run

{
  "schedule": {
    "enabled": true,
    "time": "08:00",
    "timeZone": "America/New_York"
  }
}

Multiple Daily Passes

{
  "schedule": {
    "enabled": true,
    "time": "10:00",
    "timeZone": "Europe/London",
    "runImmediatelyOnStart": false
  },
  "passesPerRun": 3
}

Development Testing

{
  "schedule": {
    "enabled": true,
    "time": "00:01",
    "timeZone": "UTC",
    "runImmediatelyOnStart": true
  }
}

Supported Timezones

Common IANA timezone identifiers:

North America

  • America/New_York (Eastern Time)
  • America/Chicago (Central Time)
  • America/Denver (Mountain Time)
  • America/Los_Angeles (Pacific Time)
  • America/Phoenix (Arizona - no DST)

Europe

  • Europe/London (GMT/BST)
  • Europe/Paris (CET/CEST)
  • Europe/Berlin (CET/CEST)
  • Europe/Rome (CET/CEST)
  • Europe/Moscow (MSK)

Asia Pacific

  • Asia/Tokyo (JST)
  • Asia/Shanghai (CST)
  • Asia/Kolkata (IST)
  • Australia/Sydney (AEST/AEDT)
  • Pacific/Auckland (NZST/NZDT)

UTC Variants

  • UTC (Coordinated Universal Time)
  • GMT (Greenwich Mean Time)

Running the Scheduler

Development Mode

npm run ts-schedule

Production Mode

npm run build
npm run start:schedule

Optional Randomization and Watchdog

You can introduce slight randomness to the start times and protect against stuck runs:

  • SCHEDULER_INITIAL_JITTER_MINUTES_MIN / SCHEDULER_INITIAL_JITTER_MINUTES_MAX

    • Adds a onetime random delay before the very first run after the scheduler starts.
    • Example: SCHEDULER_INITIAL_JITTER_MINUTES_MIN=5 and SCHEDULER_INITIAL_JITTER_MINUTES_MAX=20 delays the first run by 520 minutes.
  • SCHEDULER_DAILY_JITTER_MINUTES_MIN / SCHEDULER_DAILY_JITTER_MINUTES_MAX

    • Adds an extra random delay to each daily scheduled execution.
    • Example: 210 minutes of daily jitter to avoid exact same second each day.
  • SCHEDULER_PASS_TIMEOUT_MINUTES

    • Kills a stuck pass after N minutes (default 180). Useful if the underlying browser gets stuck.
  • SCHEDULER_FORK_PER_PASS

    • Defaults to true. When true, each pass runs in a child Node process so a stuck pass can be terminated without killing the scheduler. Set to false to run passes inprocess (not recommended).

Background Execution

# Linux/macOS (background process)
nohup npm run start:schedule > schedule.log 2>&1 &

# Windows (background service - requires additional setup)
# Recommend using Task Scheduler or Windows Service wrapper

Process Management

Long-Running Process

  • Scheduler runs continuously
  • Automatically handles timezone changes
  • Graceful handling of system clock adjustments

Memory Management

  • Minimal memory footprint between runs
  • Garbage collection after each execution
  • No memory leaks in long-running processes

Error Recovery

  • Failed runs don't affect future scheduling
  • Automatic retry on next scheduled time
  • Error logging for troubleshooting

Logging Output

Scheduler Events

[SCHEDULE] Scheduler initialized for daily 09:00 America/New_York
[SCHEDULE] Next run scheduled for 2025-09-21 09:00:00 EST
[SCHEDULE] Starting scheduled run (pass 1 of 2)
[SCHEDULE] Completed scheduled run in 12m 34s
[SCHEDULE] Next run scheduled for 2025-09-22 09:00:00 EST

Time Calculations

[SCHEDULE] Current time: 2025-09-20 15:30:00 EDT
[SCHEDULE] Target time: 2025-09-21 09:00:00 EDT
[SCHEDULE] Waiting 17h 30m until next run

Integration with Other Features

Docker Compatibility

  • Scheduler works in Docker containers
  • Alternative to external cron jobs
  • Timezone handling in containerized environments

Buy Mode Exclusion

  • Scheduler only runs automation mode
  • Buy mode (-buy) ignores scheduler settings
  • Manual executions bypass scheduler

Clustering

  • Scheduler runs only in single-process mode
  • Clustering disabled when scheduler is active
  • Use scheduler OR clustering, not both

Best Practices

Optimal Timing

  • Morning runs: Catch daily resets and new activities
  • Evening runs: Complete remaining tasks before midnight
  • Avoid peak hours: Reduce detection risk during high traffic

Timezone Selection

  • Use your local timezone for easier monitoring
  • Consider Microsoft Rewards server timezone
  • Account for daylight saving time changes

Multiple Passes

  • 2-3 passes: Good balance of points vs. detection risk
  • More passes: Higher detection risk
  • Single pass: Safest but may miss some points

Monitoring

  • Check logs regularly for errors
  • Monitor point collection trends
  • Verify scheduler is running as expected

Troubleshooting

Common Issues

Scheduler not running:

  • Check enabled: true in config
  • Verify timezone format is correct
  • Ensure no syntax errors in config.json

Wrong execution time:

  • Verify system clock is accurate
  • Check timezone identifier spelling
  • Consider daylight saving time effects

Memory growth over time:

  • Restart scheduler process weekly
  • Monitor system resource usage
  • Check for memory leaks in logs

Missed executions:

  • System was sleeping/hibernating
  • Process was killed or crashed
  • Clock was adjusted significantly

Debug Commands

# Test timezone calculation
node -e "console.log(new Date().toLocaleString('en-US', {timeZone: 'America/New_York'}))"

# Verify config syntax
node -e "console.log(JSON.parse(require('fs').readFileSync('src/config.json')))"

# Check process status
ps aux | grep "start:schedule"

Alternative Solutions

External Cron (Linux/macOS)

# Crontab entry for 9 AM daily
0 9 * * * cd /path/to/MSN-V2 && npm start

# Multiple times per day
0 9,15,21 * * * cd /path/to/MSN-V2 && npm start

Windows Task Scheduler

  • Create scheduled task via Task Scheduler
  • Set trigger for daily execution
  • Configure action to run npm start in project directory

Docker Cron

# Add to Dockerfile
RUN apt-get update && apt-get install -y cron
COPY crontab /etc/cron.d/rewards-cron
RUN crontab /etc/cron.d/rewards-cron

Docker + Built-in Scheduler

Au lieu d'utiliser cron, vous pouvez lancer le scheduler intégré dans le conteneur (un seul process longvivant) :

services:
  microsoft-rewards-script:
    build: .
    environment:
      TZ: Europe/Paris
    command: ["npm", "run", "start:schedule"]

Dans ce mode :

  • passesPerRun fonctionne (exécutera plusieurs passes à chaque horaire interne défini par src/config.json).
  • Vous n'avez plus besoin de CRON_SCHEDULE ni de run_daily.sh.

Docker + External Cron (par défaut du projet)

Si vous préférez la planification par cron système dans le conteneur (valeur par défaut du projet) :

  • Utilisez CRON_SCHEDULE (ex.: 0 7,16,20 * * *).
  • run_daily.sh introduit un délai aléatoire (par défaut 550 min) et un lockfile pour éviter les chevauchements.
  • RUN_ON_START=true déclenche une exécution immédiate au démarrage du conteneur (sans délai aléatoire).

Performance Considerations

System Resources

  • Minimal CPU usage between runs
  • Low memory footprint when idle
  • No network activity during waiting periods

Startup Time

  • Fast initialization (< 1 second)
  • Quick timezone calculations
  • Immediate scheduling of next run

Reliability

  • Robust error handling
  • Automatic recovery from failures
  • Consistent execution timing