Comme nous le savons tous, Tencent a utilisé Activex pour implémenter la connexion rapide QQ, en l’utilisant sur un navigateur inconnu, et la première chose à faire a été d’installer le contrôle QuickLogin.
Juste au moment où je ne sais pas quand, la connexion rapide n’a soudainement plus besoin des contrôles.
À ce moment-là, j’étais très perplexe, quelle méthode étrange Tencent utilisait-elle pour interagir avec les applications locales ?
Sans plugins, les pages web ne devraient pas pouvoir interagir directement avec les applications locales (sauf si un protocole est défini, mais qui ne peut être appelé qu’aux résultats fournis par le programme).
Par hasard (enfin, je m’ennuyais juste à regarder le gestionnaire des tâches, à découvrir le httpd natif et à trouver Apache en marche), j’ai soudain réalisé une possibilité : si QQ ouvre un port local, crée un serveur web, c’est-à-dire un serveur TCP conforme au protocole HTTP, puis que la page web ajax fait une requête à ce QQ (actuellement en tant que serveur web), pouvez-vous obtenir le résultat ?
Et c’est vraiment le résultat.
Web JS initie une requête GET pour http://localhost.ptlogin2.qq.com (portages de 4300 à 4308, un par un vers le succès).
En le pingant, il verra qu’il est 127.0.0.1, et quand vous vérifiez le port, il est bien QQ en usage.
Première demande : /pt_get_uins ?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk des cookies, quoi que ce soit ; r est un nombre aléatoire
Le résultat obtenu est un tableau JSON :
var var_sso_uin_list=[{"account » :"Connecté au compte QQ »,"face_index » :-1,"gender » :0,"nickname » :"Your QQ nickname,"uin » :"Still your QQ account »,"client_type » :66818,"uin_flag » :8388612}] ; ptui_getuins_CB(var_sso_uin_list) ;
Ensuite, utilisez-http://ptlogin2.qq.com/getface pour obtenir des avatars QQ, ce qui ne sera pas abordé ici
Ainsi, vos informations QQ peuvent être affichées sur la page web.
Quand vous appuyez sur votre avatar (lorsque vous sélectionnez cette connexion)
Les requêtes suivantes sont générées :
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
De même, r est un nombre aléatoire, pt_local_tk provient d’un cookie, local_token
À quoi sert cette demande ?
Eh bien, Set-Cookie.
Ensuite, procédez à la demande
http://ptlogin2.qq.com/jump?clientuin=你的QQ号&keyindex=19&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_local_tk=1881902769&pt_3rd_aid=0&ptopt=1&style=40
Le seul U1 ici est l’adresse de destination
Cette demande vous renverra tous les cookies dont vous avez besoin, et vous êtes connecté.
Après avoir appris le protocole, un problème sérieux a été découvert : que se passe-t-il si un programme (au cœur noir) fait ces choses au nom de l’utilisateur ?
Commencez dès maintenant !
Je n’avais qu’un Mac sous la main, alors je l’ai écrit en Obj-C.
[self GET :@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011 » en-tête :nil] ;
//这里的GET是我自己封装的一个方法,GET网页上的数据
Note : En raison de mon expérience précédente avec les bots QQ (basé sur le protocole WebQQ) : l’en-tête Referer est très important (il doit s’agir d’un nom de domaine .qq.com), une fois qu’il est incorrect, il échouera forcément. Il n’y a donc pas de ronds-points ici
Au fait, j’étais nouveau en Obj-C à l’époque, et certains codes peuvent sembler un peu ridicules, veuillez m’excuser.
//cookiedata是个NSDictionary
Ainsi, la connexion est terminée, vous pouvez trouver une interface QQ Space (non publiée ici), et le post est réussi.
Qu’est-ce que cela signifie ? Cela signifie que tant que c’est un programme qui tourne localement, il y a une chance de se connecter à QQ à votre place, et de réaliser des opérations sournoises sur des plateformes comme QQ Space qui ne nécessitent pas d’authentification secondaire
|