우리 모두 알다시피, 텐센트는 익숙하지 않은 브라우저에서 QQ 빠른 로그인을 구현하기 위해 Activex를 사용했고, 가장 먼저 해야 할 일은 QuickLogin 컨트롤을 설치하는 것이었습니다.
언제 시작할지 모를 때, 퀵 로그인이 갑자기 조작이 필요 없게 됩니다.
그때 저는 매우 혼란스러웠습니다. 텐센트는 로컬 애플리케이션과 상호작용할 때 어떤 이상한 방법을 사용했을까요?
플러그인이 없으면 웹페이지가 로컬 애플리케이션과 직접 상호작용할 수 없어야 합니다(프로토콜이 정의되어 있지 않지만, 프로그램이 제공하는 결과는 호출할 수 없을 뿐).
우연히(사실 작업 관리자를 보고 네이티브 httpd와 Apache 실행 중인 것을 발견하다가 지루해서), 갑자기 한 가지 가능성을 깨달았습니다: 만약 QQ가 로컬 포트를 열고, HTTP 프로토콜을 준수하는 웹 서버, 즉 TCP 서버를 만든 후, 웹페이지 ajax가 그 QQ(현재 웹 서버)에 요청을 보내면, 결과를 얻을 수 있나요?
그게 바로 그 결과입니다.
웹 JS는 http://localhost.ptlogin2.qq.com(4300-4308 포트를 하나씩 성공으로 연결)로 GET 요청을 시작합니다.
핑을 보내면 127.0.0.1이 나오고, 포트를 확인하면 실제로 QQ가 사용 중입니다.
첫 번째 요청: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
쿠키 pt_local_tk 뭐든지; r은 난수입니다
결과는 JSON 배열입니다:
var var_sso_uin_list=[{"account":"QQ 계정에 로그인됨","face_index":-1,"gender":0,"nickname":"Your QQ 닉네임","uin":"여전히 당신의 QQ 계정","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
그 다음 http://ptlogin2.qq.com/getface 사용해 QQ 아바타를 얻으세요. 이 부분은 여기서 다루지 않겠습니다
이렇게 하면 QQ 정보를 웹페이지에 표시할 수 있습니다.
아바타를 누르면(로그인 선택을 할 때)
다음과 같은 요청이 생성됩니다:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
마찬가지로, r은 무작위 숫자pt_local_tk 쿠키에서 나온 숫자입니다local_token
이 요청은 무엇을 하는 걸까요?
자, 세트-쿠키.
그 후 요청을 진행하세요
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
여기서 U1은 목적지 주소뿐입니다
이 요청은 필요한 모든 쿠키를 반환하며, 로그인 상태입니다.
그래서 프로토콜을 배운 후, 심각한 문제가 발견되었습니다: (흑심을 가진 프로그램)이 사용자를 대신해 이런 일을 한다면 어떻게 될까요?
지금 바로 시작하세요!
맥이 하나밖에 없어서 Obj-C로 작성했습니다.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" 헤더:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
참고: 이전에 QQ 봇(WebQQ 프로토콜 기반)에서 사용한 경험에 비추어 보면, Referer 헤더는 매우 중요합니다(반드시 .qq.com 도메인이어야 합니다). 잘못되면 반드시 실패합니다. 그래서 여기에는 로터리가 없습니다
참고로, 그때 저는 Obj-C를 처음 접한 상태라 코드가 좀 어리석게 느껴질 수 있으니 양해 부탁드립니다.
//cookiedata是个NSDictionary
이렇게 하면 로그인이 완료되고, QQ 공간 인터페이스(여기는 게시되지 않음)를 찾을 수 있으며, 게시물이 성공합니다.
이게 무슨 뜻일까요? 즉, 프로그램이 로컬에서 실행되는 한 QQ 로그인을 완료할 수 있고, QQ 공간 같은 플랫폼에서 보조 인증이 필요 없는 은밀한 작업을 할 수 있다는 뜻입니다
|