PHP молча получает всю текущую информацию о группе QQ

PHP

В грядущую эру искусственного интеллекта (ИИ), возможно, никто не будет знать, кто использует компьютер — человек или сам компьютер. После прочтения этого, пока ваш QQ находится в сети, программа может автоматически получить много информации, связанной с ним, без открытия какой-либо страницы, а затем назвать это молчаливым приобретением.

Младший инженер PHP сражается с тысячами членов группы QQ, чтобы получить информацию

В предыдущей статье операция входа завершалась вручную щелчком мыши, а сгенерированные bkn и cookie копировались, чтобы программа могла напрямую перейти на страницу входа и получить информацию обо всех членах группы. Но его всегда нужно задавать вручную, что делает работу программы полуавтоматической.

[Получить информацию заголовка запроса-gif]

начало истории

Возможность получать данные — это достаточно круто для новичков, но как инженеры могут останавливаться на достигнутом — я даже не хочу щелкать мышью, поэтому начинаю полностью автоматизировать.

Ищете оскорбления? Кто это сказал. . .

В повторяющихся операциях ручного входа в систему и копирования куки-файлов инженер Ниу Ниу уловил вдохновение и начал думать в своем сердце: если это точка входа, программа также возможна; сервер не может определить, является ли операция выполняется человеком или машиной.Да, не помешает ли протокол https программе получить авторизацию личности?Ответ - нет, https только обеспечивает безопасность передачи данных, но программа может быть полностью эквивалентна работе клиента, имитируя происхождение запроса, теоретически и https Неважно, как сделан запрос - стрелка вроде на строке.

Ради культивирования новичков Лао Ню все еще хотел спросить Сяо Бая, какое у него есть решение. Подумав несколько минут, Сяобай был вне себя от радости и собирался вскочить.

Сяобай: ​​Это непросто Мы используем CURL для захвата страницы входа, пишем код JavaScript, чтобы внешний интерфейс имитировал щелчки мыши, а затем фиксируем прыжок.

(Этот пацан опять недооценивает врага, и будет больно просто говорить об этом и просить его осознать это самому. Лао Ню так думает в глубине души, и считает, что поощрение должно быть главным. Ведь эта индустрия нужна определенная уверенность, а сейчас ЧН это 90% кода.Фермеры никогда не доживали до 30 лет, а время от времени выходит продукт и одного-двух программистов убьют в жертву небу...)

Лао Ню: Ваша идея довольно творческая, но вы можете столкнуться с двумя трудностями. Во-первых, curl не может сгенерировать полную DOM-структуру документа при обратном обходе страницы, и пользовательские js могут не выполняться; во-вторых, даже если js может имитировать переход, содержимое, сгенерированное самообновлением страницы, может быть в больших доменах столкновения, это могут быть сложные вопросы.

Xiaobai: Тогда я должен попробовать этот путь?

Лао Ню: Попробуй, ты должен попробовать. Но теперь сначала войдите в QQ на моем компьютере.

Следующий момент операции заставил Сяобая открыть рот. Оказывается, Лао Ню реализовал автоматический вход в систему и извлечение данных. Кажется, что это всего на один клик меньше. Только Лао Ню знает все тонкости этого. В этот момент Сяобай послушно выслушал слова Лао Ню, поднял маленькую скамейку и тихо прислушался. Лао Ню ожидал, что этот комментарий будет очень хлопотным, и попросил Сяо Бая заранее купить банку Ред Булла, а этот парень получил коробку.

Ⅰ Туман рассеивается

Почему я могу получить текущий аватар QQ на странице? Обновление F5 воссоздает сценарий первого посещения. Наблюдая за браузером F12, мы ищем близкие к истине подсказки из смешанных HTTP-запросов — настольное приложение QQ также является локальным сервером.

Ⅱ.Очки знаний боевой готовности

1. HTTP-протокол. Запрос, ответ, разница между Cookie и Set-Cookie, код состояния 200, 302 и т. д.

2. Скрипач. Инструмент прокси-сервера протокола HTTP используется для захвата запросов и ответов на протяжении всего процесса входа в систему для упрощения анализа.

3. Отладка разработчика браузера F12.

[Fiddler просмотреть полный процесс входа в систему-gif]

Ⅲ Последняя фантазия

//①获得pt_local_token也叫pt_local_tk$token = getToken();//②获得当前登录QQ号$uin = pt_get_uins($token);//③获得clientkey$clientkey = pt_get_st($uin,$token);//④获得QQ登录成功后的skey和richURL$arr = jump($token,$uin,$clientkey);$skey = $arr['skey'];$richURL = $arr['url'];//⑤获得QQ群页面登录成功后的p_skey$p_skey =getPSkey($richURL,$skey);//⑥凭借相关参数获取当前QQ的所在群列表数据$bkn = getBkn($skey);$Cookie = "Cookie: p_skey={$p_skey};uin=o{$uin} ;skey={$skey}";$json = getGroupList($bkn,$Cookie); [源码下载]-一个.php文件无需任何配置直接运行https://github.com/nasaplayer/getCurrentQQGroupListскопировать код

Приведенный выше код содержит все наши основные процессы, которые на самом деле представляют собой всего несколько строк кода. Пожалуйста, также обратите внимание на передачу параметров, в этом основная логика, и люди, которым предназначено, должны понять это с первого взгляда. Среди них, ①②③④⑤⑥, примерно считают, что каждая часть функции инициирует HTTP-запрос (это то же самое, что открывать веб-страницу в браузере), и разница между ними в том, что параметры разные.

[Программа работает эффект-gif]

В программе все результаты ответа HTTP были напечатаны на странице. Операция свирепа как тигр, и мы не знаем истинного лица принципа, ниже нам нужно объяснить его шаг за шагом.

①Сервер запрашивает pt_local_token

$token = getToken();скопировать код

getToken для

目标页面:https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=73&hide_close_icon=1&pt_no_auth=1&s_url=https%3A%2F%2Fqun.qq.com%2Fmember.html%23скопировать код

Инициировать запрос, в котором параметр s_url=https://qun.qq.com/member.html# используется для указания серверу перейти на страницу s_url в случае успешного входа в систему. Сервер думает, кто этот незнакомец, сначала дает ему примечание pt_local_token, а затем возвращает связку Set-Cookie через заголовок ответа, чтобы сообщить посетителю (клиенту), что вы сначала сохраняете их, включая pt_local_token. Мне еще нужен uin и clientkey если я хочу пройти уровень (=,=откуда это знать постороннему, конечно, Fiddler его ищет, а можно посмотреть изнутри из общей ситуации).

getToken响应头HTTP/1.1 200 OKDate: Sun, 15 Apr 2018 12:50:46 GMTContent-Type: text/htmlContent-Length: 34759Connection: keep-aliveServer: QZHTTP-2.38.41P3P: CP="CAO PSA OUR"Cache-Control: max-age=86400Set-Cookie: pt_user_id=5197250212595915679; EXPIRES=Wed, 12-Apr-2028 12:50:47 GMT; PATH=/; DOMAIN=ui.ptlogin2.qq.com;Set-Cookie: pt_login_sig=2vLVdRAlGxcNvBYEjB5E*JjIE0u0-n21s0ouAQOeQ*bgo7Fkd6Cw3O9DrNS9l7C-; PATH=/; DOMAIN=ptlogin2.qq.com;Set-Cookie: pt_clientip=1be91b13d8b8cf14; PATH=/; DOMAIN=ptlogin2.qq.com;Set-Cookie: pt_serverip=39490abf0e2ff9a8; PATH=/; DOMAIN=ptlogin2.qq.com;Set-Cookie: pt_local_token=1798081340; PATH=/; DOMAIN=ptlogin2.qq.com;Set-Cookie: uikey=b9f012f44bdf628d965a537cd1049fc75f538501135f7f2356b48c0a1e0e8be3; PATH=/; DOMAIN=ptlogin2.qq.com;Set-Cookie: pt_guid_sig=3239abfc37c8eea7b67a560e64664e9929011985be910feb6c9836bcac5c177a; EXPIRES=Tue, 15-May-2018 12:50:47 GMT; PATH=/; DOMAIN=ptlogin2.qq.com;Set-Cookie: ptui_identifier=000D9533813A7A9BEAE8DDB4A01B1C9FA96BB5F524F1F52858C67059; PATH=/; DOMAIN=ui.ptlogin2.qq.com;Last-Modified: Thu, 08 Mar 2012 02:04:00 GMTStrict-Transport-Security: max-age=31536000скопировать код

Вы заметили Set-Cookie:pt_local_token выше?

② Спросите у владельца маленького пингвина информацию

$uin = pt_get_uins($token);скопировать код

это заявление

https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=0.0760575656488639&pt_local_tk={$token}скопировать код

Я инициировал запрос, и запрос был отправлен на десктопное приложение QQ (сервер прослушивает порт 4301), Маленький Пингвин, владелец попросил меня перейти на qun.qq.com, но был остановлен отвратительным сервером, лечащим меня как незнакомец. Мне нужна некоторая основная информация, такая как номер QQ владельца, который является токеном, предоставленным мне сервером.

Маленький пингвин (внимательно проверьте): Дайте мне токен, и я подтвержу номер, на который я вхожу. Хорошо, все сделано. Маленький пингвин оставил кучу строк, а тело ответа содержит основную информацию о текущей учетной записи QQ.

pt_get_uins响应头HTTP/1.1 200 OKContent-Type: Application/javascriptContent-Length: 198pt_get_uins响应体var var_sso_uin_list=[{"account":"2919386060","client_type":65793,"face_index":735,"gender":1,"nickname":"百万强心剂","uin":"2919386060","uin_flag":58720768}];ptui_getuins_CB(var_sso_uin_lскопировать код

Тело ответа представляет собой строку строк, присваивает основную информацию QQ в формате JSON и использует PHP для регулярного получения параметров слова.

preg_match("/var_sso_uin_list=(.*?);ptui_getuins_CB/", $body, $matches); $json =$matches[1];$jsonObj = json_decode($json, false);$user = $jsonObj[0];//使用第一个QQ快速登录$uin = $user->uin;скопировать код

Теперь, выполнив шаги ① и ②, можно получить токен и информацию о номере QQ текущего входа в систему на рабочем столе. Фактически то, что мы делаем, эквивалентно прямому доступу к адресу ① в браузере, что применимо к любому месту, где требуется вход в QQ. Видно, что интерфейс только обновился, но за ним столько сложных взаимосвязей запросов. Прибыл сюда успешно сейчас, Next.

[После ①②Фактического эффекта-gif]

③Попросите клиентский ключ маленького пингвина еще раз

$clientkey = pt_get_st($uin,$token);скопировать код

В направлении

https://localhost.ptlogin2.qq.com:4301/pt_get_st?clientuin={$uin}&callback=ptui_getst_CB&r=0.4266647630782271&pt_local_tk={$token}скопировать код

Сделайте запрос, этот запрос по-прежнему отправляется в настольное приложение QQ, и обратите внимание, что путь к интерфейсу отличается. Маленький Пингвин брат, с токеном и уином, я так и не могу доказать серверу, что мой доступ авторизован мастером.Также нужно согласовать ключевые правила с сервером, а потом генерировать клиентский ключ по токену и Уин, просто скажи мне тихо.

Маленький пингвин: Ладно, токен+уин, сразу переходи к клиентскому ключу. (в течение нескольких миллисекунд), когда это будет сделано, я дам вам Set-Cookie:clientkey, и вы сможете записать его самостоятельно

pt_get_st响应头HTTP/1.1 200 OKContent-Type: Application/javascriptContent-Length: 76Set-Cookie: clientuin=2919386060;path=/;domain=.ptlogin2.qq.comSet-Cookie: clientkey=00015AD353D5006867DD30727AD69245B5A090104A9B93A6D807D31DF79CE0E27049042682F8A107BD2E2BD40E5CCA6234F4C81FC1376F1FAD7CBC6209A45DE359150100E066229559C8058877F25827ECC4F43DB486DCDED8C7679C47944A6FA363E6B9612F1FA65812D7DEE8C86013;path=/;domain=.ptlogin2.qq.comP3P: CP="CAO PSA OUR"pt_get_st响应体var var_sso_get_st_uin={uin:"2919386060"};ptui_getst_CB(var_sso_get_st_uin);скопировать код

④ Может ли сервер пройти на этот раз?

$arr = jump($token,$uin,$clientkey);$skey = $arr['skey'];$richURL = $arr['url'];скопировать код

В направлении

https://ssl.ptlogin2.qq.com/jump?clientuin={$uin}&keyindex=9&pt_aid=715030901&daid=73&u1=https%3A%2F%2Fqun.qq.com%2Fmember.html%23&pt_local_tk={$token}&pt_3rd_aid=0&ptopt=1&style=40скопировать код

Отправив запрос, с toekn, uin и clientkey, вы свой, сервер с энтузиазмом его одобряет, и насильно запихивает в Set-Cookie не один десяток пунктов. Ключ нужно взять, это ваша следующая остановка, чтобы сдать документ.

jump响应头HTTP/1.1 200 OKDate: Sun, 15 Apr 2018 14:36:44 GMTContent-Type: application/javascriptContent-Length: 453Connection: keep-aliveCache-Control: no-cache, no-store, must-revalidateExpires: -1P3P: CP=CAO PSA OURPragma: no-cacheServer: Tencent Login Server/2.0.0Strict-Transport-Security: max-age=31536000Set-Cookie: ...;Set-Cookie: skey=@wkzS7Ao3s;Path=/;Domain=qq.com;Set-Cookie: ...;jump响应体ptui_qlogin_CB('0', 'https://ptlogin2.qun.qq.com/check_sig?pttype=2&uin=2919386060&service=jump&nodirect=0&ptsigx=103d55c16e79adbdc924a24a7213a596273f36caa9564bd5466a4a4f6d3335aa84a27b285624906610d659180e0eaf850c622541f67b286babab32424274f7fb&s_url=https%3A%2F%2Fqun.qq.com%2Fmember.html&f_url=&ptlang=2052&ptredirect=100&aid=1000101&daid=73&j_later=0&low_login_hour=0®master=0&pt_login_type=2&pt_aid=715030901&pt_aaid=0&pt_light=0&pt_3rd_aid=0', '')скопировать код

Другие Set-Cookies опущены в заголовке ответа, а skey означает ключ авторизации для входа в домен qq.com; 0 в теле ответа указывает на успешный вход в систему, а следующий длинный URL-адрес — это адрес для перенаправления с идентификационным кодом аутентификации и другие параметры, технический термин называется толстым URL (позже названным richURL). Тело ответа об ошибке входа возвращено

ptui_qlogin_CB('-1', 'https://qun.qq.com/member.html', '登录失败,请稍后再试。*')скопировать код

Представьте, что «Имперский город» имеет два уровня, и сейчас мы проходим первый уровень. После получения ключа авторизации входа в домен QQ вторым уровнем является авторизация входа в подприложение QQ.На странице управления группой QQ также требуется p_skey.

⑤ Найдите сервер, чтобы получить p_skey

$p_skey =getPSkey($richURL,$skey);скопировать код

Отправьте запрос на URL-адрес, полученный в ④, и вернитесь

getPSkey响应头HTTP/1.1 302 FoundDate: Mon, 16 Apr 2018 01:54:23 GMTContent-Length: 0Connection: keep-aliveCache-Control: no-cache, no-store, must-revalidateExpires: -1Location: https://qun.qq.com/member.htmlP3P: CP=CAO PSA OURPragma: no-cacheServer: Tencent Login Server/2.0.0Strict-Transport-Security: max-age=31536000Set-Cookie: ...;Set-Cookie: p_skey=2GbDJky6IQHGAaks4oNWU5D*uWaDNzoubXh9-hBRC8A_;Path=/;Domain=qun.qq.com;Set-Cookie: ...;скопировать код

Сервер сообщает нам Set-Cookie:p_skey и регулярно получает от него p_skey.

$rule = "/p_skey=(.*?);/";preg_match($rule, $header, $matches); $p_skey=$matches[1];скопировать код

Таким образом, мы получили авторизацию страницы управления группой QQ.Теперь у нас есть все ключи для подтверждения личности.Догадайтесь, куда наша программа попала, и успешно добралась до страницы управления группой QQ. Далее получить нужные данные через интерфейс вызова ключа.

⑥Интерфейс данных можно использовать случайно

$bkn = getBkn($skey);$Cookie = "Cookie: p_skey={$p_skey};uin=o{$uin} ;skey={$skey}";$json = getGroupList($bkn,$Cookie); скопировать код

функция getGroupList для

https://qun.qq.com/cgi-bin/qun_mgr/get_group_listскопировать код

Отправить запрос и вернуть данные списка групп, где находится текущий QQ. Подождите, кроме куки здесь выдается еще и параметр bkn (10 цифр). После того, как сервер сказал skey и p_skey, соединение было разорвано.bkn должен быть вычислен клиентом.По ссылке некоторых данных было установлено, что он был зашифрован алгоритмом хеширования на клиенте, а входной параметр был skey .

//JavaScriptQZONE.FrontPage.getACSRFToken = function () {          var skey = QZFL.cookie.get("p_skey") || QZFL.cookie.get("skey") || QZFL.cookie.get("rv2");          return arguments.callee._DJB(skey)      };  QZONE.FrontPage.getACSRFToken._DJB = function (skey) {          var hash = 5381;          for (var i = 0, len = skey.length; i < len; ++i)              hash += (hash << 5) + skey.charAt(i).charCodeAt();          return hash & 2147483647      };  //[2013.09.13]描述:QQ官网最新版加密算法,_tk,bkn算法//参考来源:https://blog.csdn.net/default7/article/details/11632239скопировать код

Алгоритм bkn складывает и накапливает кодировку Unicode каждого символа в skey и текущее хеш-значение на 5 бит слева и, наконец, выполняет логическую операцию И над хеш-значением и 2147483647 для получения bkn. Версию js нельзя использовать напрямую, здесь она переписана на PHP

<?phpfunction charCodeAt($str, $index){    $char = mb_substr($str, $index, 1, 'UTF-8');     $value = null;    if (mb_check_encoding($char, 'UTF-8')){        $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');        $value = hexdec(bin2hex($ret));    }    return $value;}function getBkn($skey) {    $hash = 5381;    for ($i = 0, $len = strlen($skey); $i < $len; ++$i){        $hash +=($hash <<5) + charCodeAt($skey, $i);    }    return $hash & 2147483647;}скопировать код

Поэтому для интерфейса get_group_list для получения списка групп QQ, пока есть skey, можно вычислить параметр bkn, а затем объединить с p_skey, готово. То же самое верно и для интерфейса search_group_members, который получает подробную информацию о членах каждой группы.

Все наши функции здесь выполнены.

Ⅳ Обзор и резюме

Вышеупомянутые 6 шагов кратко описаны как:

Доступ → получить авторизацию 1 → получить авторизацию 2 → получить данные

Посетив любую страницу, требующую быстрого входа в QQ, получите токен сервера (pt_local_token) и получите ключ клиента вместе с uin текущего номера QQ, вошедшего в систему. Клиентский ключ получается после нажатия на аватарку перед входом в систему. Успешно войдите в QQ с помощью токена, uin и clientkey, чтобы получить авторизацию домена, и получите p_skey авторизации входа в подприложение через URL-адрес и skey после авторизации. Само собой разумеется, что здесь можно вызвать любой открытый интерфейс, но на странице управления группой QQ также требуется параметр bkn (base_key), который, как мы обнаружили, генерируется битовой операцией путем передачи параметра skey. Наконец, получаем нужные нам данные.

В этом мучительном процессе многие параметры используются повторно. Личное понимание — это прогрессивно усовершенствованный метод шифрования из соображений безопасности для проверки личности посетителя. Его можно представить как «Имперский город» с внутренним и внешним слоями защиты. Даже если получить внутренний p_skey, все равно не работает.Убедитесь, что вы входите через внешний skey, и дополнительно передайте в запрос параметр bkn. Каков реальный принцип? Всегда будет некоторая неопределенность, потому что вся наша работа по-прежнему основана на тестировании методом черного ящика, девять раз из десяти.

Ⅴ, загрузка исходного кода

https://github.com/nasaplayer/getCurrentQQGroupListскопировать код

мой первый проект на гитхабе

VI,использованная литература

[2017.3.21]《 分析QQ快速登录协议 并实施“CSRF 》https://www.52pojie.cn/thread-591949-1-1.html[2017.5.12]《 [VC] QQ自动登录协议_QQ群验证授权_源码 》https://www.52pojie.cn/forum.php?mod=viewthread&tid=607525&page=1скопировать код

写这个的时候翻看了两本书的内容:《图解HTTP》-250页用了大概2个小时,快速理解了HTTP基础知识,我觉得get到其中60%,增加了领悟力。《HTTP权威指南》-694页可以给满分的书。这本书第11章-客户端识别与cookie机制,讲到了亚马逊购物网站的cookie授权,对本文帮助非常大,目前只看完第1章和11章,全书21章。网上的知识太零碎了,有书还是踏实点скопировать код

VII,Расширенная информация

Отрисовывается ответ сервера Set-Cookie настроек каждого адреса в процессе входа в систему.Цифра соответствует номеру программы выше.Зеленый фон указывает на доменное имя, на котором находится cookie, а красная подсветка указывает на параметры ядра. Весьма вероятно, что другие субприложения QQ имеют аналогичные принципы.

Ⅷ, данные в Excel

Для инженеров просмотр отображения данных эквивалентен входу в EXCEL. Для создания файлов EXCEL непосредственно с помощью PHP последним колесом должны быть PHPSpreadsheets.Автор также упомянул на github, что это следующая версия phpEXCEL. И сказал, что мы не обновляем старый, почему бы нам не попробовать последние функции PHP. Да, разработчики PHP должны идти в ногу со временем, чтобы внедрять инновации.

https://github.com/PHPOffice/PhpSpreadsheetскопировать код

над.