Привет. Пытаюсь распарсить авито, в частности, телефон. JS расковырял, переписал на пхп, все ид и секрет коды совпадают, но скрипт с сервера выдаёт всё равно кривую картинку телефона. Передаю реферер, куки, формирую заголовок в соответствии с "картинкой", всё равно чёт не катит. Что ещё может проверяться скриптом, отдающим картинку, кроме указанного? Выкладываю код: PHP: class cURL { var $headers; var $user_agent; var $compression; var $cookie_file; var $proxy; function cURL($cookies=TRUE,$cookie,$compression='gzip',$proxy='') { $this->headers[] = 'Accept: image/png,image/*;q=0.8,*/*;q=0.5'; $this->headers[] = 'Connection: Keep-Alive'; $this->user_agent = array('Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1'); $this->compression=$compression; $this->proxy=$proxy; $this->cookies=$cookies; if ($this->cookies == TRUE) $this->cookie($cookie); } function cookie($cookie_file) { if (file_exists($cookie_file)) { $this->cookie_file=$cookie_file; } else { fopen($cookie_file,'w') or $this->error('The cookie file could not be opened. Make sure this directory has the correct permissions'); $this->cookie_file=$cookie_file; fclose($this->cookie_file); } } function get($url, $theader=false, $ref) { shuffle($this->user_agent); $process = curl_init($url); curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers); if ($theader) curl_setopt($process, CURLOPT_HEADER, 1); else curl_setopt($process, CURLOPT_HEADER, 0); curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent[0]); curl_setopt($process, CURLOPT_REFERER, $ref); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEFILE, $this->cookie_file); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEJAR, $this->cookie_file); curl_setopt($process,CURLOPT_ENCODING , $this->compression); curl_setopt($process, CURLOPT_TIMEOUT, 30); if ($this->proxy) { curl_setopt($process, CURLOPT_PROXY, $this->proxy); curl_setopt($process, CURLOPT_HTTPPROXYTUNNEL, 1); } curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1); $return = curl_exec($process); curl_close($process); return $return; } $cc = new cURL(1, "cook.txt"); $url='http://www.avito.ru/barnaul/odezhda_obuv_aksessuary/kombenizon_dlya_buduschej_mamy_160823591'; //конкретный товар. echo $data = $cc->get($url, false, false); preg_match("#item_url = '(.+?)'.+?tem_phone = '(.+?)'#is", $data, $match); preg_match('#<link rel="canonical" href="//www.avito.ru/(.+?)"#is', $data, $match_ref); preg_match('#<span id="item_id">(.+?)</span>#is', $data, $match_id); $item_url = $match[1]; $item_id = $match_id[1]; $item_phone = $match[2]; $ref = "http://www.avito.ru/".$match_ref[1]; $img_url = "http://www.avito.ru/items/phone/".$item_url."?pkey=".decode($item_id, $item_phone); /* //Отладка: echo "REF: ".$ref; echo "<br>"; echo "item_url: ".$item_url; echo "<br>"; echo "item_id: ".$item_id; echo "<br>"; echo "item_phone: ".$item_phone; echo "<br>"; echo "URL: ".$url; echo "<br>"; echo "img_url: ".$img_url; */ $img = $cc->get($img_url, false, $ref); file_put_contents("1.png", $img); Спасибо заранее за помощь!
REFERER похоже. Вот есть ссылка - http://www.avito.ru/items/phone/moskva_chasy_i_ukrasheniya_sergi_s_brilliantami_157571674?pkey=35f1a2d9bda8cc983c61877f0a73ea59 а теперь зайди на http://www.avito.ru/moskva/chasy_i_ukrasheniya/sergi_s_brilliantami_157571674 и в console (Chrome) набери $("body").html("<img src='http://www.avito.ru/items/phone/moskva_chasy_i_ukrasheniya_sergi_s_brilliantami_157571674?pkey=35f1a2d9bda8cc983c61877f0a73ea59'>"); Сравни заголовки на всякий случай. Если подобный креньдель провернуть c URL avito.ru - вернется ошибка.
Спасибо за поддержку. Попробовал, указанный метод в Хроме отрабатывает, если уже нажата в браузере кнопка "показать тел." Иначе - картинка-ошибка. Вот что обнаружил: Предопределённая переменная (JS) после первоначальной загрузки страницы имеет одно значение. После нажатия кнопки "показать тел." значение этой переменной меняется. Переменная item_phone. Пока ковыряю JS.. ЗЫ: не знаком с инструментами браузеров для отладки, в ручную сложно
Спасибо друг, расковырял! Был небольшой косячёк... + тебе за хром, хоть и терпеть его не могу. Тема, думаю пригодиться многим.
Ну и где была собака зарыта? А инструменты отладки в обозревателях очень полезны если код обфусцирован. console.log(object); и любуешься На одном ресурсе был реализован ajax загрузчик файлов - список расширений доступных для загрузки прописывался в js коде, который в свою очередь был обфусцирован, заходим в консоль переопределяем переменную иии...
Обфускацию можно и на месте вручную сделать, к тому же есть онлайн декодеры, а вот с хреновыми знаниями JS сложновато разобрать, например именной массив (лично для меня) В пхп то всё ясно, а тут в этом и была загвоздка. Готовую реализацию не выкладываю для ленивых, но скажу, что массив item, как раз такой. В нём и была загвоздка с именем id, значение которого у каждого товара своё. Реферер не нужен при обращении. Сейчас вопрос по таймауту. сервер блочит выполнение php (любых скриптов с авито ru), если обратиться за телефоном, скажем 10 раз за 5 сек. К самим страницам товара это не относится. Так же сейчас кумекаю и прикручиваю на php ре_капчу телефона, чтобы иметь цифры, вместо картинки...
Телефончик можно вытягиватьи другим способом =), не обязательно напрямую. Вообще конечно же, не один сниффер тебе не покажет информацию которая генерится JS. Срать на обфускацию, срать на декодеры. Без отладчика далеко не уйдешь. Попробуй разбери код который сжат компрессором. Ладно если там 500 строчек кода, а если 10 000 а то и более. А с отладчиком просто, Ставишь бряк, смотришь функции, пишешь пару дополнительных скриптов, и дело в шляпе. Сам не раз просил помощи, из за отсутствия знаний по JS, а как оказалось я всего лишь лентяй. Час потраченный на чтении доков, дал нужный выхлоп =).