Парс страницы + JS

Discussion in 'PHP' started by slva2000, 24 Apr 2013.

  1. slva2000

    slva2000 New Member

    Joined:
    20 Nov 2009
    Messages:
    42
    Likes Received:
    2
    Reputations:
    0
    Привет.

    Пытаюсь распарсить авито, в частности, телефон.
    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($processCURLOPT_HTTPHEADER$this->headers); 
    if (
    $theadercurl_setopt($processCURLOPT_HEADER1);
    else 
    curl_setopt($processCURLOPT_HEADER0);
    curl_setopt($processCURLOPT_USERAGENT$this->user_agent[0]); 
    curl_setopt($processCURLOPT_REFERER$ref);
    if (
    $this->cookies == TRUEcurl_setopt($processCURLOPT_COOKIEFILE$this->cookie_file); 
    if (
    $this->cookies == TRUEcurl_setopt($processCURLOPT_COOKIEJAR$this->cookie_file); 
    curl_setopt($process,CURLOPT_ENCODING $this->compression); 
    curl_setopt($processCURLOPT_TIMEOUT30); 
    if (
    $this->proxy)
    {
        
    curl_setopt($processCURLOPT_PROXY$this->proxy); 
        
    curl_setopt($processCURLOPT_HTTPPROXYTUNNEL1);
    }
    curl_setopt($processCURLOPT_RETURNTRANSFER1); 
    curl_setopt($processCURLOPT_FOLLOWLOCATION1); 
    $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($urlfalsefalse);

    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_urlfalse$ref);

    file_put_contents("1.png"$img);


    Спасибо заранее за помощь!
     
    #1 slva2000, 24 Apr 2013
    Last edited: 24 Apr 2013
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    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 - вернется ошибка.
     
    _________________________
    #2 Gar|k, 24 Apr 2013
    Last edited: 24 Apr 2013
    1 person likes this.
  3. slva2000

    slva2000 New Member

    Joined:
    20 Nov 2009
    Messages:
    42
    Likes Received:
    2
    Reputations:
    0
    Спасибо за поддержку.

    Попробовал, указанный метод в Хроме отрабатывает, если уже нажата в браузере кнопка "показать тел."
    Иначе - картинка-ошибка.

    Вот что обнаружил:
    Предопределённая переменная (JS) после первоначальной загрузки страницы имеет одно значение. После нажатия кнопки "показать тел." значение этой переменной меняется. Переменная item_phone. Пока ковыряю JS..
    ЗЫ: не знаком с инструментами браузеров для отладки, в ручную сложно :(
     
  4. slva2000

    slva2000 New Member

    Joined:
    20 Nov 2009
    Messages:
    42
    Likes Received:
    2
    Reputations:
    0
    Спасибо друг, расковырял! Был небольшой косячёк... + тебе за хром, хоть и терпеть его не могу.

    Тема, думаю пригодиться многим.
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Ну и где была собака зарыта?

    А инструменты отладки в обозревателях очень полезны если код обфусцирован.

    console.log(object); и любуешься

    На одном ресурсе был реализован ajax загрузчик файлов - список расширений доступных для загрузки прописывался в js коде, который в свою очередь был обфусцирован, заходим в консоль переопределяем переменную иии...
     
    _________________________
    #5 Gar|k, 25 Apr 2013
    Last edited: 25 Apr 2013
  6. slva2000

    slva2000 New Member

    Joined:
    20 Nov 2009
    Messages:
    42
    Likes Received:
    2
    Reputations:
    0
    Обфускацию можно и на месте вручную сделать, к тому же есть онлайн декодеры, а вот с хреновыми знаниями JS сложновато разобрать, например именной массив :) (лично для меня) В пхп то всё ясно, а тут в этом и была загвоздка.

    Готовую реализацию не выкладываю для ленивых, но скажу, что массив item, как раз такой. В нём и была загвоздка с именем id, значение которого у каждого товара своё.

    Реферер не нужен при обращении. Сейчас вопрос по таймауту. сервер блочит выполнение php (любых скриптов с авито ru), если обратиться за телефоном, скажем 10 раз за 5 сек. К самим страницам товара это не относится.

    Так же сейчас кумекаю и прикручиваю на php ре_капчу телефона, чтобы иметь цифры, вместо картинки...
     
  7. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Телефончик можно вытягиватьи другим способом =), не обязательно напрямую.
    Вообще конечно же, не один сниффер тебе не покажет информацию которая генерится JS.

    Срать на обфускацию, срать на декодеры. Без отладчика далеко не уйдешь. Попробуй разбери код который сжат компрессором. Ладно если там 500 строчек кода, а если 10 000 а то и более. А с отладчиком просто, Ставишь бряк, смотришь функции, пишешь пару дополнительных скриптов, и дело в шляпе.

    Сам не раз просил помощи, из за отсутствия знаний по JS, а как оказалось я всего лишь лентяй. Час потраченный на чтении доков, дал нужный выхлоп =).