Skip to content
 
 

Latest commit

 

History

1,116 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A "simple" python application that uses Selenium to help with your M$ Rewards

Static Badge MIT Maintained GitHub contributors GitHub issues

Important

If you are multi-accounting and abusing the service for which this is intended - DO NOT COMPLAIN ABOUT BANS!!!

Caution

Use it at your own risk, M$ may ban your account (and I would not be responsible for it).

Based on signals from the community, the following practices appear to reduce ban risk:

  • Do not run more than one account at a time.
  • Do not use more than one phone number per 5 accounts.
  • Do not redeem more than one reward per day.

Table of Contents

Project History

  • Originally created by @charlesbel as Microsoft-Rewards-Farmer.
  • Forked and significantly refactored/maintained by @klept0 as MS-Rewards-Farmer, with contributions from a community of volunteers.
  • The @klept0 fork was archived in January 2026. At that point, the upstream master branch was non-functional, and the develop branch was in a better state but still not fully working. This repository was created in February 2026 to continue the project, incorporating a series of fixes and improvements that had been developed independently to overcome the limitations of the upstream version.
  • As of March 2026, this fork is in a working state. It has been tested for over 2 weeks with consistent results. The script may occasionally fail due to browser timeouts or transient issues -- running it in a loop with a short delay (e.g. 5 minutes) between executions works well in practice.
  • In July 2026, Microsoft rolled out a major redesign of the Rewards page, breaking this automation. The new Rewards experience is a React single-page application with a substantially different DOM structure, rendering the existing Selenium selectors ineffective. Additionally, Microsoft appears to have reduced the total number of points earnable per day, which has drawn widespread complaints from the Rewards community on Reddit and similar platforms. Mobile search points also appear to no longer be collectable through browser automation. Work is underway to adapt the code to the new page structure.
  • After testing a new version of the script with the new version of the Microsoft Rewards page we merged the experimental branch to main.

Installation

This project uses uv for dependency management.

  1. Install dependencies:

    uv sync --no-dev

    For development (includes dev dependencies):

    uv sync
  2. Make sure you have Chrome installed.

  3. (Windows Only) Make sure Visual C++ redistributable DLLs are installed.

    If they're not, install the current "vc_redist.exe" from this link and reboot your computer.

  4. Generate a configuration file:

    uv run python main.py -C
  5. Open the generated config.yaml file and edit it with your information.

    The generated config contains sensible defaults that have been proven working in testing. You should only need to fill in your account credentials.

    [!WARNING] The browser.language setting must be en-US. Changing it to a different language will break the login flow, as some steps rely on English labels in the absence of better selectors. You can change browser.geolocation to your country code.

    The totp field is not mandatory, only enter your TOTP key if you use it for 2FA (if omitting, don't keep it as an empty string, remove the line completely).

    The proxy field is not mandatory, you can omit it if you don't want to use proxy (don't keep it as an empty string, remove the line completely).

    You can add or remove accounts according to your will.

  6. Run the script:

    uv run python main.py

    (Windows Only) You can also run the script wrapper that will detect your python installation and re-run the script if it crashes using .\run.ps1 (.\run.ps1 -help for more information). To allow script execution without confirmation, use the following command: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser.

  7. (Windows Only) You can set up automatic execution with Windows Task Scheduler.

    Run the register_task.ps1 script from an elevated (Administrator) PowerShell in the repository root. It creates the scheduled task directly -- no manual import step:

    .\register_task.ps1

    By default the task runs run.ps1 daily at 03:00. You can override the time, task name, account, or retry count:

    .\register_task.ps1 -RunAt "07:30" -Retries 5

    To run the script as soon as the computer is on instead of at a fixed time, use -Schedule Startup:

    .\register_task.ps1 -Schedule Startup

    The startup trigger waits a short delay (default -StartupDelay PT5M, i.e. 5 minutes) so the network is up before the run.

    [!CAUTION] Use a single trigger (Daily or Startup, not both). Two runs in close succession have no mutual exclusion and would overload the Microsoft endpoints, which can get the activity flagged as suspicious.

    The script registers the task to run whether or not you are logged on, so it will prompt for your Windows password (required by Windows to store the credentials). Re-running the script updates the existing task in place.

    Advanced: -TargetScript <path> launches a different wrapper instead of run.ps1, and -RunLevel Highest registers the task elevated (only needed if your wrapper requires admin; run.ps1 does not).

    [!NOTE] Because a logged-off task runs in a non-interactive session, keep MS-Rewards-Farmer in headless mode (browser.visible: false, the default). Visible-mode runs require an interactive logon and will not work from a logged-off scheduled task.

    To remove the task later:

    Unregister-ScheduledTask -TaskName "MS-Rewards-Farmer" -Confirm:$false

Configuration file

All the variable listed here can be added to you config.yaml configuration file, and the values represented here show the default ones, if not said otherwise.

Caution

Please don't use this as your configuration. It's an example to show configuration possibilities, not the best configuration for you. Doing so will only prevent default values from being used, and it'll result in preventing updates (such as ignored activities). You should only add a variable to your configuration file if you want to change it.

Note

search.type is replaced with independent channel switches. Remove any existing search: section and use channel.desktop.enabled and channel.mobile.enabled instead.

# config.yaml
apprise: # 'apprise' is the name of the service used for notifications https://github.com/caronc/apprise
  enabled: true  # set it to false to disable apprise globally, can be overridden with command-line arguments.
  notify:
    incomplete-activity: true # set it to false to disable notifications for incomplete activities
    uncaught-exception: true # set it to false to disable notifications for uncaught exceptions
    login-code: true # set it to false to disable notifications for the temporary M$ Authenticator login code
  summary: ON_ERROR # set it to ALWAYS to always receive a summary about your points progression or errors, or to 
  # NEVER to never receive a summary, even in case of an error. 
  urls: # add apprise urls here to receive notifications on the specified services :
    # https://github.com/caronc/apprise#supported-notifications
    # Empty by default.
    - discord://{WebhookID}/{WebhookToken} # Exemple url 
browser:
  geolocation: US # Replace with your country code https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2.
  # Detected by default, can be overridden with command-line arguments.
  language: en-US # Replace with your language code https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes.
  # Detected by default, can be overridden with command-line arguments.
  visible: false # set it to true to show the browser window, can be overridden with command-line arguments.
  proxy: null # set the global proxy using the 'http://user:pass@host:port' syntax.
  # Override per-account proxies. Can be overridden with command-line arguments.
logging:
  level: INFO # Set to DEBUG, WARNING, ERROR or CRITICAL to change the level of displayed information in the terminal
  # See https://docs.python.org/3/library/logging.html#logging-levels. Can be overridden with command-line arguments.
retries:
  backoff-factor: 120 # The base wait time between each retries. Multiplied by two each try.
  max: 4 # The maximal number of retries to do
  strategy: EXPONENTIAL # Set it to CONSTANT to use the same delay between each retries.
  # Else, increase it exponentially each time.
cooldown:
  min: 300 # The minimal wait time between two searches/activities
  max: 600 # The maximal wait time between two searches/activities
channel:
  desktop:
    enabled: true # Complete dashboard activities and desktop Bing searches.
  mobile:
    enabled: true # Complete Read to Earn. Mobile Bing searches are not performed.
accounts: # The accounts to use. You can put zero, one or an infinite number of accounts here.
  # Empty by default, can be overridden with command-line arguments.
  - email: Your Email 1 # replace with your email
    password: Your Password 1 # replace with your password
    totp: 0123 4567 89ab cdef # replace with your totp, or remove it
    proxy: http://user:pass@host1:port # replace with your account proxy, or remove it
  - email: Your Email 2 # replace with your email
    password: Your Password 2 # replace with your password
    totp: 0123 4567 89ab cdef # replace with your totp, or remove it
    proxy: http://user:pass@host2:port # replace with your account proxy, or remove it

Usage

usage: main.py [-h] [-c CONFIG] [-C] [-v] [-l LANG] [-g GEO] [-em EMAIL] [-pw PASSWORD]
               [-totp TOTP] [-p PROXY] [--desktop-channel | --no-desktop-channel]
               [--mobile-channel | --no-mobile-channel] [-da] [-d] [-r]

A simple bot that uses Selenium to farm M$ Rewards in Python

options:
  -h, --help            show this help message and exit
  -c CONFIG, --config CONFIG
                        Specify the configuration file path
  -C, --create-config   Create a fillable configuration file with basic settings and given
                        ones if none exists
  -v, --visible         Visible browser (Disable headless mode)
  -l LANG, --lang LANG  Language (ex: en) see https://serpapi.com/google-languages for options
  -g GEO, --geo GEO     Searching geolocation (ex: US) see https://serpapi.com/google-trends-
                        locations for options (should be uppercase)
  -em EMAIL, --email EMAIL
                        Email address of the account to run. Only used if a password is given.
  -pw PASSWORD, --password PASSWORD
                        Password of the account to run. Only used if an email is given.
  -totp TOTP, --totp TOTP
                        TOTP secret for 2FA. Only used if email and password are given.
  -p PROXY, --proxy PROXY
                        Global Proxy, supports http/https/socks4/socks5 (overrides config per-
                        account proxies) `(ex: http://user:pass@host:port)`
  --desktop-channel, --no-desktop-channel
                        Enable or disable the desktop channel
  --mobile-channel, --no-mobile-channel
                        Enable or disable the mobile Read-to-Earn channel
  -da, --disable-apprise
                        Disable Apprise notifications, useful when developing
  -d, --debug           Set the logging level to DEBUG
  -r, --reset           Delete the session folder and temporary files and kill all chrome
                        processes. Can help resolve issues.

At least one account should be specified, either using command line arguments or a
configuration file. All specified arguments will override the configuration file values

You can display this message at any moment using python main.py -h.

Features

  • Bing desktop searches with current User-Agents
  • Mobile Read to Earn
  • Complete the daily set automatically
  • Complete punch cards automatically
  • Complete the others promotions automatically
  • Claim bonus points automatically
  • Headless Mode
  • Multi-Account Management
  • Session storing
  • 2FA Support
  • Notifications via Apprise - no longer limited to Telegram or Discord
  • Proxy Support (3.0) - they need to be high quality proxies
  • Logs to CSV file for point tracking

Note

Mobile searches are not automated because they do not yield points through browser automation. The mobile channel remains available for Read to Earn tasks.

About

A simple bot that uses Selenium to farm M$ Rewards in Python

Resources

Stars

10 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages