GitHub avatar

Fox's Blog

Botting a Microsoft Rewards Farm

How I coded a bot to farm Microsoft Rewards points at

Note (2026): This project is no longer maintained. Microsoft has considerably hardened its anti-bot detection, so what worked back then no longer works today. The code and approach below are kept for archiving and demonstration purposes only.

Introduction

I discovered Microsoft Rewards a few years ago. It was during lockdown, and back then I was forced to use the Microsoft Family Safety parental controls and therefore go through Edge. That's how I discovered Rewards.

At the time I was only 14 and nothing in the catalog interested me. Now I figure that with the skills I've picked up, I can farm points with bots, then give the codes away or even resell them cheaper if I really feel like it (but honestly, I don't think I'll do it). Let me tell you how I coded a bot that farms accounts at scale.


What Is Microsoft Rewards?

To keep it short: it's a program that rewards Edge users with points for activities like searches, small quizzes, games, and an extension (but that's another story).

You can see the "Explore" blocks here: Explore screenshot

Here for example is what they call the "daily set". Daily set screenshot

They even made a streak system, which is pretty wild. Streak screenshot

There's also a level system and the progression makes the routine genuinely addictive: Level screenshot

So you've got plenty of ways to earn points, and most of them are daily. The idea here is to build a bot that does the activities for you, to farm points at scale and complete your farming routine.

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

Reward Category Point cost
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 coins code (digital) Game / digital content 2 000
Sea of Thieves – Ancient 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 get the point of the program, let's get into botting.


First tests

Before building my bot, I wanted to make sure my IP wouldn't get flagged for using hundreds of accounts from the same address. You know me, I go through Tor with a rotating proxy. I want to run it in a GitHub Action rather than on a VPS.

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 timing stats were: !Timings

A second run gave this result: Tor curl second run

As you can see, the IPs are different, so we avoid flagging for abusive use from the same IP. Good news: we can keep building the farming bot.


First test with Selenium

To automate the UI, I'll use Selenium: a tool that controls a real browser (Chrome/Edge/Firefox) in place of a user. In a GitHub Action context, that means installing a browser + its driver, then running a script that signs into Microsoft Rewards and clicks where it needs to.

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();
  }
})();

Script output:

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

That result confirms we're still signed out, so now I'll build the login request and test signing into my Microsoft Rewards account to automate 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, donc 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, et à l'époque 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). 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 blocs "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 la progression rend la routine vraiment addictive :
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 options intéressantes 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 passe par Tor avec un proxy rotatif. Je veux l'exécuter dans une GitHub Action plutôt que sur un VPS.

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 évite un marquage 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

Ce résultat confirme qu'on est encore déconnecté, donc maintenant je vais construire la requête de login et tester la connexion à mon compte Microsoft Rewards pour automatiser les activités.

刷 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 – 1 部高清电影 数字内容 1 785
Roblox(数字卡) 游戏 / 数字内容 6 750
微软礼品卡 商店 / 服务 5 660
Xbox 礼品卡 商店 / 服务 5 660
Microsoft Solitaire Collection 礼品卡 游戏 / 数字内容 1 500
Minecraft Minecoins 游戏 / 数字内容 2 500
英雄联盟礼品卡 游戏 / 数字内容 2 000
守望先锋硬币兑换码(数字) 游戏 / 数字内容 2 000
盗贼之海 – 古钱币包 游戏 / 数字内容 1 700
Zalando – 礼品卡 商店 / 服务 7 205
家乐福 – 礼品卡 商店 / 服务 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
宜家法国 – 礼品卡 商店 / 服务 36 025
宜家法国 – 礼品卡(另一款设计) 商店 / 服务 7 200
Marionnaud – 礼品卡 商店 / 服务 14 410
Asos – 礼品卡 商店 / 服务 14 410
阿迪达斯法国 – 礼品卡 商店 / 服务 14 410
Deliveroo 法国 – 礼品卡 商店 / 服务 21 615
H&M 法国 – 礼品卡 商店 / 服务 14 410
Global Hotel Card(Expedia 集团) 商店 / 服务 7 205
Uber Eats 法国 – 礼品卡 商店 / 服务 36 025

现在你明白这个计划为什么诱人了,来聊刷分机器人吧。


初步测试

在写机器人之前,我想确认我的 IP 不会因为同一地址登录几百个号被标记。你懂我的,我走 Tor 加轮换代理。我想跑在 GitHub Action 里,而不是 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 穿过去请求一次。

第一次运行结果: Tor curl first run

耗时统计: !Timings

第二次运行结果: Tor curl second run

可以看到两次 IP 不一样,所以不会因为同 IP 滥用被标记。好消息:可以继续开发刷分机器人了。


用 Selenium 做第一次测试

要操作界面,我用 Selenium:它控制一个真正的浏览器(Chrome/Edge/Firefox),替用户点。在 GitHub Action 里,就是装浏览器加 driver,再跑脚本登录 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がその後防御をどう固めたか。

注意(2026年): このプロジェクトはもう保守してない。Microsoftはボット対策の検出を大幅に強化したので、当時動いたものは今はもう動かない。以下のコードと手法はアーカイブとデモ目的でのみ残してある。

はじめに

Microsoft Rewardsを知ったのは数年前だ。ロックダウン期間中で、当時はMicrosoft Family Safetyのペアレンタルコントロールを使う義務があってEdge経由だった。そこでRewardsに出会った。

当時は14歳だけでカタログに欲しいものは何もなかった。今思うと、身に付けたスキルでポイントをファームするボットを作って、コードを配ったり、気が向けば安く売ったりもできる(でも正直やる気はない)。複数アカウントを規模化してファームするボットをどうコーディングしたか話すよ。


Microsoft Rewardsって何?

手短に言うと、Edgeユーザーが検索とか小クイズとかゲームとか拡張機能(でもそれは別の話)みたいな活動でポイントをもらえるプログラムだ。

ここに見える「Explore」ブロックがそれだ。 Explore screenshot

たとえばここにあるのが「今日のセット」って呼ばれるものだ。 Daily set screenshot

streakの仕組みまで作ってて、なかなかすごい。 Streak screenshot

レベル制度もあって、進捗がルーティンをほんと中毒性のあるものにしてる。 Level screenshot

ポイント稼ぎ方はたくさんあって、ほとんどが毎日できる。 ここでの狙いは、代わりに活動をこなすボットを作って、大規模にポイントをファームしてファーミングルーティンを完成させることだ。

下で見える通り、報酬のほとんどはギフトカードだけど、ゲームやサブスクみたいな面白い選択肢もある。 Rewards screenshot

報酬 カテゴリ ポイント
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 – Ancient 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リクエストを投げるだけだ。

最初のrunはこうなった。 Tor curl first run

時間 stats はこうだった。 !Timings

2回目のrunはこうなった。 Tor curl second run

見ての通り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) {
  // ページの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 screenshot

예를 들어 여기 있는 것이 그들이 말하는 "오늘의 세트"예요. Daily set screenshot

연속 기록 시스템까지 만들었는데, 꽤 대단해요. Streak screenshot

레벨 시스템도 있고, 진행 과정이 루틴을 정말 중독적으로 만들어요. Level screenshot

그래서 포인트를 얻는 방법이 정말 많고, 대부분 매일 할 수 있어요. 여기서의 아이디어는 활동을 대신해 주는 봇을 만들어서, 대규모로 포인트를 모으고 파밍 루틴을 완성하는 거예요.

아래에서 보시듯, 보상의 대부분은 기프트카드지만 게임이나 구독 같은 흥미로운 선택지도 있어요. Rewards screenshot

보상 카테고리 포인트 비용
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 – 고대 코인 팩 게임 / 디지털 콘텐츠 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으로 첫 테스트

인터페이스를 자동화하기 위해 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
      });

      // 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 çiftliği botlamak

Microsoft Rewards puanlarını büyük ölçekte kasan bir botu nasıl

Not (2026): Bu proje artık bakımlı değil. Microsoft bot karşıtı tespitini önemli ölçüde güçlendirdi, o yüzden o zamanlar işe yarayan şey bugün artık çalışmıyor. Aşağıda anlatılan kod ve yaklaşım yalnızca arşiv ve tanıtım amacıyla saklanmaktadır.

Giriş

Microsoft Rewardsı birkaç yıl önce keşfettim. Kapanma dönemindeydi ve o zaman Microsoft Family Safety ebeveyn denetimini kullanmak zorunda olduğum için Edge üzerinden geçiyordum. Rewardsı orada keşfettim.

O zamanlar sadece 14 yaşındaydım ve katalogdaki hiçbir şey ilgimi çekmiyordu. Şimdi edindiğim becerilerle botlarla puan kasabileceğimi, sonra kodları gerçekten istersem dağıtılabileceğini ya da daha ucuza satılabileceğini düşünüyorum (ama dürüstçe yapacağımı sanmıyorum). Ölçekte hesap kasan bir botu nasıl kodladığımı anlatacağım.


Microsoft Rewards nedir?

Kısaca: Edge kullanıcılarını aramalar, küçük quizler, oyunlar gibi aktiviteler ve bir uzantı karşılığında puanlarla ödüllendiren bir program (ama o başka bir hikâye).

Burada "Explore" bloklarını görüyorsun: Explore ekran görüntüsü

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

Bir seri sistemi bile yapmışlar, epey çılgınca. Seri ekran görüntüsü

Bir de seviye sistemi var ve ilerleme rutini gerçekten bağımlılık yapıyor: Seviye ekran görüntüsü

Yani puan kazanmanın bir sürü yolu var ve çoğu günlük. Buradaki fikir senin yerine aktiviteleri yapan bir bot yapmak, puanları ölçekte kasmak ve kasım rutinini tamamlamak.

Aşağıda görebileceğin gibi ödüllerin çoğu hediye kartı ama oyunlar ya da abonelikler gibi ilginç seçenekler de var. Ödüller ekran görüntüsü

Ödül Kategori Puan maliyeti
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 jeton kodu (dijital) Oyun / dijital içerik 2 000
Sea of Thieves – Antik Para 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ı (başka 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

Programın neye yaradığını artık anladığına göre botlamaya gelelim.


İlk testler

Botumu inşa etmeden önce aynı adresten yüzlerce hesap kullandığım için IPmin işaretlenmeyeceğinden emin olmak istedim. Beni tanırsın, dönen vekille Tor üzerinden geçiyorum. Onu bir VPS yerine bir GitHub Action içinde çalıştırmak istiyorum.

O yüzden 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 kurar, başlatır ve üzerinden bir curl isteği yapar.

İlk run şu sonucu verdi: Tor curl ilk run

Zaman istatistikleri şöyleydi: !Timings

İkinci bir run şu sonucu verdi: Tor curl ikinci run

Görebileceğin gibi IPler farklı, yani aynı IPden kötüye kullanım damgası yemekten kaçınıyoruz. İyi haber: kasım botunu geliştirmeye devam edebiliriz.


Selenium ile ilk test

Arayüzü otomatikleştirmek için Selenium kullanacağım: bir kullanıcının yerine gerçek bir tarayıcıyı (Chrome/Edge/Firefox) süren bir araç. Bir GitHub Action bağlamında bu, bir tarayıcı + sürücüsünü kurmak, sonra Microsoft Rewardsa bağlanıp gereken yerlere tıklayan bir script çalıştırmak demektir.

JavaScript örnek 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) {
  // Otomasyon parmak izini azaltmak için herhangi bir sayfa JSsi çalışmadan önce script enjekte et.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Bazı siteler chrome çalışma ortamını 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

Bu sonuç hâlâ bağlantının kesik olduğunu doğruluyor, o yüzden şimdi giriş isteğini inşa edip aktiviteleri otomatikleştirmek için Microsoft Rewards hesabıma bağlantıyı test edeceğim.

Bottare una farm Microsoft Rewards

Come ho programmato un bot per farmare punti Microsoft Rewards su larga scala: e perché Microsoft da allora ha rafforzato le sue difese.

Nota (2026): Questo progetto non è più mantenuto. Microsoft ha rafforzato molto il suo rilevamento anti-bot, quindi ciò che funzionava all'epoca non funziona più oggi. Il codice e l'approccio descritti qui sotto sono conservati a fini di archiviazione e dimostrazione soltanto.

Introduzione

Ho scoperto Microsoft Rewards qualche anno fa. Era durante il lockdown, e all'epoca ero obbligato a usare il controllo genitori Microsoft Family Safety e quindi a passare da Edge. È lì che ho scoperto Rewards.

All'epoca avevo solo 14 anni e niente nel catalogo mi interessava. Ora mi dico che con le competenze che ho acquisito, posso farmare punti con dei bot, poi dare i codici o addirittura rivenderli più economici se ne ho davvero voglia (ma onestamente, non penso di farlo). Ti racconto come ho programmato un bot che farma account su scala.


Cos'è Microsoft Rewards?

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

Vedi qui i blocchi "Explore": Explore screenshot

Lì per esempio è ciò che chiamano il "set del giorno". Daily set screenshot

Hanno pure fatto un sistema di streak, è abbastanza pazzesco. Streak screenshot

C'è anche un sistema di livello e la progressione rende la routine davvero coinvolgente: Level screenshot

Quindi hai un sacco di modi per guadagnare punti, e quasi tutti sono quotidiani. L'idea qui sarà fare un bot che fa le attività al posto tuo, per farmare punti su scala e completare la tua routine di farming.

Come puoi vedere qui sotto, quasi tutte le ricompense sono carte regalo, ma ci sono anche opzioni interessanti come giochi o abbonamenti. Rewards screenshot

Ricompensa Categoria Costo in punti
Rakuten TV – 1 film HD Contenuto digitale 1 785
Roblox (carta digitale) Gioco / contenuto digitale 6 750
Carta regalo Microsoft Negozio / servizio 5 660
Carta regalo Xbox Negozio / servizio 5 660
Carta regalo Microsoft Solitaire Collection Gioco / contenuto digitale 1 500
Minecraft Minecoins Gioco / contenuto digitale 2 500
Carta regalo League of Legends Gioco / contenuto digitale 2 000
Codice Overwatch monete (digitale) Gioco / contenuto digitale 2 000
Sea of Thieves – Pacco Monete antiche Gioco / contenuto digitale 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'interesse del programma, occupiamoci del botting.


Primi test

Prima di costruire il mio bot, volevo essere sicuro che il mio IP non sarebbe stato segnato per aver usato centinaia di account dallo stesso indirizzo. Mi conosci, passo da Tor con un proxy rotante. Voglio eseguirlo in una GitHub Action invece che su un VPS.

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 solo Tor, lo avvia, e fa una richiesta curl attraverso di lui.

Il primo run ha dato questo risultato: Tor curl first run

Le stat di tempo erano: !Timings

Un secondo run ha dato questo risultato: Tor curl second run

Come puoi vedere, gli IP sono diversi, quindi evitiamo una segnatura per uso abusivo dallo stesso IP. Buona notizia: possiamo continuare a sviluppare il bot di farming.


Primo test con Selenium

Per automatizzare l'interfaccia, userò Selenium: uno strumento che controlla un vero browser (Chrome/Edge/Firefox) al posto di un utente. Nel contesto di una GitHub Action, vuol dire installare un browser + il suo driver, poi lanciare uno script che si connette a Microsoft Rewards e clicca dove serve.

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

// naviga su Rewards e aspetta il pulsante di login
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) {
  // Inietta script prima che giri qualsiasi JS di pagina per ridurre il fingerprinting automazione.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Alcuni siti controllano chrome runtime e plugin
      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

Questo risultato conferma che siamo ancora disconnessi, quindi ora costruirò la richiesta di login e testerò la connessione al mio account Microsoft Rewards per automatizzare le attività.

Eine Microsoft-Rewards-Farm botten

Wie ich einen Bot gecodet habe, um Microsoft-Rewards-Punkte in

Hinweis (2026) : Dieses Projekt wird nicht mehr gepflegt. Microsoft hat seine Anti-Bot-Erkennung erheblich verstärkt, also funktioniert das, was damals ging, heute nicht mehr. Der Code und der unten beschriebene Ansatz werden nur zu Archiv- und Demonstrationszwecken aufbewahrt.

Einleitung

Ich habe Microsoft Rewards vor ein paar Jahren entdeckt. Es war während des Lockdowns, und damals musste ich die Microsoft Family Safety-Kindersicherung nutzen und also über Edge gehen. Dort habe ich Rewards entdeckt.

Damals war ich erst 14 und nichts im Katalog interessierte mich. Jetzt denke ich mir, dass ich mit den Fähigkeiten, die ich erworben habe, Punkte mit Bots farmen kann, dann die Codes verschenken oder sogar billiger weiterverkaufen, wenn ich wirklich Lust habe (aber ehrlich gesagt glaube ich nicht, dass ich es mache). Ich erzähle dir, wie ich einen Bot gecodet habe, der Konten in großem Maßstab farmt.


Was ist Microsoft Rewards?

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

Du siehst hier die "Explore"-Blöcke:
Explore screenshot

Dort zum Beispiel ist das, was sie das "Tagesset" nennen.
Daily set screenshot

Sie haben sogar ein Streak-System eingebaut, das ist ziemlich verrückt.
Streak screenshot

Es gibt auch ein Levelsystem und der Fortschritt macht die Routine richtig süchtig:
Level screenshot

Du hast also viele Möglichkeiten, Punkte zu verdienen, und die meisten sind täglich.
Die Idee hier wird sein, einen Bot zu bauen, der die Aktivitäten für dich erledigt, um Punkte in großem Maßstab zu farmen und deine Farming-Routine zu vervollständigen.

Wie du unten sehen kannst, sind die meisten Belohnungen Geschenkkarten, aber es gibt auch interessante Optionen wie Spiele oder Abos.
Rewards screenshot

Belohnung Kategorie Kosten in Punkten
Rakuten TV – 1 HD-Film Digitale Inhalte 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ünzen-Code (digital) Spiel / digitale Inhalte 2 000
Sea of Thieves – Antike Münzen-Pack 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 France – Geschenkkarte Shop / Service 21 615
H&M France – Geschenkkarte Shop / Service 14 410
Global Hotel Card (Expedia Group) Shop / Service 7 205
Uber Eats France – Geschenkkarte Shop / Service 36 025

Jetzt, wo du den Reiz des Programms verstehst, schauen wir uns das Botten an.


Erste Tests

Bevor ich meinen Bot baue, wollte ich sicher sein, dass meine IP nicht markiert wird, weil ich Hunderte Konten von derselben Adresse genutzt habe. Du kennst mich, ich gehe über Tor mit rotierendem Proxy. Ich will es in einer GitHub Action laufen lassen statt auf einem VPS.

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 nur Tor, startet es und macht eine curl-Anfrage hindurch.

Der erste Run gab dieses Ergebnis:
Tor curl first run

Die Zeitstatistiken waren:
!Timings

Ein zweiter Run gab dieses Ergebnis:
Tor curl second run

Wie du sehen kannst, sind die IPs verschieden, also vermeiden wir eine Markierung wegen missbräuchlicher Nutzung von derselben IP. Gute Nachricht: Wir können mit der Entwicklung des Farming-Bots weitermachen.


Erster Test mit Selenium

Um die Oberfläche zu automatisieren, werde ich Selenium nutzen: ein Tool, das einen echten Browser (Chrome/Edge/Firefox) anstelle eines Nutzers steuert. Im Kontext einer GitHub Action heißt das, einen Browser + seinen Driver zu installieren und dann ein Skript zu starten, das sich bei Microsoft Rewards anmeldet und dort klickt, wo es muss.

Beispielskript in 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) {
  // Skript injizieren, bevor irgendein Seiten-JS läuft, um Automation-Fingerprinting zu reduzieren.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Manche Seiten prüfen Chrome-Runtime und 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

Dieses Ergebnis bestätigt, dass wir noch ausgeloggt sind, also werde ich jetzt die Login-Anfrage bauen und die Verbindung zu meinem Microsoft-Rewards-Konto testen, um die Aktivitäten zu automatisieren.

Ботить ферму 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

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

Теперь, когда понимаешь интерес программы, займёмся ботингом.


Первые тесты

Прежде чем строить бота, я хотел убедиться, что мой IP не будет помечен за использование сотен аккаунтов с одного адреса. Ты меня знаешь, я иду через Tor с ротирующимся прокси. Хочу запускать это в GitHub Action, а не на 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 через него.

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

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

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

Как видишь, 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) {
  // Внедряем скрипт до запуска любого JS страницы, чтобы снизить отпечаток автоматизации.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Некоторые сайты проверяют chrome runtime и плагины
      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, чтобы автоматизировать активности.

Botear una granja de Microsoft Rewards

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

Nota (2026): Este proyecto ya no se mantiene. Microsoft reforzó considerablemente su detección antibots, así que lo que funcionaba en la época ya no funciona hoy. El código y el enfoque descritos abajo se conservan solo con fines de archivo y demostración.

Introducción

Descubrí Microsoft Rewards hace unos años. Fue durante el confinamiento, y en la época estaba obligado a usar el control parental Microsoft Family Safety y por tanto pasar por Edge. Ahí descubrí Rewards.

En la época solo tenía 14 años y nada del catálogo me interesaba. Ahora me digo que con las habilidades que adquirí, puedo farmear puntos con bots, y luego regalar los códigos o incluso revenderlos más baratos si de verdad me apetece (pero honestamente, creo que no lo haré). Te voy a contar cómo programé un bot que farmea cuentas a escala.


Qué es Microsoft Rewards

Para abreviar: es un programa que recompensa a los usuarios de Edge con puntos por actividades como búsquedas, pequeños quizzes, juegos, y una extensión (pero eso es otra historia).

Aquí ves los bloques "Explore": Explore screenshot

Ahí por ejemplo está lo que llaman el "set del día". Daily set screenshot

Hasta hicieron un sistema de racha, es bastante loco. Streak screenshot

También hay un sistema de nivel y la progresión hace la rutina de verdad adictiva: Level screenshot

Así que tienes un montón de formas de ganar puntos, y la mayoría son diarias. La idea aquí va a ser hacer un bot que haga las actividades en tu lugar, para farmear puntos a escala y completar tu rutina de farmeo.

Como puedes ver abajo, la mayoría de las recompensas son tarjetas regalo, pero también hay opciones interesantes como juegos o suscripciones. Rewards screenshot

Recompensa Categoría Coste en puntos
Rakuten TV: 1 peli 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 Overwatch monedas (digital) Juego / contenido digital 2 000
Sea of Thieves: Pack 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: Cheque 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 interés del programa, pasemos al botting.


Primeras pruebas

Antes de construir mi bot, quería estar seguro de que mi IP no quedaría marcada por usar cientos de cuentas desde la misma dirección. Ya me conoces, paso por Tor con un proxy rotativo. Quiero ejecutarlo en una GitHub Action en vez de en un VPS.

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 solo instala Tor, lo arranca, y hace una petición curl a través de él.

El primer run dio este resultado: Tor curl first run

Las estadísticas de tiempo fueron: !Timings

Un segundo run dio este resultado: Tor curl second run

Como puedes ver, las IP son distintas, así que evitamos un marcado por uso abusivo desde la misma IP. Buena noticia: podemos seguir desarrollando el bot de farmeo.


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, eso significa instalar un navegador + su driver, y luego lanzar un script que inicia sesión en Microsoft Rewards y hace clic donde toca.

Ejemplo 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) {
  // Inyecta el script antes de que corra cualquier JS de la página para reducir la huella de automatización.
  await (driver as any).sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', {
    source: `
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      });

      // Algunos sitios comprueban el runtime de chrome y los 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

Este resultado confirma que seguimos desconectados, así que ahora voy a construir la petición de login y probar la conexión a mi cuenta de Microsoft Rewards para automatizar las actividades.

Automatizando uma fazenda Microsoft Rewards

Como codei um bot para farmar pontos Microsoft Rewards em

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

Introdução

Descobri o Microsoft Rewards há alguns anos. Foi durante o confinamento, e na época eu era obrigado a usar o controle parental Microsoft Family Safety e portanto passar pelo Edge. Foi aí que descobri o Rewards.

Na época eu tinha só 14 anos e nada no catálogo me interessava. Agora penso que com as habilidades que adquiri, posso farmar pontos com bots, e depois doar os códigos ou até revendê-los mais barato se eu realmente quiser (mas sinceramente, acho que não vou fazer). 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, quizinhos, jogos, e uma extensão (mas isso é outra história).

Você vê aqui os blocos "Explore" : Explore screenshot

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

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

Também há um sistema de nível e a progressão deixa a rotina realmente viciante : Level screenshot

Então você tem várias formas de ganhar pontos, e a maioria é diária. A ideia aqui vai ser fazer um bot que faz 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 há opções interessantes 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 – Pack 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 – Vale-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 France – Cartão-presente Loja / serviço 21 615
H&M France – Cartão-presente Loja / serviço 14 410
Global Hotel Card (Expedia Group) Loja / serviço 7 205
Uber Eats France – Cartão-presente Loja / serviço 36 025

Agora que você entende o interesse do programa, vamos ao botting.


Primeiros testes

Antes de construir meu bot, eu queria ter certeza de que meu IP não seria marcado por usar centenas de contas do mesmo endereço. Você me conhece, passo pelo Tor com um proxy rotativo. Quero rodar em uma GitHub Action em vez de em um VPS.

Então escrevi um workflow simples :

# Workflow de teste : instala o Tor e faz um curl através dele
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 só instala o Tor, inicia, e faz uma requisição curl através dele.

O primeiro run deu este resultado : Tor curl first run

As estatísticas de tempo foram : !Timings

Um segundo run deu este resultado : Tor curl second run

Como você pode ver, os IPs são diferentes, então evitamos uma marcação 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 o Selenium : uma ferramenta que controla um navegador de verdade (Chrome/Edge/Firefox) no lugar de um usuário. No contexto de uma GitHub Action, isso significa instalar um navegador + seu driver, e depois lançar um script que se conecta ao Microsoft Rewards e clica onde precisa.

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

// Opções do Chrome + anti-detecção de automação via DevTools
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= Bienvenue dans Microsoft Rewards!
Page loaded, sign in button found: Se connecter

Esse resultado confirma que ainda estamos desconectados, então agora vou construir a requisição de login e testar a conexão à minha conta Microsoft Rewards para automatizar as atividades.

Membot peternakan Microsoft Rewards

Bagaimana saya mengoding bot untuk memanen poin Microsoft Rewards dalam

Catatan (2026) : Proyek ini tidak lagi dipelihara. Microsoft telah memperkuat deteksi anti-botnya secara signifikan, jadi apa yang berhasil waktu itu sudah tidak berfungsi hari ini. Kode dan pendekatan yang dijelaskan di bawah disimpan untuk tujuan pengarsipan dan demonstrasi saja.

Pendahuluan

Saya menemukan Microsoft Rewards beberapa tahun lalu. Waktu itu pas penguncian, dan saat itu saya wajib memakai kontrol orang tua Microsoft Family Safety sehingga harus lewat Edge. Di sanalah saya menemukan Rewards.

Waktu itu saya baru 14 tahun dan tidak ada yang menarik di katalognya. Sekarang saya berpikir dengan keterampilan yang saya peroleh, saya bisa memanen poin dengan bot, lalu memberikan kodenya atau bahkan menjualnya kembali lebih murah kalau saya benar-benar mau (tapi sejujurnya, saya kira tidak akan melakukannya). Saya akan menceritakan bagaimana saya mengoding bot yang memanen akun dalam skala besar.


Apa itu Microsoft Rewards?

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

Kamu lihat di sini blok "Explore" : Explore screenshot

Di sana misalnya yang mereka sebut "set harian". Daily set screenshot

Mereka bahkan membuat sistem streak, cukup gila. Streak screenshot

Ada juga sistem level dan progresnya membuat rutinitas benar-benar adiktif : Level screenshot

Jadi kamu punya banyak cara mendapatkan poin, dan sebagian besar harian. Idenya di sini adalah membuat bot yang melakukan aktivitas itu menggantikanmu, untuk memanen poin dalam skala besar dan melengkapi rutinitas panenmu.

Seperti bisa kamu lihat di bawah, sebagian besar hadiah adalah kartu hadiah, tapi ada juga opsi menarik seperti permainan atau langganan. Rewards screenshot

Hadiah Kategori Biaya dalam 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 coins (digital) Game / konten digital 2 000
Sea of Thieves – Pack Pièces anciennes 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 kamu paham menariknya program ini, mari tertarik pada botting.


Tes pertama

Sebelum membangun bot saya, saya ingin memastikan IP saya tidak ditandai karena memakai ratusan akun dari alamat yang sama. Kamu kenal saya, saya lewat Tor dengan proxy berputar. Saya ingin menjalankannya di GitHub Action alih-alih di VPS.

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 cuma menginstal Tor, menjalankannya, dan membuat permintaan curl melaluinya.

Run pertama memberikan hasil ini : Tor curl first run

Statistik waktunya adalah : !Timings

Run kedua memberikan hasil ini : Tor curl second run

Seperti bisa kamu lihat, IP-nya berbeda, jadi kita menghindari penandaan karena penyalahgunaan dari IP yang sama. Kabar baik : kita bisa lanjut mengembangkan bot panennya.


Tes pertama dengan Selenium

Untuk mengotomatisasi antarmuka, saya akan memakai Selenium : alat yang mengendalikan peramban sungguhan (Chrome/Edge/Firefox) menggantikan pengguna. Dalam konteks GitHub Action, artinya menginstal peramban + drivernya, lalu menjalankan skrip yang masuk ke Microsoft Rewards dan mengklik yang perlu.

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) {
  // Menyuntikkan skrip sebelum JS halaman apa pun berjalan untuk mengurangi sidik jari otomatisasi.
  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 skripnya :

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

Hasil ini memastikan kita masih keluar, jadi sekarang saya akan membangun permintaan login dan menguji koneksi ke akun Microsoft Rewards saya untuk mengotomatisasi aktivitas.

Microsoft Rewards फार्म को बॉट करना

मैंने बड़े पैमाने पर Microsoft Rewards अंक फार्म करने के लिए बॉट कैसे कोड किया, और तब से Microsoft ने अपनी सुरक्षा क्यों मजबूत की।

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

परिचय

मैंने Microsoft Rewards की खोज कुछ साल पहले की थी। यह लॉकडाउन के दौरान था, और उस समय मुझे Microsoft Family Safety अभिभावक नियंत्रण इस्तेमाल करना पड़ता था और इसलिए Edge से गुजरना पड़ता था। वहीं मैंने Rewards खोजा।

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


Microsoft Rewards क्या है ?

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

तुम यहाँ "Explore" ब्लॉक देख रहे हो : Explore screenshot

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

उन्होंने streak प्रणाली भी बनाई है, यह काफी पागलपन है। 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 सिक्का कोड (डिजिटल) गेम / डिजिटल सामग्री 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 स्थापित करता है, उसे शुरू करता है, और उसके माध्यम से curl अनुरोध करता है।

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

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

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

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


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

इंटरफेस स्वचालित करने के लिए, मैं Selenium इस्तेमाल करूँगा : एक उपकरण जो उपयोगकर्ता की जगह असली ब्राउजर (Chrome/Edge/Firefox) नियंत्रित करता है। GitHub Action संदर्भ में, इसका मतलब ब्राउजर + उसका driver स्थापित करना, फिर एक स्क्रिप्ट चलाना है जो 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

यह परिणाम पुष्टि करता है कि हम अभी भी लॉगआउट हैं, इसलिए अब मैं login अनुरोध बनाऊँगा और गतिविधियाँ स्वचालित करने के लिए अपने Microsoft Rewards खाते से जुड़ने का परीक्षण करूँगा।

توفير مزرعة Microsoft Rewards بالبوتات

كيف برمجت بوتا لتوفير نقاط Microsoft Rewards على نطاق واسع،

ملاحظة (2026) : لم يعد هذا المشروع مصانا. شددت Microsoft كثيرا كشفها ضد البوتات، فما كان يعمل آنذاك لم يعد يعمل اليوم. الكود والمقاربة الموصوفان أدناه محفوظان لأغراض الأرشفة والعرض فقط.

مقدمة

اكتشفت Microsoft Rewards قبل سنوات. كان ذلك أثناء الحجر، وكنت آنذاك مجبرا على استخدام الرقابة الأبوية Microsoft Family Safety وبالتالي المرور عبر Edge. وهناك اكتشفت Rewards.

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


ما هو Microsoft Rewards ؟

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

ترى هنا كتل "Explore" : Explore screenshot

هنا مثلا ما يسمونه "set اليوم" : Daily set screenshot

وصنعوا حتى نظام streak، وهذا جنوني بعض الشيء. Streak screenshot

وهناك أيضا نظام مستوى والتقدم يجعل الروتين مُدمنا فعلا : Level screenshot

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

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

المكافأة الفئة Kost بالنقاط
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 مع وكيل دوّار. أريد تنفيذه في GitHub Action بدلا من VPS.

فكتبت 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، يعني ذلك تثبيت متصفح + مشغّله، ثم إطلاق سكربت يتصل بـ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 runtime والإضافات
      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('بعد التنقل : الرابط=', await driver.getCurrentUrl());
    console.log('بعد التنقل : العنوان=', await driver.getTitle());

    const signInButton = await driver.wait(
      until.elementLocated(By.css('#rewards-header-sign-in')),
      20000,
      'انتهت المهلة بانتظار زر الدخول (قد يشير لصفحة 400/محظورة)'
    );

    console.log('حُمّلت الصفحة، وُجد زر الدخول:', 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 خاصتي لأتمتة الأنشطة.

Cày một nông trại Microsoft Rewards bằng bot

Cách tôi code một bot để cày điểm Microsoft Rewards ở

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

Giới thiệu

Tôi phát hiện Microsoft Rewards vài năm trước. Đó là thời gian phong tỏa, và hồi đó tôi buộc phải dùng kiểm soát phụ huynh Microsoft Family Safety nên phải đi qua Edge. Chính ở đó tôi phát hiện Rewards.

Hồi đó tôi mới 14 tuổi và chẳng có gì trong danh mục khiến tôi hứng thú. Giờ tôi nghĩ với các kỹ năng đã tích lũy, tôi có thể cày điểm bằng bot, rồi cho đi các mã hoặc thậm chí bán lại rẻ hơn nếu tôi thực sự muốn (nhưng thật lòng, tôi nghĩ mình sẽ không làm). Tôi sẽ kể bạn nghe cách tôi code một con bot cày tài khoản ở quy mô lớn.


Microsoft Rewards là gì?

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

Bạn thấy ở đây các khối "Explore" : Explore screenshot

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

Họ thậm chí làm hệ thống streak, khá điên. Streak screenshot

Ngoài ra còn có hệ thống cấp độ và tiến trình khiến thói quen thực sự gây nghiện : Level screenshot

Vậy bạn có đủ cách kiếm điểm, và hầu hết là hằng ngày. Ý tưởng ở đây sẽ là làm một con bot thực hiện các hoạt động thay bạn, để cày điểm ở quy mô lớn và hoàn thành thói quen cày 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ó các lựa chọn thú vị như game hay gói đăng ký. Rewards screenshot

Phần thưởng Danh mục Giá điểm
Rakuten TV – 1 phim HD Nội dung số 1 785
Roblox (thẻ số) Game / 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 Game / nội dung số 1 500
Minecraft Minecoins Game / nội dung số 2 500
Thẻ quà tặng League of Legends Game / nội dung số 2 000
Mã Overwatch coins (số) Game / nội dung số 2 000
Sea of Thieves – Gói Ancient Coins Game / 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 – Phiếu 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 (thiết kế 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 lợi ích của chương trình, hãy quan tâm tới botting.


Thử nghiệm đầu tiên

Trước khi xây bot, tôi muốn chắc IP của mình sẽ không bị đánh dấu vì 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 đi qua Tor với proxy xoay. Tôi muốn chạy nó trong GitHub Action thay vì trên VPS.

Vì vậy 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à gửi một yêu cầu curl qua nó.

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

Thống kê thời gian là : !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 khác nhau, nên ta tránh bị đánh dấu vì lạm dụng từ cùng một IP. Tin tốt : có thể tiếp tục phát triển bot cày.


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

Để tự động hóa giao diện, tôi 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, nghĩa là cài trình duyệt + driver của nó, rồi chạy script đăng nhập Microsoft Rewards và bấm đúng chỗ cần.

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ả của 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

Kết quả này xác nhận ta vẫn đang đăng xuất, nên giờ tôi sẽ xây dựng yêu cầu login và thử kết nối tới tài khoản Microsoft Rewards của mình để tự động hóa các hoạt độ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