Como todos sabemos, a Tencent usou o Activex para implementar o login rápido do QQ, usando em um navegador desconhecido, e a primeira coisa a fazer foi instalar o controle QuickLogin.
Quando eu não sei quando, o login rápido de repente não precisa mais dos controles.
Naquela época, fiquei muito intrigado, qual método estranho o Tencent usou para interagir com aplicações locais?
Sem plugins, páginas web não deveriam poder interagir diretamente com aplicações locais (a menos que um protocolo seja definido, mas que só possa ser chamado e não os resultados fornecidos pelo programa).
Por acaso (bem, só estou entediado olhando o gerenciador de tarefas e descobrindo o httpd nativo, e encontrando o Apache rodando), de repente percebi uma possibilidade: se o QQ abrir uma porta local, criar um servidor web, ou seja, um servidor TCP que cumpre o protocolo HTTP, e então a página web do ajax fizer uma requisição para esse QQ (neste momento como servidor web), você consegue obter o resultado?
E esse é realmente o resultado.
O Web JS inicia uma requisição GET para http://localhost.ptlogin2.qq.com (portando de 4300-4308, uma a uma para o sucesso).
Fazer ping vai encontrar que está 127.0.0.1, e quando você verificar a porta, ela está realmente em uso com QQ.
Primeira solicitação: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk de biscoitos, seja lá o que for; r é um número aleatório
O resultado retornado é um array JSON:
var var_sso_uin_list=[{"conta":"Logado na conta QQ","face_index":-1,"gender":0,"apelido":"Seu apelido QQ","uin":"Ainda sua conta QQ","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Depois, use http://ptlogin2.qq.com/getface para conseguir avatares QQ, o que não será discutido aqui
Dessa forma, suas informações do QQ podem ser exibidas na página da web.
Quando você aperta seu avatar (quando seleciona este login)
As seguintes solicitações são geradas:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
De forma semelhante, r é um número aleatório, pt_local_tk é de um cookie, local_token
O que esse pedido faz?
Bem, Set-Cookie.
Depois, prossiga com o pedido
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
O único U1 aqui é o endereço de destino
Esse pedido devolverá todos os cookies que você precisa e você estará logado.
Então, após aprender o protocolo, um problema sério foi descoberto: o que acontece se um programa (de coração negro) fizer essas coisas em nome do usuário?
Comece agora!
Eu só tinha um Mac à mão, então escrevi em Obj-C.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" cabeçalho:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Nota: Devido à minha experiência anterior em bots QQ (baseado no protocolo WebQQ): o cabeçalho Referer é muito importante (deve ser um nome de domínio .qq.com), se estiver errado, ele certamente falhará. Então não há rotatórias aqui
Aliás, eu era novo em Obj-C naquela época, e alguns códigos podem parecer meio bobos, por favor, me perdoem.
//cookiedata是个NSDictionary
Dessa forma, o login é concluído, e você pode encontrar uma interface de espaço QQ (não postada aqui), e o post é bem-sucedido.
O que isso significa? Isso significa que, enquanto for um programa rodando localmente, há uma chance de completar o login do QQ no seu lugar, e realizar algumas operações sorrateiras em plataformas como QQ Space que não exigem autenticação secundária
|