THIS IS A HOTFIX TO THE CURRENT STATE TO FIX SOME DOCKER AND STABILITY RELATED ISSUES. ALSO TO REMOVE SOME DEAD CODE.
A PROPER VERSION OF "V2" IS BEING WORKED ON!

- Migrated configuration files from JSONC to JSON
- Removed deprecated setup scripts
- Updated dependencies in package.json and package-lock.json
- Updated README with expanded setup, configuration, and feature documentation
This commit is contained in:
TheNetsky
2025-11-10 10:56:57 +01:00
parent bd96aeb20c
commit 2738c85030
24 changed files with 855 additions and 1556 deletions

462
README.md
View File

@@ -2,208 +2,378 @@
# Quick Setup (Recommended)
**Easiest way to get started — download and run:**
1. **Clone the branch** or download the zip.
2. **Run the setup script:**
* **Windows:** double-click `setup/setup.bat` or run it from a command prompt
* **Linux / macOS / WSL:**
1. Clone this repository or download the latest release ZIP.
2. Run the setup script:
* **Windows:**
Double-click `setup/setup.bat`
* **Linux / macOS / WSL:**
```bash
bash setup/setup.sh
```
* **Alternative (any platform):**
* **Alternative (any platform):**
```bash
npm run setup
```
3. **Follow the setup prompts.** The script will:
* Rename `accounts.example.json` → `accounts.json`
* Ask for Microsoft account credentials
3. Follow the prompts — the setup script will:
* Copy `accounts.example.json` → `accounts.json`
* Ask for your Microsoft account credentials
* Remind you to review `config.json`
* Install dependencies (`npm install`)
* Build the project (`npm run build`)
* Build (`npm run build`)
* Optionally start the script
**That's it — the setup script handles the rest.**
That's it — the setup script handles the rest.
---
# Advanced Setup Options
### Nix Users
1. Install Nix from [https://nixos.org/](https://nixos.org/)
2. Run:
If using Nix:
```bash
./run.sh
```
### Manual Setup (if setup script fails)
1. Copy `src/accounts.example.json` → `src/accounts.json` and add accounts.
2. Edit `src/config.json` as needed.
3. Install dependencies:
```bash
npm install
```
4. Build:
```bash
npm run build
```
5. Start:
```bash
npm run start
```
1. Copy:
```bash
cp src/accounts.example.json src/accounts.json
```
2. Edit `src/accounts.json` and `src/config.json`.
3. Install and build:
```bash
npm install
npm run build
npm run start
```
---
# Docker Setup (Experimental)
# Docker Setup (Recommended for Scheduling)
**Before starting**
## Before Starting
* Remove local `/node_modules` and `/dist` if previously built.
* Remove old Docker volumes if upgrading from older versions.
* You can reuse your old `accounts.json`.
* Remove local `/node_modules` and `/dist` if you previously built.
* Remove old Docker volumes when upgrading from v1.4 or earlier.
* You can reuse older `accounts.json`.
**Quick Docker (recommended for scheduling)**
1. Clone v2 and configure `accounts.json`.
2. Ensure `config.json` has `"headless": true`.
## Quick Start
1. Clone v2 and configure `accounts.json`
2. Ensure `config.json` has `"headless": true`
3. Edit `compose.yaml`:
* Set `TZ` (timezone)
* Set `CRON_SCHEDULE` (use crontab.guru for help)
* Set your timezone (`TZ`)
* Set cron schedule (`CRON_SCHEDULE`)
* Optional: `RUN_ON_START=true`
4. Start:
```bash
docker compose up -d
```
5. Monitor logs:
```bash
docker logs microsoft-rewards-script
```
```bash
docker compose up -d
The container randomly delays scheduled runs by approximately 550 minutes to appear more natural (configurable, see notes below).
## Example compose.yaml
```yaml
services:
microsoft-rewards-script:
image: ghcr.io/your-org/microsoft-rewards-script:latest
container_name: microsoft-rewards-script
restart: unless-stopped
# Mount your configuration and persistent session storage
volumes:
# Read-only config files from your working directory into the container
- ./src/accounts.json:/usr/src/microsoft-rewards-script/dist/accounts.json:ro
- ./src/config.json:/usr/src/microsoft-rewards-script/dist/config.json:ro
# Persist browser sessions/fingerprints between runs
- ./sessions:/usr/src/microsoft-rewards-script/dist/sessions
# Optional: persist job state directory (if you set jobState.dir to a folder inside dist/)
# - ./jobstate:/usr/src/microsoft-rewards-script/dist/jobstate
environment:
# Timezone for scheduling
TZ: "Europe/Amsterdam"
# Node runtime
NODE_ENV: "production"
# Cron schedule for automatic runs (UTC inside container)
# Example: run at 07:00, 16:00, and 20:00 every day
CRON_SCHEDULE: "0 7,16,20 * * *"
# Run immediately on container start (in addition to CRON_SCHEDULE)
RUN_ON_START: "true"
# Randomize scheduled start-time between MIN..MAX minutes
# Comment these to use defaults (about 550 minutes)
# MIN_SLEEP_MINUTES: "5"
# MAX_SLEEP_MINUTES: "50"
# Optional: disable randomization entirely
# SKIP_RANDOM: "true"
# Optional: limit resources if desired
deploy:
resources:
limits:
cpus: "1.0"
memory: "1g"
```
5. Monitor:
```bash
docker logs microsoft-rewards-script
```
> The container randomly delays scheduled runs by ~550 minutes to appear more natural.
---
# Usage Notes
* **Headless=false cleanup:** If you stop the script without closing browser windows, use Task Manager / `npm run kill-chrome-win` to close leftover instances.
* **Scheduling advice:** Run at least twice daily. Use `"runOnZeroPoints": false` in config to skip runs with no points.
* **Multiple accounts:** Use `clusters` in `config.json` to run accounts in parallel.
### compose.yaml Notes
- `volumes`
- `accounts.json` and `config.json` are mounted read-only to avoid accidental in-container edits. Edit them on the host.
- `sessions` persists your login sessions and fingerprints across restarts and updates.
- If you enable `jobState.enabled` and set `jobState.dir`, consider mounting that path as a volume too.
- `CRON_SCHEDULE`
- Standard crontab format. Use a site like crontab.guru to generate expressions.
- The schedule is evaluated inside the container; ensure `TZ` matches your desired timezone.
- `RUN_ON_START`
- If `"true"`, the script runs once immediately when the container is started, then on the cron schedule.
- Randomization
- By default, a randomized delay prevents runs from happening at exactly the same time every day.
- You can tune it with `MIN_SLEEP_MINUTES` and `MAX_SLEEP_MINUTES`, or disable with `SKIP_RANDOM`.
---
# Configuration Reference
Edit `src/config.json` to customize behavior.
Edit `src/config.json` to customize the bots behavior.
### Core Settings (examples)
## Core
| Setting | Description | Default |
| ----------------- | -------------------------------: | -------------------------: |
| `baseURL` | Microsoft Rewards URL | `https://rewards.bing.com` |
| `sessionPath` | Session/fingerprint storage | `sessions` |
| `headless` | Run browser in background | `false` |
| `parallel` | Run mobile/desktop tasks at once | `true` |
| `runOnZeroPoints` | Run when no points available | `false` |
| `clusters` | Concurrent account instances | `1` |
### Fingerprint Settings
| Setting | Description | Default |
| ------------------------- | ------------------------: | ------: |
| `saveFingerprint.mobile` | Reuse mobile fingerprint | `false` |
| `saveFingerprint.desktop` | Reuse desktop fingerprint | `false` |
### Task Settings (important ones)
| Setting | Description | Default |
| -------------------------- | -----------------: | ------: |
| `workers.doDailySet` | Do daily set | `true` |
| `workers.doMorePromotions` | Promotional offers | `true` |
| `workers.doPunchCards` | Punchcard tasks | `true` |
| `workers.doDesktopSearch` | Desktop searches | `true` |
| `workers.doMobileSearch` | Mobile searches | `true` |
| `workers.doDailyCheckIn` | Daily check-in | `true` |
| `workers.doReadToEarn` | Read-to-earn | `true` |
### Search Settings
| Setting | Description | Default |
| ---------------------------------------- | ---------------------: | ------------: |
| `searchOnBingLocalQueries` | Use local queries | `false` |
| `searchSettings.useGeoLocaleQueries` | Geo-based queries | `false` |
| `searchSettings.scrollRandomResults` | Random scrolling | `true` |
| `searchSettings.clickRandomResults` | Random link clicks | `true` |
| `searchSettings.searchDelay` | Delay between searches | `3-5 minutes` |
| `searchSettings.retryMobileSearchAmount` | Mobile retry attempts | `2` |
### Advanced Settings
| Setting | Description | Default |
| ------------------------- | --------------------------: | ------------------: |
| `globalTimeout` | Action timeout | `30s` |
| `logExcludeFunc` | Exclude functions from logs | `SEARCH-CLOSE-TABS` |
| `proxy.proxyGoogleTrends` | Proxy Google Trends | `true` |
| `proxy.proxyBingTerms` | Proxy Bing Terms | `true` |
### Webhook Settings
| Setting | Description | Default |
| --------------------------- | ---------------------------: | ------: |
| `webhook.enabled` | Enable Discord notifications | `false` |
| `webhook.url` | Discord webhook URL | `null` |
| `conclusionWebhook.enabled` | Summary-only webhook | `false` |
| `conclusionWebhook.url` | Summary webhook URL | `null` |
| Setting | Description | Default |
|----------|-------------|----------|
| `baseURL` | Microsoft Rewards base URL | `https://rewards.bing.com` |
| `sessionPath` | Folder to store browser sessions | `sessions` |
| `dryRun` | Simulate without running tasks | `false` |
---
# Features
## Browser
**Account & Session**
| Setting | Description | Default |
|----------|-------------|----------|
| `browser.headless` | Run browser invisibly | `false` |
| `browser.globalTimeout` | Timeout for actions | `"30s"` |
* Multi-account support
* Persistent sessions & fingerprints
* 2FA support & passwordless options
---
**Automation**
## Fingerprinting
* Headless operation & clustering
* Selectable task sets
* Proxy support & scheduling (Docker)
| Setting | Description | Default |
|----------|-------------|----------|
| `fingerprinting.saveFingerprint.mobile` | Reuse mobile fingerprint | `true` |
| `fingerprinting.saveFingerprint.desktop` | Reuse desktop fingerprint | `true` |
**Search & Rewards**
---
* Desktop & mobile searches
* Emulated browsing, scrolling, clicks
* Daily sets, promotions, punchcards, quizzes
## Execution
**Interactions**
| Setting | Description | Default |
|----------|-------------|----------|
| `execution.parallel` | Run desktop and mobile at once | `false` |
| `execution.runOnZeroPoints` | Run even with no points | `false` |
| `execution.clusters` | Concurrent account clusters | `1` |
* Quiz solving (10 & 3040 point variants)
* Polls, ABC quizzes, “This or That” answers
---
**Notifications**
## Job State
* Discord webhooks and summary webhooks
* Extensive logs for debugging
| Setting | Description | Default |
|----------|-------------|----------|
| `jobState.enabled` | Save last job state | `true` |
| `jobState.dir` | Directory for job data | `""` |
---
## Workers (Tasks)
| Setting | Description | Default |
|----------|-------------|----------|
| `doDailySet` | Complete daily set | `true` |
| `doMorePromotions` | Complete more promotions | `true` |
| `doPunchCards` | Complete punchcards | `true` |
| `doDesktopSearch` | Perform desktop searches | `true` |
| `doMobileSearch` | Perform mobile searches | `true` |
| `doDailyCheckIn` | Complete daily check-in | `true` |
| `doReadToEarn` | Complete Read-to-Earn | `true` |
| `bundleDailySetWithSearch` | Combine daily set and searches | `true` |
---
## Search
| Setting | Description | Default |
|----------|-------------|----------|
| `search.useLocalQueries` | Use local query list | `true` |
| `search.settings.useGeoLocaleQueries` | Use region-based queries | `true` |
| `search.settings.scrollRandomResults` | Random scrolling | `true` |
| `search.settings.clickRandomResults` | Random link clicking | `true` |
| `search.settings.retryMobileSearchAmount` | Retry mobile searches | `2` |
| `search.settings.delay.min` | Minimum delay between searches | `1min` |
| `search.settings.delay.max` | Maximum delay between searches | `5min` |
---
## Query Diversity
| Setting | Description | Default |
|----------|-------------|----------|
| `queryDiversity.enabled` | Enable multiple query sources | `true` |
| `queryDiversity.sources` | Query providers | `["google-trends", "reddit", "local-fallback"]` |
| `queryDiversity.maxQueriesPerSource` | Limit per source | `10` |
| `queryDiversity.cacheMinutes` | Cache lifetime | `30` |
---
## Humanization
| Setting | Description | Default |
|----------|-------------|----------|
| `humanization.enabled` | Enable human behavior | `true` |
| `stopOnBan` | Stop immediately on ban | `true` |
| `immediateBanAlert` | Alert instantly if banned | `true` |
| `actionDelay.min` | Minimum delay per action (ms) | `500` |
| `actionDelay.max` | Maximum delay per action (ms) | `2200` |
| `gestureMoveProb` | Chance of random mouse movement | `0.65` |
| `gestureScrollProb` | Chance of random scrolls | `0.4` |
---
## Vacation Mode
| Setting | Description | Default |
|----------|-------------|----------|
| `vacation.enabled` | Enable random pauses | `true` |
| `minDays` | Minimum days off | `2` |
| `maxDays` | Maximum days off | `4` |
---
## Risk Management
| Setting | Description | Default |
|----------|-------------|----------|
| `enabled` | Enable risk-based adjustments | `true` |
| `autoAdjustDelays` | Adapt delays dynamically | `true` |
| `stopOnCritical` | Stop on critical warning | `false` |
| `banPrediction` | Predict bans based on signals | `true` |
| `riskThreshold` | Risk tolerance level | `75` |
---
## Retry Policy
| Setting | Description | Default |
|----------|-------------|----------|
| `maxAttempts` | Maximum retry attempts | `3` |
| `baseDelay` | Initial retry delay | `1000` |
| `maxDelay` | Maximum retry delay | `30s` |
| `multiplier` | Backoff multiplier | `2` |
| `jitter` | Random jitter factor | `0.2` |
---
## Proxy
| Setting | Description | Default |
|----------|-------------|----------|
| `proxy.proxyGoogleTrends` | Proxy Google Trends | `true` |
| `proxy.proxyBingTerms` | Proxy Bing Terms | `true` |
---
## Notifications
| Setting | Description | Default |
|----------|-------------|----------|
| `notifications.webhook.enabled` | Enable Discord webhook | `false` |
| `notifications.webhook.url` | Discord webhook URL | `""` |
| `notifications.conclusionWebhook.enabled` | Enable summary webhook | `false` |
| `notifications.conclusionWebhook.url` | Summary webhook URL | `""` |
| `notifications.ntfy.enabled` | Enable Ntfy push alerts | `false` |
| `notifications.ntfy.url` | Ntfy server URL | `""` |
| `notifications.ntfy.topic` | Ntfy topic name | `"rewards"` |
---
## Logging
| Setting | Description | Default |
|----------|-------------|----------|
| `excludeFunc` | Exclude from console logs | `["SEARCH-CLOSE-TABS", "LOGIN-NO-PROMPT", "FLOW"]` |
| `webhookExcludeFunc` | Exclude from webhook logs | `["SEARCH-CLOSE-TABS", "LOGIN-NO-PROMPT", "FLOW"]` |
| `redactEmails` | Hide emails in logs | `true` |
---
# Account Configuration
Edit `src/accounts.json`:
```json
{
"accounts": [
{
"enabled": true,
"email": "email_1@outlook.com",
"password": "password_1",
"totp": "",
"recoveryEmail": "your_email@domain.com",
"proxy": {
"proxyAxios": true,
"url": "",
"port": 0,
"username": "",
"password": ""
}
},
{
"enabled": false,
"email": "email_2@outlook.com",
"password": "password_2",
"totp": "",
"recoveryEmail": "your_email@domain.com",
"proxy": {
"proxyAxios": true,
"url": "",
"port": 0,
"username": "",
"password": ""
}
}
]
}
```
---
# Features Overview
- Multi-account and session handling
- Persistent browser fingerprints
- Parallel task execution
- Proxy and retry support
- Human-like delays and scrolling
- Full daily set automation
- Mobile and desktop search support
- Vacation and risk protection
- Webhook and Ntfy notifications
- Docker scheduling support
---
# Disclaimer
**Use at your own risk.** Automation may cause suspension or banning of Microsoft Rewards accounts. This project is provided for educational purposes only. The maintainers are **not** responsible for account actions taken by Microsoft.
Use at your own risk.
Automation of Microsoft Rewards may lead to account suspension or bans.
This software is provided for educational purposes only.
The authors are not responsible for any actions taken by Microsoft.