Как всем известно, Tencent использовала Activex для реализации быстрого входа QQ, используя его в незнакомом браузере, и первым делом было установка управления QuickLogin.
Как только я не знаю когда, быстрый вход внезапно перестаёт нуждаться в контролях.
В то время я был очень озадачен, какой странный метод использовал Tencent для взаимодействия с локальными приложениями?
Без плагинов веб-страницы не должны иметь возможность напрямую взаимодействовать с локальными приложениями (если только протокол не определен, но может быть вызван только по результатам, предоставляемым программой).
Случайно (ну, просто скучно смотреть в диспетчер задач, обнаруживая нативный httpd и обнаружив запущенный Apache), я вдруг понял, что возможно: если QQ откроет локальный порт, создаёт веб-сервер, то есть TCP-сервер, соответствующий протоколу HTTP, а затем ajax веб-страницы делает запрос к этому QQ (на данный момент как веб-сервер), можно ли получить результат?
И вот в чём получилось.
Web JS инициирует GET-запрос на http://localhost.ptlogin2.qq.com (порты с 4300 по 4308, один за другим для успеха).
Пинг показывает, что это 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=[{"аккаунт":"Входил в аккаунт QQ","face_index":-1,"gender":0,"никнейм":"Ваш никнейм 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 здесь — это адрес назначения
Этот запрос вернёт все необходимые вам файлы cookie, и вы войдёте в систему.
После изучения протокола была обнаружена серьёзная проблема: что произойдёт, если (чёрнодушная) программа делает это от имени пользователя?
Начинайте сейчас!
У меня был только Mac, поэтому я написал его в Obj-C.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" header:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Примечание: Из-за моего предыдущего опыта работы с ботами QQ (на основе протокола WebQQ): заголовок Refer очень важен (это должно быть доменное имя .qq.com), если он ошибается, он точно сработает. Так что здесь нет кольцевых развязок
Кстати, я тогда был новичком в Obj-C, и некоторые части кода могут показаться немного глупыми — прошу прощения.
//cookiedata是个NSDictionary
Таким образом, вход завершён, и вы можете найти интерфейс QQ пространства (не опубликован здесь), и пост проходит успешно.
Что это значит? Это значит, что пока программа работает локально, есть шанс завершить вход в QQ вместо вас и выполнить некоторые скрытые операции на платформах, таких как QQ Space, которые не требуют вторичной аутентификации
|