Vidéo enregistrée : cliquez pour y aller
查看历史消息
. Cliquez pour ouvrir cette page Web et continuez à faire défiler pour afficher tous les articles publiés. Dans cette étape, basée sur anyproxy, le html de la page Web est modifié et un script js est injecté pour faire défiler la page vers le bas en continu. Lorsque la page défile vers le bas, une liste de tous les articles est obtenue. Essentiellement une attaque de l’homme du milieu.Comme le montre l'image :
Obtenez une démo de la liste d'articles :
Ouvrez les liens des articles un par un :
La première étape consiste à installer avec succès anyproxy. Pour cette étape, veuillez lire en détail le didacticiel officiel d'anyproxy. Il est écrit en détail pour vous assurer que vous pouvez réussir le proxy https et afficher le contenu du corps de https.
yarn install
yarn start
Un result.html sera automatiquement ouvert pour afficher le contenu des articles explorés en temps réel. Cliquez sur un compte officiel WeChat et cliquez pour afficher les messages historiques. Après cela, la page d'historique continuera à défiler jusqu'à la fin. les articles seront ouverts un par un et le contenu exploré.
1. La première étape consiste à obtenir tous les articles historiques d’un compte public. Sur la machine réelle sur laquelle le proxy anyproxy a été configuré, vérifiez les messages historiques. À ce moment, WeChat ouvrira la page Web de l'article historique. Obtenez un document HTML : , var msgList
correspond aux données d'article historiques dont nous avons besoin, une simple correspondance régulière est utilisée pour remplacer les caractères illégaux et JSON.parse est converti dans le format dont nous avons besoin. Basé sur anyproxy, nous injectons un script dans ce document HTML, dans le but de faire défiler la page Web d'elle-même et de déclencher le navigateur pour obtenir plus d'articles.
var scrollKey = setInterval ( function ( ) {
window . scrollTo ( 0 , document . body . scrollHeight ) ;
} , 1000 ) ;
Lorsque la page Web défile jusqu'à la fin, l'article est à nouveau obtenu. À ce stade, c'est la même demande d'obtention, mais le format avec Content-Type comme application/json
est renvoyé. La même méthode ici, une correspondance régulière est utilisée pour. trouvez-le et formatez-le dans le format dont nous avons besoin.
En même temps, lorsque can_msg_continue
vaut 0, cela signifie qu'il a été tiré vers le bas et que tous les articles ont été obtenus.
À ce stade, tous les articles d'un compte public ont été obtenus, y compris le titre de l'article, l'auteur et l'URL. Mais il n'y a pas de lectures ni de likes. Vous devez ouvrir le lien spécifique de l'article pour le voir.
socket . on ( 'url' , function ( data ) {
window . location = data . url ;
} ) ;
Le nombre de lectures et de likes peut être vérifié en continu côté navigateur pour voir si les éléments DOM sont rendus puis collectés et envoyés au serveur. Vous pouvez également les vérifier directement avec n'importe quel proxy (j'utilise l'ancienne méthode ici).
key = setInterval ( function ( ) {
var readNum = $ ( '#readNum3' ) . text ( ) . trim ( ) ;
if ( ! readNum ) return ;
var likeNum = $ ( '#likeNum3' ) . text ( ) . trim ( ) ;
var postUser = $ ( '#post-user' ) . text ( ) . trim ( ) ;
var postDate = $ ( '#post-date' ) . text ( ) . trim ( ) || $ ( '#publish_time' ) . text ( ) . trim ( ) ;
var activityName = $ ( '#activity-name' ) . text ( ) . trim ( ) ;
var js_share_source = $ ( '#js_share_source' ) . attr ( 'href' ) ;
socket . emit ( 'crawler' , {
readNum : readNum ,
likeNum : likeNum ,
postUser : postUser ,
postDate : postDate ,
activityName : activityName ,
js_share_source : js_share_source
} ) ;
} , 1000 ) ;
Le principe est très simple. Basé sur de vrais robots d'exploration de machines, des attaques de l'homme du milieu et l'injection de scripts javascript, laissez le navigateur simuler le processus d'opération humaine.
// 删除微信网页的安全策略
delete header [ 'Content-Security-Policy' ] ;
delete header [ 'Content-Security-Policy-Report-Only' ] ;
header [ 'Expires' ] = 0 ;
header [ 'Cache-Control' ] = 'no-cache, no-store, must-revalidate' ;