Microsoft Reward V2

septembre 2024 → mars 2026

Code source (extension)Première version (bot)Téléchargements

Microsoft Rewards donne des points pour des recherches Bing, des quiz et des activités quotidiennes, points qu'on échange ensuite contre des bons d'achat. Faire ces gestes tous les jours est répétitif, et c'est le genre de tâche qu'on a envie d'automatiser. Ce projet est mon exploration de cette idée, sur trois versions successives.

Le cadre, avant tout

Je préfère le dire tout de suite : je ne recommande pas d'utiliser cet outil. Automatiser Microsoft Rewards va à l'encontre des conditions d'utilisation de Microsoft, et je l'ai construit pour apprendre, pas pour farmer des points. Je ne m'en sers pas moi-même. Le code reste public pour ceux que ça intéresse, mais le projet est aujourd'hui plutôt à l'abandon et il ne fonctionne peut-être déjà plus, l'interface de Bing changeant sans prévenir.

Ceci dit, c'est un des projets dont je suis le plus fier, pour les problèmes qu'il m'a forcé à résoudre.

Trois versions, une même leçon qui revient

La première, un bot en arrière-plan. Un script Puppeteer qui lançait une instance d'Edge sans interface et enchaînait les recherches tout seul. Ça marchait, mais mal : beaucoup de paramétrage avant de pouvoir démarrer, des cas qu'il ne gérait pas, et au final je ne l'ai presque jamais utilisé. Un bot invisible qu'on ne surveille pas, sur une interface qui bouge, se casse en silence.

La deuxième, un script qui pilote le vrai navigateur. Plutôt qu'un Edge fantôme en arrière-plan, celle-ci pilotait le navigateur normal, visible, celui qu'on utilise déjà. Le vrai progrès était ailleurs : au lieu d'attendre avec des délais fixes (« attendre 3 secondes, cliquer »), le script attendait des signaux concrets de la page, l'apparition d'un élément, la fin d'une navigation, la disparition d'un indicateur de chargement. Un délai fixe est un pari sur la vitesse du réseau, et ce pari finit par se perdre. Attendre un signal, c'est ralentir quand le réseau ralentit au lieu de casser.

La troisième, une extension de navigateur. C'est la version aboutie. J'ai tout réécrit en extension Edge (Manifest V3) : plus de script externe à lancer en ligne de commande, tout se pilote depuis un petit popup dans la barre du navigateur. On coche les tâches voulues, on clique sur Démarrer, on suit la progression et le journal d'activité en direct, on arrête quand on veut. Le découpage propre à une extension moderne, entre le service en arrière-plan, l'interface du popup et le code qui agit dans l'onglet, était un terrain nouveau pour moi.

La leçon qui revient à chaque version : en automatisation de navigateur, écrire ce qu'on veut faire est simple, savoir quand le faire est tout le problème. Le programme interagit avec un système que je ne contrôle pas, et il faut l'écrire en supposant que tout peut disparaître ou se déplacer.

Ne pas ressembler à un robot

C'est la difficulté la plus intéressante du projet. Les sites savent repérer une automatisation, et sur deux plans.

D'abord les gestes eux-mêmes : les événements produits par du JavaScript ordinaire portent une marque qui les distingue d'un vrai clic ou d'une vraie frappe. L'extension passe donc par le protocole de débogage du navigateur pour produire des événements indiscernables de ceux d'un humain. Par-dessus, elle imite une présence réelle : la frappe se fait caractère par caractère avec des délais variables, la souris bouge par petits sauts, la page défile avec des pauses comme si on lisait, et le clic sur un résultat n'est pas instantané.

Ensuite le navigateur lui-même : dès qu'on l'attache à un outil de débogage, il l'annonce en positionnant un indicateur que n'importe quelle page peut lire. Il fallait donc redéfinir cette propriété, avant même le chargement de chaque page, pour qu'elle ne trahisse plus rien. C'est un détail d'une ligne, et sans lui tout le reste ne sert à rien.

Je m'en tiens ici au principe, parce que le but de ce texte est de raconter la difficulté, pas d'en faire un mode d'emploi.

Des requêtes qui tiennent la route

Une automatisation qui tape cent fois la même recherche se repère immédiatement. Il fallait donc de vrais sujets, variés et d'actualité. L'extension les récupère depuis les flux de tendances Google de plusieurs pays interrogés en parallèle, complétés par l'autocomplétion de recherche et par une liste de secours intégrée quand ces sources ne répondent pas. Agréger plusieurs origines plutôt que dépendre d'une seule rend l'outil moins fragile, et les requêtes plus crédibles.

Ce que j'ai fini par retirer

Les premières versions cherchaient aussi les points des recherches mobiles, en faisant passer le navigateur de bureau pour un téléphone : identité de navigateur modifiée, taille d'écran émulée, événements tactiles simulés. Ça marchait, mais c'était empiler des faux-semblants pour quelques points de plus, et autant de code fragile qui pouvait casser sans prévenir.

J'ai fini par tout supprimer et concentrer l'outil sur les recherches classiques. Le code en est sorti nettement plus court et plus simple à maintenir. Retirer une fonctionnalité qui marche est rarement satisfaisant sur le moment, mais c'est souvent la bonne décision.

Installable sans passer par la case compilation

Une extension qu'on doit compiler soi-même avant de l'essayer ne sera jamais installée par grand monde. J'ai donc mis en place une intégration continue qui, à chaque modification, reconstruit l'extension, l'empaquette et met à jour automatiquement une release téléchargeable sur GitHub. Il n'y a plus qu'à récupérer l'archive et à la charger dans le navigateur.

Ce que le projet m'a appris, et son public

Techniquement, c'est le projet qui m'a le mieux appris la robustesse : composer avec une interface qui change sans prévenir, déjouer une détection, agréger des sources faillibles, et construire une extension de navigateur de bout en bout, publication comprise.

C'est aussi un des rares projets où j'ai vu qu'il répondait à un vrai besoin : j'ai eu des retours d'utilisateurs et quelques étoiles sur GitHub. Des gens cherchaient réellement cette solution, ce qui fait plaisir sur un projet parti d'une simple curiosité.

Je n'arrivais pas là par hasard : ma première extension de navigateur était un petit outil pour Cookie Clicker, écrit bien plus tôt, qui cliquait tout seul sur les cookies dorés du jeu. C'est là que j'avais pris les réflexes que j'ai réutilisés ici, à une autre échelle.

La dernière réécriture, celle qui a transformé le script en extension, a été menée avec Claude Code. Microsoft Reward s'arrête au stade d'un outil que je n'entretiens plus, mais qui aura été un excellent terrain d'apprentissage.

Technologies utilisées