Communitygithub.com

harwal2000/skills

À utiliser lorsque l'utilisateur souhaite récupérer ses propres données depuis un site web sur lequel il se connecte — historique des commandes, courses, réservations, transactions, historique d'écoute ou de visionnage, factures, relevés, articles sauvegardés — et qu'aucune exportation utilisable n'existe, ou qu'un dépôt de scraping existant est obsolète, cassé ou demande son mot de passe.

Qu'est-ce que skills ?

Cette compétence permet de scraper les données personnelles d'un utilisateur depuis un site web tout en respectant des règles strictes de sécurité et de vie privée. L'utilisateur se connecte manuellement dans un navigateur Playwright, et la compétence reproduit les requêtes que le site utilise lui-même pour afficher les données, en conservant les cookies de session et les en-têtes réels. Elle ne manipule jamais d'identifiants. Elle prend en charge les API JSON XHR/Fetch, GraphQL, le HTML rendu côté serveur et les listes partitionnées, avec une pagination automatique et une sauvegarde des réponses brutes sur disque. Elle intègre une étape de vérification rigoureuse pour garantir l'exhaustivité et l'exactitude des données. Cette approche contourne les blocages anti-bot et les scrapers obsolètes qui demandent le mot de passe.

Compatible avec~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/harwal2000/skills/tree/HEAD/skills/scraping-account-data

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Scraping des données de compte

Présentation

L'utilisateur se connecte manuellement dans le navigateur Playwright ; vous trouvez la source de données que les propres pages du site utilisent et la rejouez à l'intérieur de la page (cookies de session + en-têtes réels), en sauvegardant les réponses brutes sur le disque. Ne manipulez jamais les identifiants.

Quand l'utiliser

  • « Récupère mon historique », « scrape mes commandes/trajets/réservations », « utilise ce dépôt de scraping »
  • Anciens dépôts de scraping (requêtes + mot de passe/OTP de connexion) : lisez-les sur GitHub pour les noms d'endpoints et les sélecteurs uniquement. Ne les exécutez jamais — les contrôles anti-bot (HTTP 202 corps vide, captchas) les cassent, et ils demandent le mot de passe.

Exportation officielle d'abord. Google Takeout, « Télécharger vos données », demandes GDPR/DPDP, API publiques, reçus par email. Les exportations lentes prennent des jours — demandez à l'utilisateur d'en demander une au début, puis scrapez maintenant et recoupez par ID quand elle arrive.

Flux de travail

  1. Ajoutez le répertoire de sortie au gitignore avant d'écrire quoi que ce soit (data/<service>/ ou l'équivalent du projet) ; confirmez avec git check-ignore. Les données brutes contiennent des adresses, des téléphones, du GPS.
  2. Naviguez, passez la main pour la connexion. Ouvrez la page de compte ; dites à l'utilisateur de taper son téléphone/mot de passe/OTP dans la fenêtre du navigateur et de répondre quand c'est fait. Ne demandez jamais de codes dans le chat.
  3. Découvrez la source (browser-snippets.md §1). Rechargez avec un écouteur et classez :
    • JSON XHR/fetch (meilleur) — notez l'endpoint de liste, la forme de pagination (next_url/curseur, page_number, décalage = dernier id, endOfList), et l'endpoint de détail (ouvrez un élément).
    • GraphQL — un POST /graphql ; enregistrez le corps complet de la requête (operationName, query ou hash de requête persistée, variables).
    • HTML rendu côté serveur — les données arrivent dans la réponse document ; récupérez les pages de liste et de détail dans la page et analysez-les avec DOMParser ; sauvegardez aussi le HTML brut pour pouvoir le ré-analyser.
    • Listes partitionnées — si la liste est divisée par un filtre (liste déroulante d'année, plage de dates, onglets comme archivé/annulé/numérique), lisez chaque valeur de filtre et paginez chacune.
  4. Authentification. Essayez d'abord fetch(url, {credentials: 'include'}). Si cela retourne 401/403/vide, copiez les en-têtes non-navigateur d'une requête en direct (§2) — copiez, ne devinez jamais les valeurs. Enregistrez les noms des en-têtes uniquement ; n'imprimez ni ne sauvegardez jamais les valeurs.
  5. Paginez en arrière-plan dans la page (§2) : window.__x = {running, pages, error}, 1,5 s entre les requêtes, tentatives, interrogez avec de courtes évaluations. Chaque réponse : si c'est une page de connexion/captcha (l'URL contient signin/captcha, ou HTML au lieu du JSON attendu), définissez error et arrêtez — ces réponses reviennent souvent avec un code 200.
  6. Sauvegardez avant de naviguer (§3). Tout goto/rechargement efface window. browser_evaluate avec un chemin filename absolu, retournant un objet (JSON.stringify double-encode). ~5 Mo par fichier est acceptable ; divisez par lot au-delà.
  7. Requêtes signées/non rejouables (en-têtes de signature de requête, corps nonce, requêtes persistées qui rejettent les modifications) : visitez chaque page de détail et capturez passivement ses réponses (§4).
  8. Construisez + vérifiez (ci-dessous) avec un script d'analyse en dehors du répertoire de données, puis une note d'analyse. Suivez la disposition existante du dépôt s'il y en a une (par exemple tools/<service>/build_db.py, notes à côté des données) ; sinon demandez.

Lecture seule. Ne rejouez que ce que la page demande elle-même pour afficher les données. GraphQL : jugez par l'opération (query/Get*/List*), jamais mutation. Ne réordonnez, n'annulez, ne notez, n'archivez, ne supprimez jamais.

Vérification — faites toutes ces étapes

VérificationPourquoi
La pagination s'est terminée parce que le curseur/la liste était épuisé, pas à cause d'une erreur ou d'une redirection de connexionTroncature silencieuse
Cherchez le texte « voir les commandes plus anciennes dans l'application » à la finLes vues Web limitent l'historique (Swiggy : ~11 mois)
Ne vous fiez pas uniquement à l'endpoint de compte ou à l'en-tête du siteBlinkit en annonçait 40 ; la liste en avait 83
Les composants totalisent le montant par ligne (articles + frais − réductions = payé)Détecte la dérive de l'analyseur ; si le site omet des lignes pour les anciens enregistrements, dites-le — ne forcez pas
Les prix des articles totalisent le total de l'articleConfusion prix unitaire vs total de ligne
ID uniques ; déduplication des doublons exactsLes exportations et les reçus doublonnent
Vérification croisée avec une autre source par ID (exportation, reçus)Prouve la couverture
Chaque liste/onglet/filtre a été couvert (archivé, annulé, autres années, sous-services)« Toutes les commandes » couvre souvent plusieurs listes

Notes d'analyse

  • API d'interface utilisateur pilotée par le serveur (snippets, widgets, widget_type, layout) : parcourez les widgets dans l'ordre, collectez les champs text de chaque widget, mappez par étiquettes connues. Un widget à un seul texte est souvent une étiquette pour le suivant — liste blanche des noms d'étiquettes ou chaque champ se décale.
  • Les montants peuvent être en paise/centimes ; « GRATUIT » = 0 ; « - » en tête = réduction ; supprimez les symboles monétaires et le regroupement des virgules indiennes. Gardez les devises séparées.
  • Horodatages : achats → fuseau horaire de l'utilisateur ; trajets/voyages → l'heure locale de l'enregistrement.
  • Conservez les fichiers bruts datés (orders-raw-YYYY-MM-DD.json) à côté du SQLite construit.

Git

Validez uniquement : la ligne gitignore, le script d'analyse, tout README/ligne d'index. Les fichiers bruts et le SQLite restent locaux. Stagiez les chemins explicites (jamais git add -A dans un arbre sale) ; ne validez que lorsque demandé.

Erreurs courantes

  • Une longue boucle d'évaluation synchrone — expire ; mettez-la en arrière-plan et interrogez.
  • Retourner des données volumineuses dans le chat au lieu de filename.
  • Écouteurs de snippets laissés attachés — page.off les, ou les exécutions répétées empilent les gestionnaires.
  • Filtrer la découverte sur xhr/fetch sur un site rendu en HTML et conclure « aucune source de données ».

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills associés