Como todos sabemos, Tencent usó Activex para implementar el inicio de sesión rápido de QQ, usándolo en un navegador desconocido, y lo primero que hicieron fueron instalar el control QuickLogin.
Justo cuando no sé cuándo, el inicio de sesión rápido de repente deja de necesitar los controles.
En ese momento, estaba muy desconcertado, ¿qué método extraño usaba Tencent para interactuar con aplicaciones locales?
Sin plugins, las páginas web no deberían poder interactuar directamente con aplicaciones locales (a menos que se defina un protocolo, pero solo pueda ser llamado y no los resultados proporcionados por el programa).
Por casualidad (bueno, simplemente aburrido mirando el administrador de tareas y descubriendo el httpd nativo, y encontrando Apache en marcha), de repente me di cuenta de una posibilidad: si QQ abre un puerto local, crea un servidor web, es decir, un servidor TCP que cumple con el protocolo HTTP, y luego la página web ajax hace una petición a ese QQ (en este momento como servidor web), ¿puedes obtener el resultado?
Y ese es realmente el resultado.
Web JS inicia una solicitud GET para http://localhost.ptlogin2.qq.com (portaciones de 4300 a 4308, una a una hacia el éxito).
Si lo haces son, verás que es 127.0.0.1, y cuando revisas el puerto, efectivamente está en uso QQ.
Primera petición: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk de galletas, sea lo que sea; r es un número aleatorio
El resultado que se devuelve es un array JSON:
var var_sso_uin_list=[{"cuenta":"Iniciado en la cuenta de QQ","face_index":-1,"gender":0,"apodo":"Tu apodo de QQ","uin":"Sigue siendo tu cuenta de QQ","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Luego usa http://ptlogin2.qq.com/getface para conseguir avatares de QQ, que no se discutirán aquí
De este modo, tu información de QQ puede mostrarse en la página web.
Cuando pulsas tu avatar (cuando seleccionas este inicio de sesión)
Se generan las siguientes solicitudes:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
De manera similar, r es un número aleatorio, pt_local_tk proviene de una cookie, local_token
¿Qué hace esta solicitud?
Bueno, Set-Cookie.
Luego procede con la solicitud
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
La única U1 aquí es la dirección de destino
Esta solicitud te devolverá todas las cookies que necesites y ya estás conectado.
Así que, tras aprender el protocolo, se descubrió un problema serio: ¿qué ocurre si un programa (de corazón negro) hace estas cosas en nombre del usuario?
¡Empieza ya!
Solo tenía un Mac a mano, así que lo escribí 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" cabecera:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Nota: Debido a mi experiencia previa en bots QQ (basado en el protocolo WebQQ): el encabezado Referer es muy importante (debe ser un dominio .qq.com), y si está equivocado, fallará seguro. Así que aquí no hay rotondas
Por cierto, en ese momento era nuevo en Obj-C, y algunos códigos pueden parecer un poco absurdos, por favor perdóname.
//cookiedata是个NSDictionary
De este modo, se completa el inicio de sesión y puedes encontrar una interfaz de QQ Space (no publicada aquí), y la publicación es exitosa.
¿Qué significa esto? Esto significa que, mientras sea un programa que se ejecute localmente, existe la posibilidad de completar el inicio de sesión de QQ en lugar de tú, y realizar algunas operaciones complicadas en plataformas como QQ Space que no requieren autenticación secundaria
|