GitHub avatar

Fox's Blog

Botting a Microsoft Rewards Farm

How I coded a bot to farm Microsoft Rewards points at scale -- and

Note (2026): This project is no longer maintained. Microsoft has significantly hardened its anti-bot detection -- what worked back then no longer works today. The code and approach described below are kept for archival/educational purposes only.

🇬🇧 English Translation of the Article

Introduction

A few years ago I discovered Microsoft Rewards. Back then it was during lockdown, but that doesn’t change the fact that I was forced to use Microsoft Family Safety parental controls and thus had to use Edge. That’s when I discovered Rewards.

At the time I was only 14 and nothing in the catalogue interested me. Now I figure that with the skills I’ve acquired, I can farm points with bots and then give the codes away or even resell them cheaper if I really want to (knowing myself, I probably won’t). Anyway, I’ll tell you how I coded a bot that farms accounts at scale.


What is Microsoft Rewards?

Long story short: it’s a program that rewards Edge users with points for activities like searches, small quizzes, games, and an extension (that’s a whole other story).

Here you can see “Explore” stuff:
Explore screenshot

Here for example is what they call the “set of the day”.
Daily set screenshot

They even created a streak system, it’s pretty wild.
Streak screenshot

There’s also a level system and it’s just completely fun:
Level screenshot

So you have tons of ways to earn points, and most of them are daily.
The idea here is going to be to make a bot that does the activities for you, so you can farm points at scale and complete your farming routine.

As you can see below, most rewards are gift cards, but there are also fun things like games or service subscriptions.
Rewards screenshot

Reward Category Cost in points
Rakuten TV – 1 HD movie Digital content 1 785
Roblox (digital card) Game / digital content 6 750
Microsoft gift card Store / service 5 660
Xbox gift card Store / service 5 660
Microsoft Solitaire Collection gift card Game / digital content 1 500
Minecraft Minecoins Game / digital content 2 500
League of Legends gift card Game / digital content 2 000
Overwatch coin code (digital) Game / digital content 2 000
Sea of Thieves – Old Coins pack Game / digital content 1 700
Zalando – Gift card Store / service 7 205
Carrefour – Gift card Store / service 14 410
Cultura – Gift card Store / service 14 410
Fnac‑Darty – Gift card Store / service 14 410
La Redoute – Gift card Store / service 14 410
Mango – Gift card Store / service 36 025
Wonderbox – Gift card Store / service 14 410
Yves Rocher – Gift card Store / service 14 410
Amazon.fr – Gift voucher Store / service 7 205
Foot Locker – Gift card Store / service 14 410
IKEA FR – Gift card Store / service 36 025
IKEA FR – Gift card (other design) Store / service 7 200
Marionnaud – Gift card Store / service 14 410
Asos – Gift card Store / service 14 410
Adidas FR – Gift card Store / service 14 410
Deliveroo France – Gift card Store / service 21 615
H&M France – Gift card Store / service 14 410
Global Hotel Card (Expedia Group) Store / service 7 205
Uber Eats France – Gift card Store / service 36 025

Now that you understand the point of this program, let’s look into botting.


First tests

Before building my bot, I wanted to make sure I wouldn’t get IP flagged for using hundreds of accounts from the same address. You know me, I’m going to use Tor with a rotating proxy. And I don’t want to host my bot on a VPS--I want it to run in a GitHub Action.

So I wrote a simple workflow:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

This workflow just installs Tor, starts it, and makes a curl request through it.

The first run gave this result:
Tor curl first run

The time stats were:
!Timings

A second run gave this result:
Tor curl second run

As you can see, the IPs are different, so we won’t get flagged for abusive usage from the same IP. That’s good news--we can keep developing the farming bot.


First test with Selenium

To automate the UI, I’m going to use Selenium: a tool that controls a real browser (Chrome/Edge/Firefox) instead of a user. In the context of a GitHub Action, this means installing a browser + its driver, then running a script that logs into Microsoft Rewards and clicks where needed.

Example JavaScript script (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Result of the script:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Okay, that means we’re not logged in yet, so now we’ll build the login request and see if we can sign in to our Microsoft Rewards account to do the activities.

Botter une ferme Microsoft Rewards

Comment j'ai codé un bot pour farmer des points Microsoft Rewards à

Note (2026) : Ce projet n'est plus maintenu. Microsoft a considérablement renforcé sa détection anti-bot -- ce qui marchait à l'époque ne fonctionne plus aujourd'hui. Le code et l'approche décrits ci-dessous sont conservés à des fins d'archivage et de démonstration uniquement.

Introduction

J'ai découvert Microsoft Rewards il y a quelques années. C'était pendant le confinement, mais ça ne change rien au fait que j'étais obligé d'utiliser le contrôle parental Microsoft Family Safety et donc de passer par Edge. C'est là que j'ai découvert Rewards.

À l'époque j'avais seulement 14 ans et rien dans le catalogue ne m'intéressait. Maintenant je me dis qu'avec les compétences que j'ai acquises, je peux farmer des points avec des bots, puis donner les codes ou même les revendre moins cher si j'en ai vraiment envie (mais honnêtement, je pense pas le faire). Bref, je vais te raconter comment j'ai codé un bot qui farm des comptes à l'échelle.


C'est quoi Microsoft Rewards ?

Pour faire court : c'est un programme qui récompense les utilisateurs d'Edge avec des points pour des activités comme les recherches, des petits quiz, des jeux, et une extension (mais ça c'est une autre histoire).

Tu vois ici les trucs "Explore" :
Explore screenshot

Là par exemple c'est ce qu'ils appellent le "set du jour".
Daily set screenshot

Ils ont même fait un système de streak, c'est assez dingue.
Streak screenshot

Y'a aussi un système de niveau et c'est juste complètement fun :
Level screenshot

Donc t'as plein de façons de gagner des points, et la plupart sont quotidiennes.
L'idée ici ça va être de faire un bot qui fait les activités à ta place, pour farmer des points à l'échelle et compléter ta routine de farming.

Comme tu peux le voir ci-dessous, la plupart des récompenses sont des cartes cadeaux, mais y'a aussi des trucs sympas comme des jeux ou des abonnements.
Rewards screenshot

Récompense Catégorie Coût en points
Rakuten TV – 1 film HD Contenu numérique 1 785
Roblox (carte digitale) Jeu / contenu numérique 6 750
Carte cadeau Microsoft Boutique / service 5 660
Carte cadeau Xbox Boutique / service 5 660
Carte cadeau Microsoft Solitaire Collection Jeu / contenu numérique 1 500
Minecraft Minecoins Jeu / contenu numérique 2 500
Carte cadeau League of Legends Jeu / contenu numérique 2 000
Code Overwatch pièces (digital) Jeu / contenu numérique 2 000
Sea of Thieves – Pack Pièces anciennes Jeu / contenu numérique 1 700
Zalando – Carte cadeau Boutique / service 7 205
Carrefour – Carte cadeau Boutique / service 14 410
Cultura – Carte cadeau Boutique / service 14 410
Fnac‑Darty – Carte cadeau Boutique / service 14 410
La Redoute – Carte cadeau Boutique / service 14 410
Mango – Carte cadeau Boutique / service 36 025
Wonderbox – Carte cadeau Boutique / service 14 410
Yves Rocher – Carte cadeau Boutique / service 14 410
Amazon.fr – Chèque cadeau Boutique / service 7 205
Foot Locker – Carte cadeau Boutique / service 14 410
IKEA FR – Carte cadeau Boutique / service 36 025
IKEA FR – Carte cadeau (autre design) Boutique / service 7 200
Marionnaud – Carte cadeau Boutique / service 14 410
Asos – Carte cadeau Boutique / service 14 410
Adidas FR – Carte cadeau Boutique / service 14 410
Deliveroo France – Carte cadeau Boutique / service 21 615
H&M France – Carte cadeau Boutique / service 14 410
Global Hotel Card (Expedia Group) Boutique / service 7 205
Uber Eats France – Carte cadeau Boutique / service 36 025

Maintenant que tu comprends l'intérêt du programme, intéressons-nous au botting.


Premiers tests

Avant de construire mon bot, je voulais être sûr que mon IP ne serait pas marquée pour avoir utilisé des centaines de comptes depuis la même adresse. Tu me connais, je vais utiliser Tor avec un proxy rotatif. Et je ne veux pas héberger mon bot sur un VPS -- je veux qu'il tourne dans une GitHub Action.

Donc j'ai écrit un workflow simple :

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Ce workflow installe juste Tor, le démarre, et fait une requête curl à travers lui.

Le premier run a donné ce résultat :
Tor curl first run

Les stats de temps étaient :
!Timings

Un deuxième run a donné ce résultat :
Tor curl second run

Comme tu peux le voir, les IP sont différentes, donc on se fera pas flag pour utilisation abusive depuis la même IP. Bonne nouvelle -- on peut continuer à développer le bot de farming.


Premier test avec Selenium

Pour automatiser l'interface, je vais utiliser Selenium : un outil qui contrôle un vrai navigateur (Chrome/Edge/Firefox) à la place d'un utilisateur. Dans le contexte d'une GitHub Action, ça veut dire installer un navigateur + son driver, puis lancer un script qui se connecte à Microsoft Rewards et clique là où il faut.

Exemple de script JavaScript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Résultat du script :

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Ok, ça veut dire qu'on est pas encore connecté, donc maintenant on va construire la requête de login et voir si on peut se connecter à notre compte Microsoft Rewards pour faire les activités.

给 Microsoft Rewards 刷分农场写个机器人

我如何编写了一个机器人来规模化刷 Microsoft Rewards 积分----以及微软的反机器人检测后来是如何追上来的。

备注(2026 年): 该项目已不再维护。微软显著加强了反机器人检测----当年有效的方法今天已经行不通了。下面描述的代码和方法仅用于存档/教育目的。

引言

几年前我发现了 Microsoft Rewards。当时正处于封城期间,但这改变不了我被迫使用 Microsoft Family Safety 家长控制的事实,因此不得不使用 Edge。就在那时我发现了 Rewards。

那时我才 14 岁,目录里没什么我感兴趣的东西。现在我想,以我掌握的技能,我可以用机器人刷积分,然后把兑换码送人,或者如果真的想的话甚至可以低价转卖(以我对自己的了解,我可能不会)。总之,我来聊聊我是如何编写了一个能规模化刷账号的机器人。


什么是 Microsoft Rewards?

长话短说:这是一个奖励 Edge 用户积分的计划,可以通过搜索、小测验、游戏和一个扩展(那是另一个故事了)来获取积分。

这里你可以看到"探索"内容: 探索截图

比如这就是他们所谓的"今日精选集"。 今日精选集截图

他们甚至还搞了个连续签到系统,挺疯狂的。 连续签到截图

还有等级系统,真的很有意思: 等级截图

所以你有无数种赚积分的方式,而且大部分是每日任务。 这里的思路是做一个机器人来自动完成这些活动,这样你就可以规模化刷积分,完成你的日常任务。

如下所示,大部分奖励是礼品卡,但也有一些有趣的东西,比如游戏或服务订阅。 奖励截图

奖励 类别 积分成本
Rakuten TV – 1 部高清电影 数字内容 1 785
Roblox(数字卡) 游戏 / 数字内容 6 750
Microsoft 礼品卡 商店 / 服务 5 660
Xbox 礼品卡 商店 / 服务 5 660
Microsoft Solitaire Collection 礼品卡 游戏 / 数字内容 1 500
Minecraft Minecoins 游戏 / 数字内容 2 500
League of Legends 礼品卡 游戏 / 数字内容 2 000
Overwatch 硬币代码(数字版) 游戏 / 数字内容 2 000
Sea of Thieves – 古硬币包 游戏 / 数字内容 1 700
Zalando – 礼品卡 商店 / 服务 7 205
Carrefour – 礼品卡 商店 / 服务 14 410
Cultura – 礼品卡 商店 / 服务 14 410
Fnac‑Darty – 礼品卡 商店 / 服务 14 410
La Redoute – 礼品卡 商店 / 服务 14 410
Mango – 礼品卡 商店 / 服务 36 025
Wonderbox – 礼品卡 商店 / 服务 14 410
Yves Rocher – 礼品卡 商店 / 服务 14 410
Amazon.fr – 礼品券 商店 / 服务 7 205
Foot Locker – 礼品卡 商店 / 服务 14 410
IKEA FR – 礼品卡 商店 / 服务 36 025
IKEA FR – 礼品卡(其他设计) 商店 / 服务 7 200
Marionnaud – 礼品卡 商店 / 服务 14 410
Asos – 礼品卡 商店 / 服务 14 410
Adidas FR – 礼品卡 商店 / 服务 14 410
Deliveroo France – 礼品卡 商店 / 服务 21 615
H&M France – 礼品卡 商店 / 服务 14 410
Global Hotel Card(Expedia Group) 商店 / 服务 7 205
Uber Eats France – 礼品卡 商店 / 服务 36 025

现在你明白这个积分计划的意义了,接下来我们来聊聊机器人。


初步测试

在构建我的机器人之前,我想确认我是否会因为从同一个 IP 使用数百个账号而被标记。你了解我,我会用 Tor 配合轮换代理。而且我不想把机器人托管在 VPS 上----我想让它运行在 GitHub Action 中。

所以我写了一个简单的工作流:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

这个工作流只是安装 Tor、启动它,然后通过 Tor 发起一个 curl 请求。

第一次运行的结果: Tor curl 第一次运行

时间统计: !Timings

第二次运行的结果: Tor curl 第二次运行

如你所见,IP 地址不同,所以我们不会因为同一 IP 的滥用使用而被标记。这是个好消息----我们可以继续开发刷分机器人的。


首次使用 Selenium 测试

为了自动化 UI,我将使用 Selenium:一个控制真实浏览器(Chrome/Edge/Firefox)而不是用户操作的工具。在 GitHub Action 的环境中,这意味着安装一个浏览器及其驱动程序,然后运行一个脚本登录 Microsoft Rewards 并在需要的地方点击。

示例 JavaScript 脚本(Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

脚本运行结果:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

好的,这意味着我们还没有登录,所以接下来我们要构建登录请求,看看能否登录到我们的 Microsoft Rewards 账户来执行活动。

Microsoft Rewardsファームのボット化

Microsoft Rewardsのポイントを大規模に稼ぐボットをコードした方法----そしてMicrosoftのアンチボット検出が追いついた理由。

Note (2026): このプロジェクトはもはやメンテナンスされていません。Microsoftはアンチボット検出を大幅に強化しており、当時有効だった手法は現在では機能しません。以下で説明するコードとアプローチは、アーカイブおよび教育目的のみで残されています。

はじめに

数年前、Microsoft Rewardsを発見した。当時はロックダウン中だったけど、それはともかく、Microsoftファミリーセーフティのペアレンタルコントロールを強制されていて、Edgeを使わざるを得なかったんだ。そこでRewardsを知った。

当時俺は14歳で、カタログのどの商品にも興味がなかった。今では身につけたスキルを使って、ボットでポイントを稼いで、コードを配ったり、本当にしたければ安く転売したりできると思う(自分のことだから、たぶんやらないけど)。とにかく、アカウントを大規模にファームするボットをどうやって作ったか話すよ。


Microsoft Rewardsって何?

簡単に言うと:Edgeユーザーに検索や小クイズ、ゲーム、拡張機能(それはまた別の話)などのアクティビティに対してポイントを与えるプログラムだ。

ここに「Explore」系のものが見える: Explore screenshot

例えば、これが「本日のセット」ってやつだ。 Daily set screenshot

連続ログインのシステムまであって、結構すごい。 Streak screenshot

レベルシステムもあって、とにかく楽しい: Level screenshot

こんな風にポイントを稼ぐ方法がたくさんあって、ほとんどは毎日のものだ。 ここでのアイデアは、アクティビティを代わりにやってくれるボットを作って、ポイントを大規模に稼いで、ファームのルーティンを完了させることだ。

下に見えるように、ほとんどの報酬はギフトカードだけど、ゲームやサービスサブスクリプションみたいな面白いものもある。 Rewards screenshot

報酬 カテゴリ 必要ポイント数
Rakuten TV – 1 HD movie Digital content 1 785
Roblox (digital card) Game / digital content 6 750
Microsoft gift card Store / service 5 660
Xbox gift card Store / service 5 660
Microsoft Solitaire Collection gift card Game / digital content 1 500
Minecraft Minecoins Game / digital content 2 500
League of Legends gift card Game / digital content 2 000
Overwatch coin code (digital) Game / digital content 2 000
Sea of Thieves – Old Coins pack Game / digital content 1 700
Zalando – Gift card Store / service 7 205
Carrefour – Gift card Store / service 14 410
Cultura – Gift card Store / service 14 410
Fnac‑Darty – Gift card Store / service 14 410
La Redoute – Gift card Store / service 14 410
Mango – Gift card Store / service 36 025
Wonderbox – Gift card Store / service 14 410
Yves Rocher – Gift card Store / service 14 410
Amazon.fr – Gift voucher Store / service 7 205
Foot Locker – Gift card Store / service 14 410
IKEA FR – Gift card Store / service 36 025
IKEA FR – Gift card (other design) Store / service 7 200
Marionnaud – Gift card Store / service 14 410
Asos – Gift card Store / service 14 410
Adidas FR – Gift card Store / service 14 410
Deliveroo France – Gift card Store / service 21 615
H&M France – Gift card Store / service 14 410
Global Hotel Card (Expedia Group) Store / service 7 205
Uber Eats France – Gift card Store / service 36 025

このプログラムのポイントがわかったところで、ボット化について見ていこう。


最初のテスト

ボットを作る前に、同じアドレスから何百ものアカウントを使ってもIPがフラグされないことを確認したかったんだ。俺のことだから、Torと回転式プロキシを使う。それにVPSでボットをホストしたくない----GitHub Actionで実行したいんだ。

というわけで、シンプルなワークフローを書いた:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

このワークフローはTorをインストールして起動し、curlリクエストをTor経由で行うだけだ。

最初の実行結果: Tor curl first run

タイムスタッツ: !Timings

2回目の実行結果: Tor curl second run

見ての通りIPが違うから、同一IPからの濫用でフラグされることはない。朗報だ----ファーミングボットの開発を続けられる。


Seleniumを使った最初のテスト

UIを自動化するためにSeleniumを使う:ユーザーの代わりに実際のブラウザ(Chrome/Edge/Firefox)を制御するツールだ。GitHub Actionの文脈では、ブラウザとそのドライバーをインストールし、Microsoft Rewardsにログインしてクリックするスクリプトを実行する。

JavaScriptのサンプルスクリプト(Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // ページJS実行前にスクリプトを注入し、自動化のフィンガープリンティングを軽減する。
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // 一部のサイトはchromeランタイムとプラグインをチェックする
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

スクリプトの結果:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

よし、まだログインしてないってことだ。次はログインリクエストを作って、Microsoft Rewardsアカウントにサインインしてアクティビティを実行できるか試してみよう。

Microsoft Rewards 팜 봇 만들기

대규모로 Microsoft Rewards 포인트를 농사짓는 봇을 코딩한 방법 -- 그리고 Microsoft의 안티봇 탐지가 따라잡은 이유

참고 (2026년): 이 프로젝트는 더 이상 유지보수되지 않습니다. Microsoft가 안티봇 탐지를 크게 강화해서 -- 예전에 통했던 방법이 지금은 더 이상 작동하지 않습니다. 아래 설명된 코드와 접근 방식은 기록/교육 목적으로만 보관됩니다.

소개

몇 년 전에 Microsoft Rewards를 발견했어. 그때는 락다운 기간이었는데, 그렇다고 해서 Microsoft Family Safety 자녀 보호 기능을 강제로 사용해야 했고 결과적으로 Edge를 써야 했던 건 변함없어. 그때 Rewards를 발견했지.

그 당시 나는 겨우 14살이었고 카탈로그에 있는 어떤 것도 관심이 없었어. 이제는 내가 습득한 기술로 봇으로 포인트를 농사지은 다음, 코드를 나눠주거나 내가 정말 원한다면 더 싸게 재판매할 수도 있겠다고 생각했어 (나 자신을 알지만, 아마 안 할 거야). 어쨌든, 계정을 대규모로 농사짓는 봇을 어떻게 코딩했는지 알려줄게.


Microsoft Rewards가 뭔가요?

간단히 말하면: 검색, 작은 퀴즈, 게임, 확장 프로그램(그건 또 다른 이야기야) 같은 활동에 대해 Edge 사용자에게 포인트를 보상하는 프로그램이야.

여기 "Explore" 항목들이 보여: Explore 스크린샷

예를 들어 이것들이 "set of the day"라고 불리는 거야. Daily set 스크린샷

스트릭 시스템도 만들었는데, 꽤 정신없어. Streak 스크린샷

레벨 시스템도 있고 완전 재미있어: Level 스크린샷

포인트를 얻을 수 있는 방법이 엄청 많고, 대부분 매일 할 수 있어. 여기서 할 건 활동을 대신 해주는 봇을 만들어서, 대규모로 포인트를 농사짓고 일과를 완료하는 거야.

아래에서 볼 수 있듯이, 대부분의 보상은 기프트 카드지만 게임이나 서비스 구독 같은 재미있는 것들도 있어. Rewards 스크린샷

보상 카테고리 필요 포인트
Rakuten TV – HD 영화 1편 디지털 콘텐츠 1,785
Roblox (디지털 카드) 게임 / 디지털 콘텐츠 6,750
Microsoft 기프트 카드 스토어 / 서비스 5,660
Xbox 기프트 카드 스토어 / 서비스 5,660
Microsoft Solitaire Collection 기프트 카드 게임 / 디지털 콘텐츠 1,500
Minecraft Minecoins 게임 / 디지털 콘텐츠 2,500
League of Legends 기프트 카드 게임 / 디지털 콘텐츠 2,000
Overwatch 코인 코드 (디지털) 게임 / 디지털 콘텐츠 2,000
Sea of Thieves – Old Coins 팩 게임 / 디지털 콘텐츠 1,700
Zalando – 기프트 카드 스토어 / 서비스 7,205
Carrefour – 기프트 카드 스토어 / 서비스 14,410
Cultura – 기프트 카드 스토어 / 서비스 14,410
Fnac‑Darty – 기프트 카드 스토어 / 서비스 14,410
La Redoute – 기프트 카드 스토어 / 서비스 14,410
Mango – 기프트 카드 스토어 / 서비스 36,025
Wonderbox – 기프트 카드 스토어 / 서비스 14,410
Yves Rocher – 기프트 카드 스토어 / 서비스 14,410
Amazon.fr – 기프트 바우처 스토어 / 서비스 7,205
Foot Locker – 기프트 카드 스토어 / 서비스 14,410
IKEA FR – 기프트 카드 스토어 / 서비스 36,025
IKEA FR – 기프트 카드 (다른 디자인) 스토어 / 서비스 7,200
Marionnaud – 기프트 카드 스토어 / 서비스 14,410
Asos – 기프트 카드 스토어 / 서비스 14,410
Adidas FR – 기프트 카드 스토어 / 서비스 14,410
Deliveroo France – 기프트 카드 스토어 / 서비스 21,615
H&M France – 기프트 카드 스토어 / 서비스 14,410
Global Hotel Card (Expedia Group) 스토어 / 서비스 7,205
Uber Eats France – 기프트 카드 스토어 / 서비스 36,025

이제 이 프로그램의 요점을 이해했으니, 봇팅에 대해 알아보자.


첫 번째 테스트

봇을 만들기 전에, 같은 주소에서 수백 개의 계정을 사용해도 IP가 차단되지 않는지 확인하고 싶었어. 알다시피, 나는 Tor와 순환 프록시를 사용할 거야. 그리고 VPS에 봇을 호스팅하고 싶지 않아 -- GitHub Action에서 실행되길 원해.

그래서 간단한 워크플로우를 작성했어:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

이 워크플로우는 Tor를 설치하고 시작한 다음, Tor를 통해 curl 요청을 보내.

첫 번째 실행 결과: Tor curl 첫 실행

시간 통계: !Timings

두 번째 실행 결과: Tor curl 두 번째 실행

보시다시피 IP가 달라서, 같은 IP에서 남용으로 플래그되지 않을 거야. 좋은 소식이야--농사 봇 개발을 계속할 수 있어.


Selenium 첫 번째 테스트

UI를 자동화하기 위해 Selenium을 사용할 거야: 사용자 대신 실제 브라우저(Chrome/Edge/Firefox)를 제어하는 도구지. GitHub Action 맥락에서, 이건 브라우저 + 드라이버를 설치한 다음, Microsoft Rewards에 로그인해서 필요한 곳을 클릭하는 스크립트를 실행하는 걸 의미해.

예제 JavaScript 스크립트 (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

스크립트 실행 결과:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

좋아, 아직 로그인되지 않았다는 뜻이니까, 이제 로그인 요청을 만들어서 Microsoft Rewards 계정에 로그인할 수 있는지 확인해보자.

Bir Microsoft Rewards Çiftliğini Botlamak

Ölçekli olarak Microsoft Rewards puanı toplamak için nasıl bir bot

Not (2026): Bu proje artık bakılmıyor. Microsoft, anti-bot tespitini önemli ölçüde güçlendirdi -- o zamanlar işe yarayan şey artık çalışmıyor. Aşağıda açıklanan kod ve yaklaşım sadece arşiv/eğitim amaçlı saklanmaktadır.

Giriş

Birkaç yıl önce Microsoft Rewards'ı keşfettim. O zamanlar karantina günleriydi, ama bu, Microsoft Family Safety ebeveyn kontrollerini kullanmak zorunda olduğum ve dolayısıyla Edge kullandığım gerçeğini değiştirmiyor. İşte o zaman Rewards'ı keşfettim.

O zamanlar sadece 14 yaşındaydım ve katalogdaki hiçbir şey ilgimi çekmiyordu. Şimdi edindiğim becerilerle, botlarla puan toplayabileceğimi ve sonra kodları verebileceğimi, hatta gerçekten istersem daha ucuza satabileceğimi düşünüyorum (kendimi bilirim, muhtemelen yapmam). Neyse, sana hesapları ölçekli olarak çalıştıran bir botu nasıl kodladığımı anlatacağım.


Microsoft Rewards Nedir?

Kısacası: Edge kullanıcılarını aramalar, küçük testler, oyunlar ve bir uzantı (ki o da bambaşka bir hikaye) gibi aktiviteler için puanlarla ödüllendiren bir program.

Burada "Keşfet" şeylerini görebilirsin:
Explore ekran görüntüsü

Bu, örneğin "günün seti" dedikleri şey.
Günlük set ekran görüntüsü

Hatta bir seri sistemi bile oluşturmuşlar, oldukça çılgın.
Seri ekran görüntüsü

Bir de seviye sistemi var ve tamamen eğlenceli:
Seviye ekran görüntüsü

Yani puan kazanmanın bir sürü yolu var ve çoğu günlük.
Buradaki fikir, aktiviteleri senin için yapan bir bot yapmak, böylece ölçekli olarak puan toplayabilir ve çiftlik rutinini tamamlayabilirsin.

Aşağıda görebileceğin gibi, ödüllerin çoğu hediye kartları, ama ayrıca oyunlar veya servis abonelikleri gibi eğlenceli şeyler de var.
Ödüller ekran görüntüsü

Ödül Kategori Puan cinsinden maliyet
Rakuten TV – 1 HD film Dijital içerik 1 785
Roblox (dijital kart) Oyun / dijital içerik 6 750
Microsoft hediye kartı Mağaza / hizmet 5 660
Xbox hediye kartı Mağaza / hizmet 5 660
Microsoft Solitaire Collection hediye kartı Oyun / dijital içerik 1 500
Minecraft Minecoins Oyun / dijital içerik 2 500
League of Legends hediye kartı Oyun / dijital içerik 2 000
Overwatch coin kodu (dijital) Oyun / dijital içerik 2 000
Sea of Thieves – Old Coins paketi Oyun / dijital içerik 1 700
Zalando – Hediye kartı Mağaza / hizmet 7 205
Carrefour – Hediye kartı Mağaza / hizmet 14 410
Cultura – Hediye kartı Mağaza / hizmet 14 410
Fnac‑Darty – Hediye kartı Mağaza / hizmet 14 410
La Redoute – Hediye kartı Mağaza / hizmet 14 410
Mango – Hediye kartı Mağaza / hizmet 36 025
Wonderbox – Hediye kartı Mağaza / hizmet 14 410
Yves Rocher – Hediye kartı Mağaza / hizmet 14 410
Amazon.fr – Hediye çeki Mağaza / hizmet 7 205
Foot Locker – Hediye kartı Mağaza / hizmet 14 410
IKEA FR – Hediye kartı Mağaza / hizmet 36 025
IKEA FR – Hediye kartı (diğer tasarım) Mağaza / hizmet 7 200
Marionnaud – Hediye kartı Mağaza / hizmet 14 410
Asos – Hediye kartı Mağaza / hizmet 14 410
Adidas FR – Hediye kartı Mağaza / hizmet 14 410
Deliveroo France – Hediye kartı Mağaza / hizmet 21 615
H&M France – Hediye kartı Mağaza / hizmet 14 410
Global Hotel Card (Expedia Group) Mağaza / hizmet 7 205
Uber Eats France – Hediye kartı Mağaza / hizmet 36 025

Artık bu programın amacını anladığına göre, bot işine bakalım.


İlk testler

Botumu inşa etmeden önce, aynı adresten yüzlerce hesap kullandığım için IP'nin işaretlenmeyeceğinden emin olmak istedim. Beni tanırsın, dönen proxy ile Tor kullanacağım. Ve botumu bir VPS'de barındırmak istemiyorum -- bir GitHub Action'da çalışmasını istiyorum.

Basit bir workflow yazdım:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Bu workflow sadece Tor'u kurar, başlatır ve üzerinden bir curl isteği yapar.

İlk çalıştırma şu sonucu verdi:
Tor curl ilk çalıştırma

Zaman istatistikleri şöyleydi:
!Zamanlamalar

İkinci çalıştırma şu sonucu verdi:
Tor curl ikinci çalıştırma

Gördüğün gibi, IP'ler farklı, bu yüzden aynı IP'den aşırı kullanım nedeniyle işaretlenmeyiz. Bu iyi haber--çiftlik botunu geliştirmeye devam edebiliriz.


Selenium ile ilk test

Arayüzü otomatikleştirmek için Selenium kullanacağım: bir kullanıcı yerine gerçek bir tarayıcıyı (Chrome/Edge/Firefox) kontrol eden bir araç. Bir GitHub Action bağlamında bu, bir tarayıcı + sürücüsünü kurmak, ardından Microsoft Rewards'a giriş yapan ve gereken yerlere tıklayan bir script çalıştırmak anlamına geliyor.

Örnek JavaScript scripti (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Herhangi bir sayfa JS'si çalışmadan önce script enjekte ederek otomasyon parmak izini azaltır.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Bazı siteler chrome runtime ve eklentileri kontrol eder
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Scriptin sonucu:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Tamam, bu henüz giriş yapmadığımız anlamına geliyor, şimdi giriş isteğini oluşturacağız ve aktiviteleri yapmak için Microsoft Rewards hesabımıza giriş yapıp yapamayacağımıza bakacağız.

Botting di una Microsoft Rewards Farm

Come ho programmato un bot per farmare punti Microsoft Rewards su

Nota (2026): Questo progetto non è più mantenuto. Microsoft ha notevolmente rafforzato il suo rilevamento anti-bot -- ciò che funzionava allora non funziona più oggi. Il codice e l'approccio descritti qui sotto sono conservati solo a scopo di archivio/educativo.

Introduzione

Qualche anno fa ho scoperto Microsoft Rewards. Allora era durante il lockdown, ma questo non cambia il fatto che ero costretto a usare i controlli parentali di Microsoft Family Safety e quindi dovevo usare Edge. È stato lì che ho scoperto Rewards.

All'epoca avevo solo 14 anni e niente nel catalogo mi interessava. Ora penso che con le competenze che ho acquisito, posso farmare punti con i bot e poi regalare i codici o addirittura rivenderli a prezzo scontato se voglio davvero (conoscendomi, probabilmente non lo farò). Comunque, ti racconterò come ho programmato un bot che farms account su larga scala.


Cos'è Microsoft Rewards?

Per farla breve: è un programma che premia gli utenti di Edge con punti per attività come ricerche, piccoli quiz, giochi e un'estensione (questa è un'altra storia).

Qui puoi vedere roba "Esplora":
Screenshot Explore

Qui per esempio c'è quello che chiamano il "set del giorno".
Screenshot set giornaliero

Hanno persino creato un sistema di streak, è pazzesco.
Screenshot streak

C'è anche un sistema di livelli ed è davvero divertente:
Screenshot livelli

Quindi hai tonnellate di modi per guadagnare punti, e la maggior parte sono giornalieri.
L'idea qui è quella di creare un bot che faccia le attività per te, così puoi farmare punti su larga scala e completare la tua routine di farming.

Come puoi vedere qui sotto, la maggior parte dei premi sono carte regalo, ma ci sono anche cose divertenti come giochi o abbonamenti a servizi.
Screenshot premi

Premio Categoria Costo in punti
Rakuten TV – 1 film HD Contenuti digitali 1 785
Roblox (carta digitale) Gioco / contenuti digitali 6 750
Carta regalo Microsoft Negozio / servizio 5 660
Carta regalo Xbox Negozio / servizio 5 660
Carta regalo Microsoft Solitaire Collection Gioco / contenuti digitali 1 500
Minecraft Minecoins Gioco / contenuti digitali 2 500
Carta regalo League of Legends Gioco / contenuti digitali 2 000
Codice coin Overwatch (digitale) Gioco / contenuti digitali 2 000
Sea of Thieves – Pacchetto Old Coins Gioco / contenuti digitali 1 700
Zalando – Carta regalo Negozio / servizio 7 205
Carrefour – Carta regalo Negozio / servizio 14 410
Cultura – Carta regalo Negozio / servizio 14 410
Fnac‑Darty – Carta regalo Negozio / servizio 14 410
La Redoute – Carta regalo Negozio / servizio 14 410
Mango – Carta regalo Negozio / servizio 36 025
Wonderbox – Carta regalo Negozio / servizio 14 410
Yves Rocher – Carta regalo Negozio / servizio 14 410
Amazon.fr – Buono regalo Negozio / servizio 7 205
Foot Locker – Carta regalo Negozio / servizio 14 410
IKEA FR – Carta regalo Negozio / servizio 36 025
IKEA FR – Carta regalo (altro design) Negozio / servizio 7 200
Marionnaud – Carta regalo Negozio / servizio 14 410
Asos – Carta regalo Negozio / servizio 14 410
Adidas FR – Carta regalo Negozio / servizio 14 410
Deliveroo France – Carta regalo Negozio / servizio 21 615
H&M France – Carta regalo Negozio / servizio 14 410
Global Hotel Card (Expedia Group) Negozio / servizio 7 205
Uber Eats France – Carta regalo Negozio / servizio 36 025

Ora che capisci l'utilità di questo programma, parliamo del botting.


Primi test

Prima di costruire il mio bot, volevo assicurarmi di non essere segnalato per IP usando centinaia di account dallo stesso indirizzo. Mi conosci, userò Tor con un proxy rotante. E non voglio ospitare il mio bot su un VPS -- voglio che funzioni in una GitHub Action.

Quindi ho scritto un workflow semplice:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Questo workflow installa semplicemente Tor, lo avvia, e fa una richiesta curl attraverso di esso.

Il primo esecuzione ha dato questo risultato:
Primo risultato Tor curl

Le statistiche di tempo erano:
!Timings

Una seconda esecuzione ha dato questo risultato:
Secondo risultato Tor curl

Come puoi vedere, gli IP sono diversi, quindi non verremo segnalati per uso abusivo dallo stesso IP. Sono buone notizie -- possiamo continuare a sviluppare il bot di farming.


Primo test con Selenium

Per automatizzare l'interfaccia utente, userò Selenium: uno strumento che controlla un browser reale (Chrome/Edge/Firefox) invece di un utente. Nel contesto di una GitHub Action, questo significa installare un browser + il suo driver, poi eseguire uno script che accede a Microsoft Rewards e clicca dove necessario.

Esempio di script JavaScript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Risultato dello script:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Ok, significa che non siamo ancora loggati, quindi ora costruiremo la richiesta di login e vedremo se riusciamo ad accedere al nostro account Microsoft Rewards per fare le attività.

Eine Microsoft-Rewards-Farm boten

Wie ich einen Bot programmiert habe, der Microsoft-Rewards-Punkte

Hinweis (2026): Dieses Projekt wird nicht mehr gewartet. Microsoft hat seine Anti-Bot-Erkennung deutlich verschärft – was damals funktioniert hat, funktioniert heute nicht mehr. Der Code und der unten beschriebene Ansatz werden nur zu Archivierungs-/Bildungszwecken aufbewahrt.

Einleitung

Vor ein paar Jahren habe ich Microsoft Rewards entdeckt. Damals war während des Lockdowns, aber das ändert nichts daran, dass ich die Microsoft Family Safety-Elternkontrollen nutzen musste und daher Edge verwenden musste. Da habe ich Rewards entdeckt.

Zu der Zeit war ich erst 14 und nichts im Katalog interessierte mich. Jetzt denke ich, dass ich mit den Fähigkeiten, die ich erworben habe, Punkte mit Bots farmen und die Codes dann verschenken oder sogar günstiger weiterverkaufen kann, wenn ich wirklich will (so wie ich mich kenne, werde ich das wahrscheinlich nicht tun). Wie auch immer, ich erzähle dir, wie ich einen Bot programmiert habe, der Accounts in großem Stil farmt.


Was ist Microsoft Rewards?

Kurz gesagt: Es ist ein Programm, das Edge-Benutzer mit Punkten für Aktivitäten wie Suchen, kleine Quizze, Spiele und eine Erweiterung belohnt (das ist eine ganz andere Geschichte).

Hier siehst du „Entdecken“-Sachen:
Explore screenshot

Hier ist zum Beispiel das, was sie das „Set des Tages“ nennen.
Daily set screenshot

Sie haben sogar ein Streak-System erstellt, es ist ziemlich verrückt.
Streak screenshot

Es gibt auch ein Level-System und es macht einfach komplett Spaß:
Level screenshot

Du hast also jede Menge Möglichkeiten, Punkte zu sammeln, und die meisten davon sind täglich.
Die Idee hier ist, einen Bot zu bauen, der die Aktivitäten für dich erledigt, damit du Punkte im großen Stil farmen und deine Farming-Routine absolvieren kannst.

Wie du unten siehst, sind die meisten Belohnungen Geschenkkarten, aber es gibt auch lustige Dinge wie Spiele oder Service-Abonnements.
Rewards screenshot

Belohnung Kategorie Kosten in Punkten
Rakuten TV – 1 HD-Film Digitale Inhale 1 785
Roblox (digitale Karte) Spiel / digitale Inhalte 6 750
Microsoft-Geschenkkarte Shop / Service 5 660
Xbox-Geschenkkarte Shop / Service 5 660
Microsoft Solitaire Collection-Geschenkkarte Spiel / digitale Inhalte 1 500
Minecraft Minecoins Spiel / digitale Inhalte 2 500
League of Legends-Geschenkkarte Spiel / digitale Inhalte 2 000
Overwatch-Münz-Code (digital) Spiel / digitale Inhalte 2 000
Sea of Thieves – Old Coins-Paket Spiel / digitale Inhalte 1 700
Zalando – Geschenkkarte Shop / Service 7 205
Carrefour – Geschenkkarte Shop / Service 14 410
Cultura – Geschenkkarte Shop / Service 14 410
Fnac‑Darty – Geschenkkarte Shop / Service 14 410
La Redoute – Geschenkkarte Shop / Service 14 410
Mango – Geschenkkarte Shop / Service 36 025
Wonderbox – Geschenkkarte Shop / Service 14 410
Yves Rocher – Geschenkkarte Shop / Service 14 410
Amazon.fr – Geschenkgutschein Shop / Service 7 205
Foot Locker – Geschenkkarte Shop / Service 14 410
IKEA FR – Geschenkkarte Shop / Service 36 025
IKEA FR – Geschenkkarte (anderes Design) Shop / Service 7 200
Marionnaud – Geschenkkarte Shop / Service 14 410
Asos – Geschenkkarte Shop / Service 14 410
Adidas FR – Geschenkkarte Shop / Service 14 410
Deliveroo Frankreich – Geschenkkarte Shop / Service 21 615
H&M Frankreich – Geschenkkarte Shop / Service 14 410
Global Hotel Card (Expedia Group) Shop / Service 7 205
Uber Eats Frankreich – Geschenkkarte Shop / Service 36 025

Nachdem du jetzt den Sinn dieses Programms verstehst, schauen wir uns das Botting an.


Erste Tests

Bevor ich meinen Bot gebaut habe, wollte ich sichergehen, dass meine IP nicht geflaggt wird, wenn ich hunderte Accounts von derselben Adresse aus verwende. Du kennst mich, ich werde Tor mit einem rotierenden Proxy verwenden. Und ich will meinen Bot nicht auf einem VPS hosten – er soll in einer GitHub Action laufen.

Also habe ich einen einfachen Workflow geschrieben:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Dieser Workflow installiert einfach Tor, startet es und führt eine Curl-Anfrage darüber aus.

Der erste Durchlauf ergab dieses Ergebnis:
Tor curl first run

Die Zeitstatistiken waren:
!Timings

Ein zweiter Durchlauf ergab dieses Ergebnis:
Tor curl second run

Wie du siehst, sind die IPs unterschiedlich, also werden wir nicht für missbräuchliche Nutzung von derselben IP geflaggt. Das sind gute Nachrichten – wir können mit der Entwicklung des Farming-Bots fortfahren.


Erster Test mit Selenium

Um die UI zu automatisieren, verwende ich Selenium: ein Tool, das einen echten Browser (Chrome/Edge/Firefox) anstelle eines Benutzers steuert. Im Kontext einer GitHub Action bedeutet das, einen Browser + seinen Treiber zu installieren und dann ein Skript auszuführen, das sich bei Microsoft Rewards anmeldet und dort klickt, wo es nötig ist.

Beispiel-JavaScript-Skript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Ergebnis des Skripts:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Okay, das bedeutet, dass wir noch nicht eingeloggt sind. Als nächstes bauen wir den Login-Request und schauen, ob wir uns in unser Microsoft-Rewards-Konto einloggen können, um die Aktivitäten zu erledigen.

Боттинг фермы Microsoft Rewards

Как я написал бота для массового фарма очков Microsoft Rewards -- и

Примечание (2026): Этот проект больше не поддерживается. Microsoft значительно усилила свою антибот-защиту -- то, что работало тогда, сегодня уже не работает. Код и подход, описанные ниже, сохранены только в архивных/образовательных целях.

Введение

Несколько лет назад я открыл для себя Microsoft Rewards. Тогда был карантин, но это не отменяет того факта, что меня заставили использовать Microsoft Family Safety и, соответственно, Edge. Именно тогда я и узнал о Rewards.

В то время мне было всего 14, и ничего в каталоге меня не интересовало. Теперь я понимаю, что с приобретёнными навыками могу фармить очки с помощью ботов, а затем раздавать коды или даже перепродавать их дешевле, если очень захочу (зная себя, я, вероятно, не буду). В любом случае, я расскажу, как я написал бота для массового фарма аккаунтов.


Что такое Microsoft Rewards?

Коротко: это программа, которая награждает пользователей Edge очками за такие действия, как поисковые запросы, небольшие викторины, игры и расширение (это уже совсем другая история).

Здесь можно увидеть раздел «Explore»:
Explore screenshot

А вот, например, то, что они называют «набором дня».
Daily set screenshot

Они даже создали систему серий, довольно безумно.
Streak screenshot

Также есть система уровней, и это просто весело:
Level screenshot

В общем, есть куча способов зарабатывать очки, и большинство из них ежедневные.
Идея в том, чтобы сделать бота, который будет выполнять все действия за тебя, чтобы ты мог фармить очки в масштабе и выполнять свою ежедневную рутину.

Как видно ниже, большинство наград -- это подарочные карты, но есть и забавные вещи вроде игр или подписок на сервисы.
Rewards screenshot

Награда Категория Стоимость в очках
Rakuten TV – 1 HD фильм Цифровой контент 1 785
Roblox (цифровая карта) Игры / цифровой контент 6 750
Подарочная карта Microsoft Магазин / сервис 5 660
Подарочная карта Xbox Магазин / сервис 5 660
Подарочная карта Microsoft Solitaire Collection Игры / цифровой контент 1 500
Minecraft Minecoins Игры / цифровой контент 2 500
Подарочная карта League of Legends Игры / цифровой контент 2 000
Код Overwatch coin (цифровой) Игры / цифровой контент 2 000
Sea of Thieves – набор Old Coins Игры / цифровой контент 1 700
Zalando – Подарочная карта Магазин / сервис 7 205
Carrefour – Подарочная карта Магазин / сервис 14 410
Cultura – Подарочная карта Магазин / сервис 14 410
Fnac‑Darty – Подарочная карта Магазин / сервис 14 410
La Redoute – Подарочная карта Магазин / сервис 14 410
Mango – Подарочная карта Магазин / сервис 36 025
Wonderbox – Подарочная карта Магазин / сервис 14 410
Yves Rocher – Подарочная карта Магазин / сервис 14 410
Amazon.fr – Подарочный ваучер Магазин / сервис 7 205
Foot Locker – Подарочная карта Магазин / сервис 14 410
IKEA FR – Подарочная карта Магазин / сервис 36 025
IKEA FR – Подарочная карта (другой дизайн) Магазин / сервис 7 200
Marionnaud – Подарочная карта Магазин / сервис 14 410
Asos – Подарочная карта Магазин / сервис 14 410
Adidas FR – Подарочная карта Магазин / сервис 14 410
Deliveroo France – Подарочная карта Магазин / сервис 21 615
H&M France – Подарочная карта Магазин / сервис 14 410
Global Hotel Card (Expedia Group) Магазин / сервис 7 205
Uber Eats France – Подарочная карта Магазин / сервис 36 025

Теперь, когда ты понимаешь суть этой программы, давай поговорим о боттинге.


Первые тесты

Прежде чем создавать своего бота, я хотел убедиться, что мой IP не будет забанен за использование сотен аккаунтов с одного адреса. Ты меня знаешь -- я буду использовать Tor с ротирующимся прокси. И я не хочу хостить бота на VPS -- я хочу, чтобы он работал в GitHub Action.

Поэтому я написал простой воркфлоу:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Этот воркфлоу просто устанавливает Tor, запускает его и делает curl-запрос через него.

Первый запуск дал такой результат:
Tor curl first run

Статистика времени была такой:
!Timings

Второй запуск дал такой результат:
Tor curl second run

Как видишь, IP-адреса разные, так что нас не забанят за чрезмерное использование с одного IP. Это хорошая новость -- можно продолжать разработку бота для фарма.


Первый тест с Selenium

Для автоматизации UI я буду использовать Selenium: инструмент, который управляет реальным браузером (Chrome/Edge/Firefox) вместо пользователя. В контексте GitHub Action это означает установку браузера + его драйвера, а затем запуск скрипта, который входит в Microsoft Rewards и кликает там, где нужно.

Пример JavaScript-скрипта (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Результат работы скрипта:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Окей, это значит, что мы ещё не вошли. Теперь мы создадим запрос на вход и посмотрим, сможем ли мы войти в наш аккаунт Microsoft Rewards, чтобы выполнять действия.

Automatizando una Granja de Microsoft Rewards

Cómo programé un bot para cultivar puntos de Microsoft Rewards a

Nota (2026): Este proyecto ya no tiene mantenimiento. Microsoft ha endurecido significativamente su detección de bots -- lo que funcionaba antes ya no funciona hoy. El código y el enfoque descritos a continuación se conservan solo con fines educativos/de archivo.

Introducción

Hace algunos años descubrí Microsoft Rewards. En ese entonces era durante el confinamiento, pero eso no cambia el hecho de que me obligaron a usar los controles parentales de Microsoft Family Safety y por lo tanto tuve que usar Edge. Fue ahí cuando descubrí Rewards.

En ese momento solo tenía 14 años y nada del catálogo me interesaba. Ahora pienso que con las habilidades que he adquirido, puedo generar puntos con bots y luego regalar los códigos o incluso revenderlos más baratos si realmente quiero (conociéndome, probablemente no lo haré). De todas formas, te contaré cómo programé un bot que cultiva cuentas a escala.


¿Qué es Microsoft Rewards?

En pocas palabras: es un programa que recompensa a los usuarios de Edge con puntos por actividades como búsquedas, pequeños cuestionarios, juegos y una extensión (esa es otra historia).

Aquí puedes ver cosas de «Explorar»:
Captura de Explore

Aquí, por ejemplo, lo que llaman el «set del día».
Captura del set diario

Incluso crearon un sistema de rachas, es bastante loco.
Captura de rachas

También hay un sistema de niveles y es simplemente divertido:
Captura de niveles

Así que tienes montones de formas de ganar puntos, y la mayoría son diarias.
La idea aquí va a ser hacer un bot que haga las actividades por ti, para que puedas generar puntos a escala y completar tu rutina de cultivo.

Como puedes ver abajo, la mayoría de las recompensas son tarjetas de regalo, pero también hay cosas divertidas como juegos o suscripciones a servicios.
Captura de recompensas

Recompensa Categoría Costo en puntos
Rakuten TV – 1 película HD Contenido digital 1 785
Roblox (tarjeta digital) Juego / contenido digital 6 750
Tarjeta regalo Microsoft Tienda / servicio 5 660
Tarjeta regalo Xbox Tienda / servicio 5 660
Tarjeta regalo Microsoft Solitaire Collection Juego / contenido digital 1 500
Minecraft Minecoins Juego / contenido digital 2 500
Tarjeta regalo League of Legends Juego / contenido digital 2 000
Código de monedas Overwatch (digital) Juego / contenido digital 2 000
Sea of Thieves – Paquete de Monedas Antiguas Juego / contenido digital 1 700
Zalando – Tarjeta regalo Tienda / servicio 7 205
Carrefour – Tarjeta regalo Tienda / servicio 14 410
Cultura – Tarjeta regalo Tienda / servicio 14 410
Fnac‑Darty – Tarjeta regalo Tienda / servicio 14 410
La Redoute – Tarjeta regalo Tienda / servicio 14 410
Mango – Tarjeta regalo Tienda / servicio 36 025
Wonderbox – Tarjeta regalo Tienda / servicio 14 410
Yves Rocher – Tarjeta regalo Tienda / servicio 14 410
Amazon.fr – Vales regalo Tienda / servicio 7 205
Foot Locker – Tarjeta regalo Tienda / servicio 14 410
IKEA FR – Tarjeta regalo Tienda / servicio 36 025
IKEA FR – Tarjeta regalo (otro diseño) Tienda / servicio 7 200
Marionnaud – Tarjeta regalo Tienda / servicio 14 410
Asos – Tarjeta regalo Tienda / servicio 14 410
Adidas FR – Tarjeta regalo Tienda / servicio 14 410
Deliveroo France – Tarjeta regalo Tienda / servicio 21 615
H&M France – Tarjeta regalo Tienda / servicio 14 410
Global Hotel Card (Expedia Group) Tienda / servicio 7 205
Uber Eats France – Tarjeta regalo Tienda / servicio 36 025

Ahora que entiendes el propósito de este programa, pasemos al botting.


Primeras pruebas

Antes de construir mi bot, quería asegurarme de que no me marcarían la IP por usar cientos de cuentas desde la misma dirección. Me conoces, voy a usar Tor con un proxy rotatorio. Y no quiero alojar mi bot en un VPS -- quiero que se ejecute en una GitHub Action.

Así que escribí un workflow simple:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Este workflow simplemente instala Tor, lo inicia y hace una solicitud curl a través de él.

La primera ejecución dio este resultado:
Primera ejecución Tor curl

Las estadísticas de tiempo fueron:
!Timings

Una segunda ejecución dio este resultado:
Segunda ejecución Tor curl

Como puedes ver, las IPs son diferentes, así que no nos marcarán por uso abusivo desde la misma IP. Esas son buenas noticias -- podemos seguir desarrollando el bot de cultivo.


Primera prueba con Selenium

Para automatizar la interfaz, voy a usar Selenium: una herramienta que controla un navegador real (Chrome/Edge/Firefox) en lugar de un usuario. En el contexto de una GitHub Action, esto significa instalar un navegador + su driver, y luego ejecutar un script que inicia sesión en Microsoft Rewards y hace clic donde sea necesario.

Script de ejemplo en JavaScript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Resultado del script:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Vale, eso significa que todavía no hemos iniciado sesión, así que ahora construiremos la solicitud de inicio de sesión y veremos si podemos acceder a nuestra cuenta de Microsoft Rewards para hacer las actividades.

Automatizando uma Farm do Microsoft Rewards

Como eu codei um bot para farmar pontos do Microsoft Rewards em grande

Nota (2026): Este projeto não é mais mantido. A Microsoft reforçou consideravelmente sua detecção anti-bot -- o que funcionava na época não funciona mais hoje. O código e a abordagem descritos abaixo são mantidos apenas para fins de arquivo e demonstração.

Introdução

Descobri o Microsoft Rewards alguns anos atrás. Foi durante o lockdown, mas isso não muda o fato de que eu era obrigado a usar o controle parental Microsoft Family Safety e, portanto, a usar o Edge. Foi aí que descobri o Rewards.

Na época eu tinha apenas 14 anos e nada no catálogo me interessava. Agora eu penso que com as habilidades que adquiri, posso farmar pontos com bots, depois dar os códigos ou até mesmo revendê-los mais barato se eu realmente quiser (mas honestamente, acho que não vou fazer isso). Enfim, vou te contar como codei um bot que farma contas em escala.


O que é o Microsoft Rewards?

Resumindo: é um programa que recompensa usuários do Edge com pontos por atividades como pesquisas, quizzes, jogos e uma extensão (mas isso é outra história).

Você vê aqui as coisas "Explore":
Explore screenshot

Aqui por exemplo é o que eles chamam de "conjunto do dia".
Daily set screenshot

Eles ainda fizeram um sistema de streak, é bem louco.
Streak screenshot

Tem também um sistema de nível e é simplesmente muito divertido:
Level screenshot

Então você tem várias maneiras de ganhar pontos, e a maioria é diária. A ideia aqui é fazer um bot que realiza as atividades no seu lugar, para farmar pontos em escala e completar sua rotina de farming.

Como você pode ver abaixo, a maioria das recompensas são cartões-presente, mas também tem coisas legais como jogos ou assinaturas.
Rewards screenshot

Recompensa Categoria Custo em pontos
Rakuten TV – 1 filme HD Conteúdo digital 1 785
Roblox (cartão digital) Jogo / conteúdo digital 6 750
Cartão-presente Microsoft Loja / serviço 5 660
Cartão-presente Xbox Loja / serviço 5 660
Cartão-presente Microsoft Solitaire Collection Jogo / conteúdo digital 1 500
Minecraft Minecoins Jogo / conteúdo digital 2 500
Cartão-presente League of Legends Jogo / conteúdo digital 2 000
Código Overwatch moedas (digital) Jogo / conteúdo digital 2 000
Sea of Thieves – Pacote de Moedas Antigas Jogo / conteúdo digital 1 700
Zalando – Cartão-presente Loja / serviço 7 205
Carrefour – Cartão-presente Loja / serviço 14 410
Cultura – Cartão-presente Loja / serviço 14 410
Fnac‑Darty – Cartão-presente Loja / serviço 14 410
La Redoute – Cartão-presente Loja / serviço 14 410
Mango – Cartão-presente Loja / serviço 36 025
Wonderbox – Cartão-presente Loja / serviço 14 410
Yves Rocher – Cartão-presente Loja / serviço 14 410
Amazon.fr – Cheque-presente Loja / serviço 7 205
Foot Locker – Cartão-presente Loja / serviço 14 410
IKEA FR – Cartão-presente Loja / serviço 36 025
IKEA FR – Cartão-presente (outro design) Loja / serviço 7 200
Marionnaud – Cartão-presente Loja / serviço 14 410
Asos – Cartão-presente Loja / serviço 14 410
Adidas FR – Cartão-presente Loja / serviço 14 410
Deliveroo França – Cartão-presente Loja / serviço 21 615
H&M França – Cartão-presente Loja / serviço 14 410
Global Hotel Card (Expedia Group) Loja / serviço 7 205
Uber Eats França – Cartão-presente Loja / serviço 36 025

Agora que você entende o valor do programa, vamos nos concentrar no botting.


Primeiros testes

Antes de construir meu bot, eu queria ter certeza de que meu IP não seria marcado por ter usado centenas de contas do mesmo endereço. Você me conhece, vou usar Tor com um proxy rotativo. E não quero hospedar meu bot em um VPS -- quero que ele rode em uma GitHub Action.

Então escrevi um workflow simples:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Esse workflow apenas instala o Tor, o inicia e faz uma requisição curl através dele.

A primeira execução deu este resultado:
Tor curl first run

As estatísticas de tempo foram:
!Timings

Uma segunda execução deu este resultado:
Tor curl second run

Como você pode ver, os IPs são diferentes, então não seremos sinalizados por uso abusivo do mesmo IP. Boa notícia -- podemos continuar desenvolvendo o bot de farming.


Primeiro teste com Selenium

Para automatizar a interface, vou usar Selenium: uma ferramenta que controla um navegador real (Chrome/Edge/Firefox) no lugar de um usuário. No contexto de uma GitHub Action, isso significa instalar um navegador + seu driver, depois executar um script que se conecta ao Microsoft Rewards e clica onde for necessário.

Exemplo de script JavaScript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Resultado do script:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bem-vindo ao Microsoft Rewards!
Page loaded, sign in button found: Entrar

Ok, isso significa que ainda não estamos logados, então agora vamos construir a requisição de login e ver se conseguimos nos conectar à nossa conta do Microsoft Rewards para realizar as atividades.

Membot sebuah Farm Microsoft Rewards

Bagaimana saya membuat bot untuk memanen poin Microsoft Rewards secara

Catatan (2026) : Proyek ini tidak lagi dipertahankan. Microsoft telah secara signifikan memperkuat deteksi anti-bot mereka -- apa yang dulu berhasil sekarang sudah tidak berfungsi lagi. Kode dan pendekatan yang dijelaskan di bawah ini disimpan untuk tujuan arsip dan demonstrasi saja.

Pendahuluan

Saya menemukan Microsoft Rewards beberapa tahun yang lalu. Itu terjadi selama masa karantina, tapi itu tidak mengubah fakta bahwa saya diharuskan menggunakan parental control Microsoft Family Safety dan oleh karena itu harus melalui Edge. Saat itulah saya menemukan Rewards.

Saat itu saya baru berusia 14 tahun dan tidak ada apa pun di katalog yang menarik minat saya. Sekarang saya berpikir, dengan keterampilan yang saya peroleh, saya bisa memanen poin dengan bot, lalu memberikan kode-kodenya atau bahkan menjualnya kembali dengan harga lebih murah jika saya benar-benar menginginkannya (tapi sejujurnya, saya rasa tidak akan melakukannya). Singkat cerita, saya akan menceritakan bagaimana saya membuat bot yang memanen akun secara besar-besaran.


Apa itu Microsoft Rewards?

Singkatnya: ini adalah program yang memberi penghargaan kepada pengguna Edge dengan poin untuk aktivitas seperti pencarian, kuis kecil, permainan, dan sebuah ekstensi (tapi itu cerita lain).

Kamu bisa lihat di sini hal-hal "Explore":
Explore screenshot

Misalnya ini yang mereka sebut "set harian".
Daily set screenshot

Mereka bahkan membuat sistem streak, cukup gila.
Streak screenshot

Ada juga sistem level dan itu benar-benar menyenangkan:
Level screenshot

Jadi ada banyak cara untuk mendapatkan poin, dan sebagian besar dilakukan setiap hari.
Idenya di sini adalah membuat bot yang melakukan aktivitas untukmu, untuk memanen poin secara besar-besaran dan melengkapi rutinitas farming-mu.

Seperti yang bisa kamu lihat di bawah, sebagian besar hadiah adalah kartu hadiah, tapi ada juga hal-hal keren seperti game atau langganan.
Rewards screenshot

Hadiah Kategori Biaya poin
Rakuten TV – 1 film HD Konten digital 1 785
Roblox (kartu digital) Game / konten digital 6 750
Kartu Hadiah Microsoft Toko / layanan 5 660
Kartu Hadiah Xbox Toko / layanan 5 660
Kartu Hadiah Microsoft Solitaire Collection Game / konten digital 1 500
Minecraft Minecoins Game / konten digital 2 500
Kartu Hadiah League of Legends Game / konten digital 2 000
Kode Overwatch koin (digital) Game / konten digital 2 000
Sea of Thieves – Paket Koin Kuno Game / konten digital 1 700
Zalando – Kartu Hadiah Toko / layanan 7 205
Carrefour – Kartu Hadiah Toko / layanan 14 410
Cultura – Kartu Hadiah Toko / layanan 14 410
Fnac‑Darty – Kartu Hadiah Toko / layanan 14 410
La Redoute – Kartu Hadiah Toko / layanan 14 410
Mango – Kartu Hadiah Toko / layanan 36 025
Wonderbox – Kartu Hadiah Toko / layanan 14 410
Yves Rocher – Kartu Hadiah Toko / layanan 14 410
Amazon.fr – Cek Hadiah Toko / layanan 7 205
Foot Locker – Kartu Hadiah Toko / layanan 14 410
IKEA FR – Kartu Hadiah Toko / layanan 36 025
IKEA FR – Kartu Hadiah (desain lain) Toko / layanan 7 200
Marionnaud – Kartu Hadiah Toko / layanan 14 410
Asos – Kartu Hadiah Toko / layanan 14 410
Adidas FR – Kartu Hadiah Toko / layanan 14 410
Deliveroo France – Kartu Hadiah Toko / layanan 21 615
H&M France – Kartu Hadiah Toko / layanan 14 410
Global Hotel Card (Expedia Group) Toko / layanan 7 205
Uber Eats France – Kartu Hadiah Toko / layanan 36 025

Sekarang setelah kamu memahami manfaat program ini, mari kita bahas tentang botting.


Pengujian awal

Sebelum membangun bot, saya ingin memastikan bahwa IP saya tidak akan ditandai karena telah menggunakan ratusan akun dari alamat yang sama. Kamu tahu saya, saya akan menggunakan Tor dengan proxy rotasi. Dan saya tidak ingin menghosting bot di VPS -- saya ingin bot berjalan di GitHub Action.

Jadi saya menulis workflow sederhana:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Workflow ini hanya menginstal Tor, menjalankannya, dan membuat permintaan curl melaluinya.

Jalankan pertama memberikan hasil ini:
Tor curl first run

Statistik waktunya adalah:
!Timings

Jalankan kedua memberikan hasil ini:
Tor curl second run

Seperti yang kamu lihat, IP-nya berbeda, jadi kita tidak akan ditandai karena penggunaan berlebihan dari IP yang sama. Kabar baik -- kita bisa lanjut mengembangkan bot farming.


Pengujian pertama dengan Selenium

Untuk mengotomatiskan antarmuka, saya akan menggunakan Selenium: sebuah alat yang mengontrol peramban sungguhan (Chrome/Edge/Firefox) sebagai pengganti pengguna. Dalam konteks GitHub Action, ini berarti menginstal peramban + driver-nya, lalu menjalankan skrip yang terhubung ke Microsoft Rewards dan mengklik di tempat yang diperlukan.

Contoh skrip JavaScript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Hasil skrip:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Selamat datang di Microsoft Rewards!
Page loaded, sign in button found: Masuk

Ok, itu berarti kita belum login, jadi sekarang kita akan membangun permintaan login dan melihat apakah kita bisa masuk ke akun Microsoft Rewards kita untuk melakukan aktivitas.

माइक्रोसॉफ्ट रिवॉर्ड्स फार्मिंग बॉट

मैंने कैसे एक बॉट कोड किया जो बड़े पैमाने पर माइक्रोसॉफ्ट रिवॉर्ड्स पॉइंट्स

नोट (2026): यह प्रोजेक्ट अब मेंटेन नहीं किया जाता। माइक्रोसॉफ्ट ने अपनी एंटी-बॉट डिटेक्शन को काफी मजबूत कर लिया है -- जो उस समय काम करता था वह आज काम नहीं करता। नीचे वर्णित कोड और दृष्टिकोण केवल आर्काइव और प्रदर्शन उद्देश्यों के लिए संरक्षित किए गए हैं।

परिचय

मैंने माइक्रोसॉफ्ट रिवॉर्ड्स की खोज कुछ साल पहले की थी। यह लॉकडाउन के दौरान की बात है, लेकिन इससे यह तथ्य नहीं बदलता कि मुझे माइक्रोसॉफ्ट फैमिली सेफ्टी के पैरेंटल कंट्रोल का उपयोग करना पड़ता था और इसलिए एज के ज़रिए ही जाना पड़ता था। तभी मैंने रिवॉर्ड्स की खोज की।

उस समय मैं केवल 14 साल का था और कैटलॉग में मेरी रुचि की कोई चीज़ नहीं थी। अब मैं सोचता हूँ कि मैंने जो कौशल हासिल किए हैं, उनके साथ मैं बॉट्स के ज़रिए पॉइंट्स फार्म कर सकता हूँ, फिर कोड दे सकता हूँ या अगर सचमुच चाहूँ तो उन्हें सस्ते में बेच भी सकता हूँ (लेकिन ईमानदारी से कहूँ तो, मुझे नहीं लगता कि मैं ऐसा करूँगा)। खैर, मैं आपको बताने जा रहा हूँ कि कैसे मैंने एक ऐसा बॉट कोड किया जो बड़े पैमाने पर अकाउंट्स फार्म करता है।


माइक्रोसॉफ्ट रिवॉर्ड्स क्या है?

संक्षेप में: यह एक प्रोग्राम है जो एज उपयोगकर्ताओं को सर्च, छोटे क्विज़, गेम और एक एक्सटेंशन (लेकिन यह दूसरी कहानी है) जैसी गतिविधियों के लिए पॉइंट्स से पुरस्कृत करता है।

यहाँ आप "एक्सप्लोर" चीज़ें देख सकते हैं:
Explore screenshot

उदाहरण के लिए, यह वह है जिसे वे "डेली सेट" कहते हैं।
Daily set screenshot

उन्होंने स्ट्रीक सिस्टम भी बनाया है, जो काफी हैरान करने वाला है।
Streak screenshot

एक लेवल सिस्टम भी है और यह बिल्कुल मजेदार है:
Level screenshot

तो आपके पास पॉइंट्स कमाने के कई तरीके हैं, और उनमें से अधिकांश दैनिक हैं।
यहाँ विचार एक ऐसा बॉट बनाने का है जो आपके लिए गतिविधियाँ करेगा, ताकि बड़े पैमाने पर पॉइंट्स फार्म किए जा सकें और आपकी फार्मिंग रूटीन को पूरा किया जा सके।

जैसा कि आप नीचे देख सकते हैं, अधिकांश रिवॉर्ड्स गिफ्ट कार्ड हैं, लेकिन कुछ अच्छी चीज़ें भी हैं जैसे गेम या सब्सक्रिप्शन।
Rewards screenshot

रिवॉर्ड श्रेणी पॉइंट्स लागत
Rakuten TV – 1 HD फ़िल्म डिजिटल सामग्री 1 785
Roblox (डिजिटल कार्ड) गेम / डिजिटल सामग्री 6 750
माइक्रोसॉफ्ट गिफ्ट कार्ड स्टोर / सेवा 5 660
Xbox गिफ्ट कार्ड स्टोर / सेवा 5 660
माइक्रोसॉफ्ट सॉलिटेयर कलेक्शन गिफ्ट कार्ड गेम / डिजिटल सामग्री 1 500
Minecraft Minecoins गेम / डिजिटल सामग्री 2 500
League of Legends गिफ्ट कार्ड गेम / डिजिटल सामग्री 2 000
Overwatch कॉइन्स कोड (डिजिटल) गेम / डिजिटल सामग्री 2 000
Sea of Thieves – पैक एंशिएंट कॉइन्स गेम / डिजिटल सामग्री 1 700
Zalando – गिफ्ट कार्ड स्टोर / सेवा 7 205
Carrefour – गिफ्ट कार्ड स्टोर / सेवा 14 410
Cultura – गिफ्ट कार्ड स्टोर / सेवा 14 410
Fnac‑Darty – गिफ्ट कार्ड स्टोर / सेवा 14 410
La Redoute – गिफ्ट कार्ड स्टोर / सेवा 14 410
Mango – गिफ्ट कार्ड स्टोर / सेवा 36 025
Wonderbox – गिफ्ट कार्ड स्टोर / सेवा 14 410
Yves Rocher – गिफ्ट कार्ड स्टोर / सेवा 14 410
Amazon.fr – गिफ्ट वाउचर स्टोर / सेवा 7 205
Foot Locker – गिफ्ट कार्ड स्टोर / सेवा 14 410
IKEA FR – गिफ्ट कार्ड स्टोर / सेवा 36 025
IKEA FR – गिफ्ट कार्ड (दूसरा डिज़ाइन) स्टोर / सेवा 7 200
Marionnaud – गिफ्ट कार्ड स्टोर / सेवा 14 410
Asos – गिफ्ट कार्ड स्टोर / सेवा 14 410
Adidas FR – गिफ्ट कार्ड स्टोर / सेवा 14 410
Deliveroo France – गिफ्ट कार्ड स्टोर / सेवा 21 615
H&M France – गिफ्ट कार्ड स्टोर / सेवा 14 410
ग्लोबल होटल कार्ड (Expedia Group) स्टोर / सेवा 7 205
Uber Eats France – गिफ्ट कार्ड स्टोर / सेवा 36 025

अब जब आप प्रोग्राम के महत्व को समझ गए हैं, तो बॉटिंग पर ध्यान देते हैं।


पहले परीक्षण

अपना बॉट बनाने से पहले, मैं सुनिश्चित होना चाहता था कि एक ही पते से सैकड़ों अकाउंट्स का उपयोग करने पर मेरा आईपी फ्लैग न हो। आप मुझे जानते हैं, मैं रोटेटिंग प्रॉक्सी के साथ टोर का उपयोग करूँगा। और मैं अपना बॉट किसी VPS पर होस्ट नहीं करना चाहता -- मैं चाहता हूँ कि वह गिटहब एक्शन में चले।

इसलिए मैंने एक सरल वर्कफ़्लो लिखा:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

यह वर्कफ़्लो बस टोर इंस्टॉल करता है, उसे शुरू करता है, और उसके माध्यम से एक कर्ल रिक्वेस्ट करता है।

पहले रन का परिणाम यह रहा:
Tor curl first run

समय के आँकड़े ये थे:
!Timings

दूसरे रन का परिणाम यह रहा:
Tor curl second run

जैसा कि आप देख सकते हैं, आईपी अलग-अलग हैं, इसलिए हम एक ही आईपी से दुरुपयोग के लिए फ्लैग नहीं होंगे। अच्छी खबर है -- हम फार्मिंग बॉट विकसित करना जारी रख सकते हैं।


Selenium के साथ पहला परीक्षण

इंटरफ़ेस को ऑटोमेट करने के लिए, मैं Selenium का उपयोग करने जा रहा हूँ: एक टूल जो उपयोगकर्ता की जगह एक वास्तविक ब्राउज़र (Chrome/Edge/Firefox) को नियंत्रित करता है। गिटहब एक्शन के संदर्भ में, इसका मतलब है एक ब्राउज़र + उसका ड्राइवर इंस्टॉल करना, फिर एक स्क्रिप्ट चलाना जो माइक्रोसॉफ्ट रिवॉर्ड्स में लॉग इन करे और जहाँ ज़रूरत हो वहाँ क्लिक करे।

JavaScript स्क्रिप्ट का उदाहरण (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

स्क्रिप्ट का परिणाम:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

ठीक है, इसका मतलब है कि हमने अभी तक लॉग इन नहीं किया है, तो अब हम लॉगिन रिक्वेस्ट बनाएँगे और देखेंगे कि क्या हम अपने माइक्रोसॉफ्ट रिवॉर्ड्स अकाउंट में लॉग इन करके गतिविधियाँ कर सकते हैं।

بوتنة مزرعة Microsoft Rewards

كيف برمجت بوتًا لجني نقاط Microsoft Rewards على نطاق واسع -- ولماذا عززت

ملاحظة (2026): هذا المشروع لم يعد قيد الصيانة. مايكروسوفت عززت بشكل كبير اكتشافها لمكافحة البوتات -- ما كان يعمل في ذلك الوقت لم يعد يعمل اليوم. الكود والمنهجية الموصوفة أدناه مُحتفظ بها لأغراض الأرشفة والتوضيح فقط.

مقدمة

اكتشفت Microsoft Rewards منذ بضع سنوات. كان ذلك خلال فترة الحجر الصحي، لكن ذلك لا يغير حقيقة أنني كنت مضطرًا لاستخدام الرقابة الأبوية Microsoft Family Safety وبالتالي المرور عبر Edge. وهناك اكتشفت Rewards.

في ذلك الوقت كان عمري 14 سنة فقط ولم يكن هناك شيء في الكتالوج يثير اهتمامي. الآن أقول لنفسي أنه مع المهارات التي اكتسبتها، يمكنني جني النقاط باستخدام البوتات، ثم إعطاء الرموز أو حتى بيعها بسعر أقل إذا أردت حقًا (لكن بصراحة، لا أعتقد أنني سأفعل ذلك). المهم، سأخبرك كيف برمجت بوتًا يجني الحسابات على نطاق واسع.


ما هو Microsoft Rewards؟

باختصار: هو برنامج يكافئ مستخدمي Edge بنقاط مقابل أنشطة مثل عمليات البحث، اختبارات صغيرة، ألعاب، وإضافة (لكن تلك قصة أخرى).

ترى هنا أشياء "Explore": Explore screenshot

هذا مثلاً ما يسمونه "مجموعة اليوم". Daily set screenshot

حتى أنهم صنعوا نظامًا للتتابع، هذا مذهل جدًا. Streak screenshot

يوجد أيضًا نظام مستويات وهذا ممتع تمامًا: Level screenshot

إذن لديك طرق عديدة لكسب النقاط، ومعظمها يومية. الفكرة هنا ستكون صنع بوت يقوم بالأنشطة نيابة عنك، لجني النقاط على نطاق واسع وإكمال روتين الجني الخاص بك.

كما ترى أدناه، معظم المكافآت هي بطاقات هدايا، لكن هناك أيضًا أشياء رائعة مثل الألعاب أو الاشتراكات. Rewards screenshot

المكافأة الفئة التكلفة بالنقاط
Rakuten TV – فيلم HD محتوى رقمي 1٬785
Roblox (بطاقة رقمية) لعبة / محتوى رقمي 6٬750
بطاقة هدايا Microsoft متجر / خدمة 5٬660
بطاقة هدايا Xbox متجر / خدمة 5٬660
بطاقة هدايا Microsoft Solitaire Collection لعبة / محتوى رقمي 1٬500
Minecraft Minecoins لعبة / محتوى رقمي 2٬500
بطاقة هدايا League of Legends لعبة / محتوى رقمي 2٬000
رمز عملات Overwatch (رقمي) لعبة / محتوى رقمي 2٬000
Sea of Thieves – حزمة العملات القديمة لعبة / محتوى رقمي 1٬700
Zalando – بطاقة هدايا متجر / خدمة 7٬205
Carrefour – بطاقة هدايا متجر / خدمة 14٬410
Cultura – بطاقة هدايا متجر / خدمة 14٬410
Fnac‑Darty – بطاقة هدايا متجر / خدمة 14٬410
La Redoute – بطاقة هدايا متجر / خدمة 14٬410
Mango – بطاقة هدايا متجر / خدمة 36٬025
Wonderbox – بطاقة هدايا متجر / خدمة 14٬410
Yves Rocher – بطاقة هدايا متجر / خدمة 14٬410
Amazon.fr – شيك هدية متجر / خدمة 7٬205
Foot Locker – بطاقة هدايا متجر / خدمة 14٬410
IKEA FR – بطاقة هدايا متجر / خدمة 36٬025
IKEA FR – بطاقة هدايا (تصميم آخر) متجر / خدمة 7٬200
Marionnaud – بطاقة هدايا متجر / خدمة 14٬410
Asos – بطاقة هدايا متجر / خدمة 14٬410
Adidas FR – بطاقة هدايا متجر / خدمة 14٬410
Deliveroo France – بطاقة هدايا متجر / خدمة 21٬615
H&M France – بطاقة هدايا متجر / خدمة 14٬410
Global Hotel Card (Expedia Group) متجر / خدمة 7٬205
Uber Eats France – بطاقة هدايا متجر / خدمة 36٬025

الآن بعد أن فهمت قيمة البرنامج، دعنا ننتقل إلى البوتنة.


الاختبارات الأولى

قبل بناء البوت، أردت التأكد من أن عنوان IP الخاص بي لن يتم وضع علامة عليه لاستخدام مئات الحسابات من نفس العنوان. أنت تعرفني، سأستخدم Tor مع وكيل دوار. ولا أريد استضافة البوت على VPS -- أريده أن يعمل في GitHub Action.

لذا كتبت workflow بسيطًا:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

هذا الـ workflow يقوم فقط بتثبيت Tor، تشغيله، وإجراء طلب curl عبره.

التشغيل الأول أعطى هذه النتيجة: Tor curl first run

إحصائيات الوقت كانت: !Timings

تشغيل ثانٍ أعطى هذه النتيجة: Tor curl second run

كما ترى، عناوين IP مختلفة، لذا لن يتم الإبلاغ عنا لاستخدامنا المسيء من نفس IP. خبر جيد -- يمكننا مواصلة تطوير بوت الجني.


أول اختبار مع Selenium

لأتمتة الواجهة، سأستخدم Selenium: أداة تتحكم بمتصفح حقيقي (Chrome/Edge/Firefox) بدلاً من المستخدم. في سياق GitHub Action، هذا يعني تثبيت متصفح + مشغله، ثم تشغيل script يتصل بـ Microsoft Rewards وينقر حيث يجب.

مثال script بلغة JavaScript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

نتيجة الـ script:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

حسنًا، هذا يعني أننا لم نسجل الدخول بعد، لذا سنقوم الآن ببناء طلب تسجيل الدخول ونرى ما إذا كان بإمكاننا تسجيل الدخول إلى حساب Microsoft Rewards الخاص بنا للقيام بالأنشطة.

Bot một trang trại Microsoft Rewards

Cách tôi đã viết bot để farm điểm Microsoft Rewards trên quy mô lớn -- và tại sao Microsoft từ đó đã tăng cường phòng thủ.

Ghi chú (2026): Dự án này không còn được bảo trì nữa. Microsoft đã tăng cường đáng kể khả năng phát hiện chống bot -- những gì từng hoạt động trước đây giờ không còn hiệu quả. Mã và cách tiếp cận được mô tả dưới đây được giữ lại chỉ với mục đích lưu trữ và minh họa.

Giới thiệu

Tôi phát hiện ra Microsoft Rewards vài năm trước. Đó là trong thời gian phong tỏa, nhưng điều đó không thay đổi sự thật là tôi bị buộc phải sử dụng tính năng kiểm soát của phụ huynh Microsoft Family Safety và do đó phải dùng Edge. Đó là lúc tôi biết đến Rewards.

Lúc đó tôi mới chỉ 14 tuổi và chẳng có gì trong danh mục khiến tôi hứng thú. Bây giờ tôi nghĩ, với những kỹ năng đã học được, tôi có thể farm điểm bằng bot, rồi tặng mã hoặc thậm chí bán lại với giá rẻ hơn nếu tôi thực sự muốn (nhưng thành thật mà nói, tôi nghĩ mình sẽ không làm vậy). Dù sao thì, tôi sẽ kể cho bạn nghe cách tôi đã viết một bot farm tài khoản trên quy mô lớn.


Microsoft Rewards là gì?

Nói ngắn gọn: đó là chương trình thưởng cho người dùng Edge bằng điểm cho các hoạt động như tìm kiếm, câu đố nhỏ, trò chơi và tiện ích mở rộng (nhưng đó là chuyện khác).

Bạn thấy các mục "Explore" ở đây:
Explore screenshot

Ví dụ đây là cái họ gọi là "set trong ngày".
Daily set screenshot

Họ còn có cả hệ thống streak, khá là điên rồ.
Streak screenshot

Cũng có hệ thống cấp độ và nó thực sự rất vui:
Level screenshot

Vậy là có rất nhiều cách để kiếm điểm, và hầu hết đều là hàng ngày.
Ý tưởng ở đây là tạo một bot làm các hoạt động thay bạn, để farm điểm trên quy mô lớn và hoàn thành thói quen farm của bạn.

Như bạn thấy bên dưới, hầu hết phần thưởng là thẻ quà tặng, nhưng cũng có những thứ thú vị như trò chơi hoặc gói đăng ký.
Rewards screenshot

Phần thưởng Danh mục Chi phí (điểm)
Rakuten TV – 1 phim HD Nội dung số 1 785
Roblox (thẻ kỹ thuật số) Trò chơi / Nội dung số 6 750
Thẻ quà tặng Microsoft Cửa hàng / Dịch vụ 5 660
Thẻ quà tặng Xbox Cửa hàng / Dịch vụ 5 660
Thẻ quà tặng Microsoft Solitaire Collection Trò chơi / Nội dung số 1 500
Minecraft Minecoins Trò chơi / Nội dung số 2 500
Thẻ quà tặng League of Legends Trò chơi / Nội dung số 2 000
Mã Overwatch coins (kỹ thuật số) Trò chơi / Nội dung số 2 000
Sea of Thieves – Gói Cổ vật Trò chơi / Nội dung số 1 700
Zalando – Thẻ quà tặng Cửa hàng / Dịch vụ 7 205
Carrefour – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Cultura – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Fnac‑Darty – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
La Redoute – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Mango – Thẻ quà tặng Cửa hàng / Dịch vụ 36 025
Wonderbox – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Yves Rocher – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Amazon.fr – Séc quà tặng Cửa hàng / Dịch vụ 7 205
Foot Locker – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
IKEA FR – Thẻ quà tặng Cửa hàng / Dịch vụ 36 025
IKEA FR – Thẻ quà tặng (kiểu khác) Cửa hàng / Dịch vụ 7 200
Marionnaud – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Asos – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Adidas FR – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Deliveroo France – Thẻ quà tặng Cửa hàng / Dịch vụ 21 615
H&M France – Thẻ quà tặng Cửa hàng / Dịch vụ 14 410
Global Hotel Card (Expedia Group) Cửa hàng / Dịch vụ 7 205
Uber Eats France – Thẻ quà tặng Cửa hàng / Dịch vụ 36 025

Giờ bạn đã hiểu chương trình này hấp dẫn thế nào, hãy cùng tìm hiểu về botting.


Thử nghiệm đầu tiên

Trước khi xây dựng bot, tôi muốn chắc chắn rằng IP của mình sẽ không bị đánh dấu vì đã sử dụng hàng trăm tài khoản từ cùng một địa chỉ. Bạn biết tôi mà, tôi sẽ dùng Tor với proxy xoay vòng. Và tôi không muốn host bot trên VPS -- tôi muốn nó chạy trong một GitHub Action.

Vậy là tôi đã viết một workflow đơn giản:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

Workflow này chỉ cài Tor, khởi động nó và thực hiện một yêu cầu curl qua nó.

Lần chạy đầu tiên cho kết quả này:
Tor curl first run

Thống kê thời gian:
!Timings

Lần chạy thứ hai cho kết quả này:
Tor curl second run

Như bạn thấy, các IP đều khác nhau, nên chúng ta sẽ không bị gắn cờ vì lạm dụng từ cùng một IP. Tin tốt -- chúng ta có thể tiếp tục phát triển bot farm.


Thử nghiệm đầu tiên với Selenium

Để tự động hóa giao diện, tôi sẽ sử dụng Selenium: một công cụ điều khiển trình duyệt thật (Chrome/Edge/Firefox) thay cho người dùng. Trong bối cảnh GitHub Action, điều này có nghĩa là cài đặt trình duyệt + driver của nó, sau đó chạy một script đăng nhập vào Microsoft Rewards và nhấp vào những chỗ cần thiết.

Ví dụ script JavaScript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

Kết quả script:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Ok, điều đó có nghĩa là chúng ta chưa đăng nhập, vậy bây giờ chúng ta sẽ xây dựng yêu cầu đăng nhập và xem liệu có thể đăng nhập vào tài khoản Microsoft Rewards để thực hiện các hoạt động hay không.

บอทฟาร์ม Microsoft Rewards

วิธีที่ผมเขียนบอทเพื่อฟาร์มคะแนน Microsoft Rewards แบบขนาดใหญ่ -- และเหตุใด Microsoft จึงเสริมการป้องกันตั้งแต่ตอนนั้น

หมายเหตุ (2026): โปรเจกต์นี้ไม่ได้ดูแลอีกต่อไปแล้ว Microsoft ได้เสริมการตรวจจับแอนตี้บอทอย่างมาก -- สิ่งที่เคยใช้ได้ในตอนนั้นไม่สามารถใช้ได้อีกแล้วในวันนี้ โค้ดและแนวทางที่อธิบายไว้ด้านล่างนี้เก็บไว้เพื่อวัตถุประสงค์ในการเก็บถาวรและสาธิตเท่านั้น

บทนำ

ผมค้นพบ Microsoft Rewards เมื่อไม่กี่ปีที่แล้ว ตอนนั้นเป็นช่วงล็อกดาวน์ แต่มันก็ไม่ได้เปลี่ยนความจริงที่ว่าผมจำเป็นต้องใช้ระบบควบคุมโดยผู้ปกครอง Microsoft Family Safety และจึงต้องใช้ Edge นั่นคือตอนที่ผมค้นพบ Rewards

ตอนนั้นผมอายุแค่ 14 ปี และไม่มีอะไรในแคตตาล็อกที่สนใจ ตอนนี้ผมคิดว่าด้วยทักษะที่ผมได้มา ผมสามารถฟาร์มคะแนนด้วยบอท แล้วนำโค้ดไปให้หรือแม้กระทั่งขายต่อในราคาถูกกว่าถ้าผมอยากจริง ๆ (แต่เอาจริง ๆ ผมคิดว่าคงไม่ทำ) ยังไงก็ตาม ผมจะเล่าให้ฟังว่าผมเขียนบอทที่ฟาร์มบัญชีแบบขนาดใหญ่ได้อย่างไร


Microsoft Rewards คืออะไร ?

พูดสั้น ๆ คือ: มันเป็นโปรแกรมที่ให้รางวัลผู้ใช้ Edge ด้วยคะแนนสำหรับกิจกรรมต่าง ๆ เช่น การค้นหา แบบทดสอบเล็ก ๆ เกม และส่วนขยาย (แต่นั่นเป็นอีกเรื่องหนึ่ง)

คุณเห็นพวก "Explore" ตรงนี้:
ภาพหน้าจอ Explore

ตัวอย่างเช่นนี่คือสิ่งที่เขาเรียกว่า "ชุดประจำวัน"
ภาพหน้าจอชุดประจำวัน

เขาถึงกับทำระบบสตรีคด้วย นี่มันบ้ามาก
ภาพหน้าจอสตรีค

ยังมีระบบเลเวลอีกด้วย และมันสนุกสุด ๆ:
ภาพหน้าจอเลเวล

ดังนั้นคุณมีหลายวิธีในการรับคะแนน และส่วนใหญ่เป็นกิจกรรมประจำวัน แนวคิดคือการทำบอทที่ทำกิจกรรมเหล่านี้แทนคุณ เพื่อฟาร์มคะแนนแบบขนาดใหญ่และทำกิจวัตรการฟาร์มของคุณให้สมบูรณ์

อย่างที่คุณเห็นด้านล่าง รางวัลส่วนใหญ่เป็นบัตรของขวัญ แต่ก็มีของดี ๆ เช่น เกมหรือการสมัครสมาชิกด้วย
ภาพหน้าจอรางวัล

รางวัล หมวดหมู่ ต้นทุนคะแนน
Rakuten TV – 1 ภาพยนตร์ HD เนื้อหาดิจิทัล 1 785
Roblox (บัตรดิจิทัล) เกม / เนื้อหาดิจิทัล 6 750
บัตรของขวัญ Microsoft ร้านค้า / บริการ 5 660
บัตรของขวัญ Xbox ร้านค้า / บริการ 5 660
บัตรของขวัญ Microsoft Solitaire Collection เกม / เนื้อหาดิจิทัล 1 500
Minecraft Minecoins เกม / เนื้อหาดิจิทัล 2 500
บัตรของขวัญ League of Legends เกม / เนื้อหาดิจิทัล 2 000
โค้ด Overwatch เหรียญ (ดิจิทัล) เกม / เนื้อหาดิจิทัล 2 000
Sea of Thieves – ชุดเหรียญโบราณ เกม / เนื้อหาดิจิทัล 1 700
Zalando – บัตรของขวัญ ร้านค้า / บริการ 7 205
Carrefour – บัตรของขวัญ ร้านค้า / บริการ 14 410
Cultura – บัตรของขวัญ ร้านค้า / บริการ 14 410
Fnac‑Darty – บัตรของขวัญ ร้านค้า / บริการ 14 410
La Redoute – บัตรของขวัญ ร้านค้า / บริการ 14 410
Mango – บัตรของขวัญ ร้านค้า / บริการ 36 025
Wonderbox – บัตรของขวัญ ร้านค้า / บริการ 14 410
Yves Rocher – บัตรของขวัญ ร้านค้า / บริการ 14 410
Amazon.fr – เช็คของขวัญ ร้านค้า / บริการ 7 205
Foot Locker – บัตรของขวัญ ร้านค้า / บริการ 14 410
IKEA FR – บัตรของขวัญ ร้านค้า / บริการ 36 025
IKEA FR – บัตรของขวัญ (แบบอื่น) ร้านค้า / บริการ 7 200
Marionnaud – บัตรของขวัญ ร้านค้า / บริการ 14 410
Asos – บัตรของขวัญ ร้านค้า / บริการ 14 410
Adidas FR – บัตรของขวัญ ร้านค้า / บริการ 14 410
Deliveroo France – บัตรของขวัญ ร้านค้า / บริการ 21 615
H&M France – บัตรของขวัญ ร้านค้า / บริการ 14 410
Global Hotel Card (Expedia Group) ร้านค้า / บริการ 7 205
Uber Eats France – บัตรของขวัญ ร้านค้า / บริการ 36 025

ตอนนี้คุณเข้าใจถึงความน่าสนใจของโปรแกรมแล้ว มาดูเรื่องบอทติ้งกันดีกว่า


การทดสอบครั้งแรก

ก่อนที่จะสร้างบอท ผมอยากแน่ใจว่า IP ของผมจะไม่ถูกตั้งค่าสถานะเพราะใช้หลายร้อยบัญชีจากที่อยู่เดียวกัน คุณรู้จักผมนะ ผมจะใช้ Tor พร้อมพร็อกซีหมุนเวียน และผมไม่อยากโฮสต์บอทบน VPS -- ผมอยากให้มันทำงานใน GitHub Action

ดังนั้นผมจึงเขียน workflow ง่าย ๆ:

name: Tor Proxy Curl

on:
  workflow_dispatch:

jobs:
  tor-proxy-curl:
    runs-on: ubuntu-latest

    steps:
      - name: Install Tor and curl
        run: |
          sudo apt-get update
          sudo apt-get install -y tor curl

      - name: Start Tor service
        run: |
          sudo systemctl enable tor
          sudo systemctl start tor
          for i in {1..30}; do
            if ss -lnt | grep -q ':9050'; then
              echo "Tor SOCKS proxy is listening on 127.0.0.1:9050"
              exit 0
            fi
            sleep 1
          done
          echo "Tor SOCKS proxy did not start in time"
          sudo journalctl -u tor --no-pager | tail -n 50
          exit 1

      - name: Set proxy environment variables
        run: |
          echo "ALL_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "all_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTP_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "http_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "HTTPS_PROXY=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "https_proxy=socks5h://127.0.0.1:9050" >> "$GITHUB_ENV"
          echo "NO_PROXY=localhost,127.0.0.1" >> "$GITHUB_ENV"
          echo "no_proxy=localhost,127.0.0.1" >> "$GITHUB_ENV"

      - name: Execute curl via Tor proxy
        run: |
          echo "Using proxy: $ALL_PROXY"
          curl --fail --silent --show-error --proxy "$ALL_PROXY" https://check.torproject.org/api/ip

workflow นี้แค่ติดตั้ง Tor เริ่มมัน แล้วส่งคำขอ curl ผ่านมัน

การรันครั้งแรกได้ผลลัพธ์นี้:
Tor curl รันครั้งแรก

สถิติเวลาเป็นดังนี้:

การรันครั้งที่สองได้ผลลัพธ์นี้:
Tor curl รันครั้งที่สอง

อย่างที่คุณเห็น IP แตกต่างกัน ดังนั้นเราจะไม่ถูกธงว่ามีการใช้งานที่ผิดปกติจาก IP เดียวกัน ข่าวดี -- เราสามารถพัฒนาบอทฟาร์มต่อได้


การทดสอบครั้งแรกกับ Selenium

เพื่อทำให้อินเทอร์เฟซเป็นอัตโนมัติ ผมจะใช้ Selenium: เครื่องมือที่ควบคุมเบราว์เซอร์จริง (Chrome/Edge/Firefox) แทนผู้ใช้ ในบริบทของ GitHub Action นั่นหมายถึงการติดตั้งเบราว์เซอร์ + ไดรเวอร์ของมัน จากนั้นรันสคริปต์ที่เข้าสู่ระบบ Microsoft Rewards และคลิกในที่ที่ต้องการ

ตัวอย่างสคริปต์ JavaScript (Node.js + selenium-webdriver)

import { Builder, By, Capabilities, until, WebDriver } from 'selenium-webdriver';

const chromeOptions = {
  args: [
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--disable-blink-features=AutomationControlled',
    // '--proxy-server=socks5://127.0.0.1:9050'
  ],
  excludeSwitches: ['enable-automation'],
  useAutomationExtension: false,
};

async function applyStealth(driver: WebDriver) {
  // Inject script before any page JS runs to reduce automation fingerprinting.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Some sites check for chrome runtime and plugins
      window.chrome = { runtime: {} };
      Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
      });
      Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
      });
    `,
  });
}

(async () => {
  const caps = Capabilities.chrome().set('goog:chromeOptions', chromeOptions);
  const driver = await new Builder().withCapabilities(caps).build();

  await applyStealth(driver);

  try {
    const targetUrl = 'https://rewards.bing.com/';
    await driver.get(targetUrl);

    console.log('After navigation: url=', await driver.getCurrentUrl());
    console.log('After navigation: title=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'Timed out waiting for sign-in button (may indicate 400/blocked page)'
    );

    console.log('Page loaded, sign in button found:', await signInButton.getText());
  } finally {
    await driver.quit();
  }
})();

ผลลัพธ์ของสคริปต์:

DevTools listening on ws://127.0.0.1:50274/devtools/browser/37b9ea79-0e5d-4673-9e91-7ffeaf0d37f8
After navigation: url= https://rewards.bing.com/welcome?idru=%2F
After navigation: title= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

โอเค นั่นหมายความว่าเรายังไม่ได้เข้าสู่ระบบ ตอนนี้เราจะสร้างคำขอเข้าสู่ระบบและดูว่าเราสามารถเข้าสู่บัญชี Microsoft Rewards ของเราเพื่อทำกิจกรรมได้หรือไม่

Related Articles