wechat-article-fetch · Récupération d'articles WeChat (公众号)
Faits essentiels (testés, exécution directe)
- Le User-Agent (UA) est la seule barrière : utilisez l'UA de navigateur intégré aux scripts. Sans UA / avec curl / python-requests / MicroMessenger → tout redirige en 302.
- Le corps est très facile à obtenir : rendu côté serveur, dans
<div id="js_content">, simple GET suffit, pas besoin de JS/Cookie/connexion. - Images sans anti-hotlinking : les vraies URL sont dans
data-src. - Couche de découverte : les articles originaux ne sont pas indexés par les moteurs ; Sogou fournit des liens de redirection chiffrés, l'URL propre en HTTP pur avec signature est déchiffrable (fenêtre ≥1h, à capturer rapidement) ; ⚠️ environ 15 à 20 requêtes consécutives en 30 minutes déclenchent un CAPTCHA IP (nécessite intervention humaine, même un navigateur est bloqué) → sérialisation à faible fréquence, arrêt dès déclenchement.
Exemple d'UA (à utiliser dans vos propres scripts) : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Utilisation (scripts dans le même répertoire, zéro dépendance, double mode CLI+librairie, erreurs structurées WeChatError)
python wechat_fetch.py "<url>" [--format md|json|text] [--out FICHIER] # Récupérer le corps de l'article
python wechat_discover.py "mot-clé" [--format table|json] # Rechercher des métadonnées (déchiffrage des liens de redirection selon l'état du canal)
python batch_fetch.py urls.txt [--min-delay 3] [--max-delay 8] [--daily-limit 500] # Batch : limitation de débit, reprise, arrêt sur CAPTCHA
État des canaux (testé en août 2026, éviter les impasses)
| Canal | État |
|---|---|
| Page publique d'article (récupération brute) | ✅ Stable à long terme (cœur de la compétence) |
| Recherche Sogou | ✅ Métadonnées récentes uniquement (état propre) ; lien de redirection en HTTP pur avec signature déchiffrée (fenêtre ≥1h, capturer rapidement) ; ⚠️ ~15-20 requêtes en 30 minutes déclenchent un CAPTCHA IP, nécessite intervention humaine |
| Page de collection (album) | ⚠️ Anonyme, pagination possible, articles uniquement dans la collection |
| Liste historique de la page d'accueil du compte | ❌ Bloqué en anonyme : « Veuillez ouvrir le lien dans l'application WeChat » ; getmsg ne renvoie que ~10 articles récents |
| Recherche cross-compte depuis le panneau d'administration | ❌ Mort (fermé par WeChat le 2026-07-30, tous les outils de l'industrie sont inopérants) |
Conclusion : La couche de récupération est stable ; la couche de découverte se limite aux articles récents de Sogou + collections (⚠️ limitation de fréquence dynamique, basse fréquence) ; pas de canal légal pour l'historique complet.
Processus
- Avec un lien → GET (UA navigateur) → extraire
#js_content→ afficher. En cas d'échec, suivre le tableau de diagnostic, ne pas réessayer aveuglément. - Avec un mot-clé uniquement → Sogou pour les métadonnées ; pour le corps, déchiffrer le lien de redirection JS en HTTP pur pour obtenir l'URL signée et revenir au processus de récupération (en cas d'échec/déclenchement anti-bot, utiliser un navigateur en dernier recours ; ou chercher une copie miroir, informer l'utilisateur que le contenu peut être modifié). Ne pas essayer l'historique de la page d'accueil ni la recherche depuis le panneau d'administration (mort/bloqué).
Analyse (uniquement si vous écrivez vos propres expressions régulières ; avec les scripts, vous pouvez ignorer)
Points d'ancrage : var msg_title / nickname / ct + #js_content. ⚠️ msg_title/nickname peuvent être encapsulés dans .html(false)/htmlDecode() — l'expression régulière ne capture que la première chaîne entre guillemets après le signe égal, sinon tout est vidé ; les images prennent data-src et non src.
Diagnostic des échecs (ne pas réessayer aveuglément)
| Phénomène | Cause | Action |
|---|---|---|
| 302 | UA non conforme | Changer pour un UA de navigateur |
| 200 + erreur de paramètre | Lien invalide | Arrêter, vérifier le lien |
| 302 → antispider | Interception côté Sogou (CAPTCHA IP, nécessite intervention humaine, testé le 2026-08-13) | Arrêter, ne pas contourner ; réessayer à basse fréquence ou attendre la reprise (le navigateur est également bloqué) |
| 302 → appmsgcaptcha | Lien anormal / déclenchement CAPTCHA | Arrêter, ne pas contourner |
| 200 + Cette page n'existe pas | UA détecté comme robot | Changer pour un UA de navigateur |
| 200 + Veuillez ouvrir le lien dans l'application WeChat | Page nécessitant une connexion | Ce canal n'est pas disponible, utiliser Sogou/collection |
| 200 + Supprimé/enfreint | L'article a été traité | Passer, enregistrer la raison |
Contraintes strictes (violation = arrêt immédiat)
- Pas de session de connexion : pas d'utilisation de Cookie personnel WeChat, de QR code, etc. (suspension de compte + violation contractuelle).
- Pas de contournement de CAPTCHA : déclenchement = arrêt complet (contourner une mesure technique est une infraction au sens de l'article 285 du Code pénal chinois).
- Pas de collecte en masse : robots interdits sur l'ensemble du site, usage personnel pour de petites quantités ; sérialisation + intervalle de secondes, ≤500 articles par jour.
- Pas d'usage commercial ni de diffusion : les articles sont protégés par le droit d'auteur ; l'étude personnelle et la recherche relèvent de l'usage loyal (à condition de ne pas diffuser, de ne pas commercialiser, de conserver la mention de l'auteur).
- La couche de découverte est soumise à une limitation de fréquence dynamique (testé le 2026-08-13 : ~15-20 requêtes en 30 minutes déclenchent un CAPTCHA IP, non levé automatiquement après plusieurs heures) : sérialisation à basse fréquence (≤10 requêtes/30 minutes recommandé), arrêt complet dès déclenchement, attendre la reprise, ne pas tenter de contourner.