* Script will run on container start, and continue to run daily at 5:00 am. The goal of this update was to add in-built cronjob support so that the script runs immediately on container start, then will schedule the script to run the daily at 5:00 am without requiring the user to manually create a cronjob. After starting the container and completing the first run, the container should remain active (running) but idle until the next scheduled run. Ideally, the next step will be to include support for environmental variables that will allow the user to customize when the script scheduled runs occur within the docker compose.yaml. * added --build to docker compose command instructions building/rebuilding the image (and the script) may reduce problems if folks make changes to their configs * Updated the crontab default to run twice daily by default, 5am and 11am * Update crontab Newline needed * Environmental variable support, custom scheduling This is a massive update that includes docker environmental variable support for all config options. If specified, the custom env var value will supersede the default values in the config.json. You do not need to change the values in the config.json if you set a custom env var. For example, if you have headless=false in the config.json, but set it as true in the compose.yaml, it will run as HEADLESS=true. If you do not specify a particular env var, the script will automatically use the default value. Please test and contribute wherever possible! * Fix scheduled runs, tidied up readme * timezone support Minor adjustment to attempt to fix timezone env var support * Run on start, npm script env Hopefully two fixes here, the container should again, by default, run on start, then continue per schedule. This defaults to true; however, can be optionally over-ridden in the compose.yaml with the env var RUN_ON_START=false. If set to false, the script should only run on the specified cron schedule. I also passed the TZ write into the npm start command, rather than just the container overall so it should show the proper time. * Keep docker running after run_on_start to wait for cron Accidentally set it up like a run_once, this should keep the container active after run_on_start to wait for the next schedule. * improve order of cmd This should (1) set time zone for script, (2) run once if set, then (3) idle for scheduled cron job. It was a little hacky before, this should be tidier. * updated compose to auto-restart container Noticed the container was exited this am, likely after automated updated to system, adding restart: unless-stopped to compose should keep container running in such circumstances. * Update env vars in readme
Microsoft-Rewards-Script
Automated Microsoft Rewards script, however this time using TypeScript, Cheerio and Playwright.
Under development, however mainly for personal use!
How to setup
- Download or clone source code
- Run
npm ito install the packages - Change
accounts.example.jsontoaccounts.jsonand add your account details - Change
config.jsonto your liking - Run
npm run buildto build the script - Run
npm run startto start the built script
Notes
- If you end the script without closing the browser window first (only with headless as false), you'll be left with hanging chrome instances using resources. Use taskmanager to kill these or use the included
npm run kill-chrome-winscript. (Windows) - If you automate this script, set it to run at least 2 times a day to make sure it picked up all tasks, set
"runOnZeroPoints": falseso it doesn't run when no points are found.
Docker (Experimental)
- Download the source code
- Make changes to your
accounts.json - Headless mode must be enabled when using Docker. You can do this using the
HEADLESS=trueenvironmental variable in docker run or docker compose.yaml (see below). Environmental variables are always prioritized over the values in config.json. - The container will run scheduled. Customize your schedule using the
CRON_START_TIMEenvironmental variable. Use crontab.guru if you're unsure how to create a cron schedule. - Note: the container will add between 5 and 50 minutes of randomized variability to your scheduled start times.
Option 1: build and run with docker run
-
Build or re-build the container image with:
docker build -t microsoft-rewards-script-docker . -
Run the container with:
docker run --name netsky -d \ -e TZ=America/New_York \ -e HEADLESS=true \ -e SEARCH_DELAY_MIN=10000 \ -e SEARCH_DELAY_MAX=20000 \ -e CLUSTERS=1 \ -e CRON_START_TIME="0 5,11 * * *" \ microsoft-rewards-script-docker -
Optionally, change any environmental variables other than
HEADLESS, which must stay=true -
You can view logs with
docker logs netsky.
Option 2: use docker compose
-
A basic docker compose.yaml has been provided.
-
Optionally, change any environmental variables other than
HEADLESS, which must stay=true -
Build or rebuild and start the container using
docker compose up -d --build -
You can view logs with
docker logs netsky
Config
| Setting | Description | Default | Docker Environmental Variable |
|---|---|---|---|
| baseURL | MS Rewards page | https://rewards.bing.com |
BASE_URL |
| sessionPath | Path to where you want sessions/fingerprints to be stored | sessions (In ./browser/sessions) |
SESSION_PATH |
| headless | If the browser window should be visible be ran in the background | false (Browser is visible) |
HEADLESS (must be set to =true for docker) |
| runOnZeroPoints | Run the rest of the script if 0 points can be earned | false (Will not run on 0 points) |
RUN_ON_ZERO_POINTS |
| clusters | Amount of instances ran on launch, 1 per account | 1 (Will run 1 account at the time) |
CLUSTERS |
| saveFingerprint | Re-use the same fingerprint each time | false (Will generate a new fingerprint each time) |
SAVE_FINGERPRINT |
| workers.doDailySet | Complete daily set items | true |
WORKERS_DO_DAILY_SET |
| workers.doMorePromotions | Complete promotional items | true |
WORKERS_DO_MORE_PROMOTIONS |
| workers.doPunchCards | Complete punchcards | true |
WORKERS_DO_PUNCH_CARDS |
| workers.doDesktopSearch | Complete daily desktop searches | true |
WORKERS_DO_DESKTOP_SEARCH |
| workers.doMobileSearch | Complete daily mobile searches | true |
WORKERS_DO_MOBILE_SEARCH |
| globalTimeout | The length before the action gets timeout | 30000 (30 seconds) |
GLOBAL_TIMEOUT |
| searchSettings.useGeoLocaleQueries | Generate search queries based on your geo-location | false (Uses EN-US generated queries) |
SEARCH_SETTINGS_USE_GEO_LOCALE_QUERIES |
| scrollRandomResults | Scroll randomly in search results | true |
SEARCH_SETTINGS_SCROLL_RANDOM_RESULTS |
| searchSettings.clickRandomResults | Visit random website from search result | true |
SEARCH_SETTINGS_CLICK_RANDOM_RESULTS |
| searchSettings.searchDelay | Minimum and maximum time in miliseconds between search queries | min: 10000 (10 seconds) max: 20000 (20 seconds) |
SEARCH_DELAY_MIN SEARCH_DELAY_MAX |
| searchSettings.retryMobileSearch | Keep retrying mobile searches until completed (indefinite) | false |
SEARCH_SETTINGS_RETRY_MOBILE_SEARCH |
| webhook.enabled | Enable or disable your set webhook | false |
WEBHOOK_ENABLED |
| webhook.url | Your Discord webhook URL | null |
WEBHOOK_URL="" |
| cronStartTime | Scheduled script run-time, only available for docker implementation | 0 5,11 * * * (5:00 am, 11:00 am daily) |
CRON_START_TIME="" |
| Run the script immediately when the Docker container starts | true |
RUN_ON_START |
Features
- Multi-Account Support
- Session Storing
- 2FA Support
- Headless Support
- Discord Webhook Support
- Desktop Searches
- Configurable Tasks
- Microsoft Edge Searches
- Mobile Searches
- Emulated Scrolling Support
- Emulated Link Clicking Support
- Geo Locale Search Queries
- Completing Daily Set
- Completing More Promotions
- Solving Quiz (10 point variant)
- Solving Quiz (30-40 point variant)
- Completing Click Rewards
- Completing Polls
- Completing Punchcards
- Solving This Or That Quiz (Random)
- Solving ABC Quiz
- Completing Shopping Game
- Completing Gaming Tab
- Clustering Support
- Proxy Support
- Docker Support (experimental)
- Automatic scheduling (via Docker)
Disclaimer
Your account may be at risk of getting banned or suspended using this script, you've been warned!
Use this script at your own risk!