парсер с логином

Тема в разделе "PHP", создана пользователем vanderv, 10 янв 2011.

Модераторы: latteo
  1. vanderv

    vanderv

    Регистр.:
    30 май 2009
    Сообщения:
    267
    Симпатии:
    12
    Можно ли на php написать парсер который будет логинится на сайте и от этого юзера парсить инфу? подскажите пжл!
     
  2. Belial

    Belial

    Регистр.:
    1 фев 2010
    Сообщения:
    236
    Симпатии:
    113
    Можно. Смотри в сторону curl + cookies.
     
  3. E-body

    E-body

    Регистр.:
    6 сен 2007
    Сообщения:
    979
    Симпатии:
    315

    к примеру парсер на пхп который логинится вконтакте и заливает инфу в дб dle
    PHP:
    <?php
    Error_Reporting
    (E_ALL & ~E_NOTICE);
    ini_set('max_execution_time',0);

    function 
    cut_str($str$left$right)
    {
            
    $str substr(stristr($str$left), strlen($left));
            
    $leftLen strlen(stristr($str$right));
            
    $leftLen $leftLen ? -($leftLen) : strlen($str);
            
    $str substr($str0$leftLen);
            return 
    $str;
    }

    function 
    debug($str) {    $debug 0;
        if (
    $debug == 1) echo $str;
    }
    function 
    translitIt($str)
    {
        
    $tr = array(
            
    "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
            
    "Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
            
    "Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
            
    "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
            
    "У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
            
    "Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
            
    "Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
            
    "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
            
    "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
            
    "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
            
    "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
            
    "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
            
    "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
            
    " "=> "_""."=> """/"=> "_"
        
    );
        return 
    strtr($str,$tr);
    }

    $email urlencode('ВАШ НИК ВКОНТАКТЕ');
    $password urlencode('ВАШ ПОРОЛЬ ВКОНТАКТЕ');
    $album 'АЛЬБОМ'// 11134553_119173584 как пример
    $pause 1;
    $tovar "ОПИСАНИЕ ТОВАРА"//на случай если описание пустое
    $imagePath 'http:/ВАШ САЙТ//1/photos';
    $savePhotoPath 'photos';

    $dbName 'ИМЯ БАЗЫ ДАННЫХ';
    $dbLogin 'ЛОГИН К БАЗЕ ДАННЫХ';
    $dbPassword 'ПОРОЛЬ К БАЗЕ ДАННЫХ';
    $prefix 'dle';

    mysql_connect('localhost',$dbLogin,$dbPassword) or die('не могу подключиться через юзера');
    mysql_select_db($dbName) or die('не могу подключиться к бд');;


    $f fopen('comments.txt','a');

    $ch curl_init();
    curl_setopt ($chCURLOPT_RETURNTRANSFER1);
    //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0");
    curl_setopt($chCURLOPT_COOKIEFILE'cookies.txt');
    curl_setopt($chCURLOPT_COOKIEJAR'cookies.txt');
    curl_setopt($chCURLOPT_TIMEOUT30);
    //GET vkontakte.ru/login.php
    curl_setopt ($chCURLOPT_URL'http://vkontakte.ru/login.php');
    $body curl_exec($ch);
    sleep(2);
    //POST vkontakte.ru/login.php
    curl_setopt($chCURLOPT_POST1);
    curl_setopt($chCURLOPT_POSTFIELDS"op=a_login_attempt");
    curl_setopt ($chCURLOPT_URL'http://vkontakte.ru/login.php');
    $body curl_exec($ch);
    //POST login.vk.com/
    curl_setopt($chCURLOPT_POST1);
    curl_setopt($chCURLOPT_POSTFIELDS"act=login&success_url=&fail_url=&try_to_login=1&to=&vk=&email=".$email."&pass=".$password."&expire=");
    curl_setopt ($chCURLOPT_URL'http://login.vk.com/');
    $body curl_exec($ch);
     
    /*
    echo htmlspecialchars($body);
    die();
    //echo htmlspecialchars($body);

    curl_setopt($ch, CURLOPT_REFERER, 'http://login.vk.com/');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "s=$s&op=slogin&redirect=1&expire=&to=&fail_url=&try_to_login=1");
    curl_setopt($ch, CURLOPT_URL, "http://vkontakte.ru/login.php");
    $body = curl_exec($ch);
    */

    //парсим remixsid
    $s cut_str($body,"name='s' value='","'");
    //POST vkontakte.ru/login.php
    curl_setopt($chCURLOPT_POST1);
    curl_setopt($chCURLOPT_POSTFIELDS"op=slogin&redirect=1&expire=0&to=&s=".$s);
    curl_setopt ($chCURLOPT_URL'http://vkontakte.ru/login.php');
    $body curl_exec($ch);


    curl_setopt ($chCURLOPT_URL'http://vkontakte.ru/album-'.$album);
    $result curl_exec($ch);

    //ищем >>, показывающий, что страниц дофига
    preg_match("/st=([0-9]+)\" >&raquo;<\/a>/",$result,$more);
    //если страниц дофига, то рассчитываем последнюю
    if ($more[1] != '') {    $pagesCount ceil($more[1]/20) + 1;
    } else {    
    //если страниц не дофига, то просто ищем последнюю из всех
        
    preg_match_all("/st=([0-9]+)\" >(.+)<\/a>/U",$result,$pages);
        
    $pagesCount sizeof(array_unique($pages[2])) + 1;
    }

    debug("В группе <b>$pagesCount</b> страниц<br />");
    //перебираем страницы
    for ($count 1$count <= $pagesCount$count++) {
        
    $page = ($count 1)*20;
        
    curl_setopt ($chCURLOPT_URL'http://vkontakte.ru/album-'.$album.'?st='.$page);
        
    $result curl_exec($ch);
        
    preg_match_all('/photo-[0-9]+_[0-9]+/',$result,$photos);
        foreach (
    $photos[0] as $url) {        curl_setopt ($chCURLOPT_URL'http://vkontakte.ru/'.$url);
            
    $result curl_exec($ch);

            
    //Вырезаем комменты с первой страницы
            
    preg_match_all("/<div class='text'>(.+)<\/div>/U",$result,$comments);
            foreach (
    $comments[1] as $value) {
                
    $message ucfirst($value);
                
    $allComments .= $message .' ';
            }
            
    //берем первый коммент
            
    $oneComment $comments[1][0];
            unset(
    $comments[1][0]);
            
    $photo cut_str($result,'<span id="myphotolink">','</span>');
            
    $photo cut_str($photo,'src="','"');
            
    $photoName time().'-'.mt_rand(10000,999999).'.jpg';
            
    file_put_contents($savePhotoPath.'/'.$photoName,file_get_contents($photo));

            
    //вырезаем описание товара
            
    $desc cut_str($result,'<span id="photocaption_wrap"><div id="photocaption">','</div>');
            
    debug("Первичное описание: <b>$desc</b><br />");
            
    //Находим первое предложение (до точки)
            
    preg_match('/.+\./U',$desc,$strArray);
            
    $string $strArray[0];
            
    debug("Первое предложение описания: <b>$string</b><br />");
            if (
    $string == '') {
                
    $string $desc;
                
    debug("Точки не найдено, поэтому берем все: <b>$string</b><br />");
            }
            
    $array explode(' ',$string);
            
    //Если в предложении больше 5 слов, то нам нужно только первые 3 для титла. описание берем полное
            
    if (sizeof($array) > 5) {            debug('В предложении больше 5 слов<br/>');
                
    $title $array[0].' '.$array[1].' '.$array[2];
                
    debug('Берем title: <b>$title</b><br/>');
            } elseif (
    sizeof($array) > 0) {
                
    debug('В предложении меньше 5 слов<br/>');
                
    //если описание короткое, то титл - все описание, описание - комменты
                
    $title $desc;            //$desc = $allComments;
                
    debug("Берем title: <b>$title</b><br/>");
            } else {            
    //если же описание пустое, то в титл - продам товар, в описание - комменты
                
    debug('Предложение пустое, в title пишем "продам товар" <br />');
                
    $title "Продам $tovar";
                
    debug("В описание вставляем первый коммент: <b>{$comments[1][0]}</b><br />");
                
    $desc $comments[1][0];
            }
            
    debug('Обрабатываем описание, удаляем урлы<br />');
            
    $desc trim($desc);
            
    //удаляем все адреса
            
    $desc preg_replace('/http:\/\/.+( |$)/U','',$desc);
            
    $desc htmlspecialchars($desc);
            
    debug("Получаем: <b>$desc</b><br />");
            if (
    $desc == '') {
                
    debug('Описание пустое, пишем "продам товар"<br />');            $desc "Продам $tovar";
            }

            
    debug('Обрабатываем титл, удаляем урлы<br />');
            
    $title str_replace('<br>',' ',$title);
            
    $title str_replace('<br />',' ',$title);
            
    $title strip_tags($title);
            
    $title htmlspecialchars($title);
            
    $title preg_replace('/http:\/\/.+( |$)/U','',$title);
            
    debug("Получаем: <b>$title</b><br />");
            
    $desc "<img src='$imagePath/" $photoName "'/><br />$desc";
            
    $date date('Y:m:d G:i:s');
            
    $altName translitIt($title);


            
    //получаем комменты
            
    $comments cut_str($result,'<div id="photocomment">','<div class="separator"></div></div>');
            
    preg_match_all("/<div class='text'>(.+)<\/div>/Us",$comments,$commentsArray);

            
    //перебираем комменты
            
    foreach ($commentsArray[1] as $commentfwrite($f,$comment."\n");

            
    mysql_query('INSERT INTO `'.$prefix.'_post`(`title`,`alt_name`,`autor`,`short_story`,`full_story`,`approve`,`date`) VALUES ("'.$title.'","'.$altName.'","admin","'.$desc.'","'.$desc.'",1,"'.$date.'")') or die(mysql_error());
            
    sleep($pause);
        }
        if (
    $count $pagesCount) break;
        
    $page $count*20-20;
        
    curl_setopt ($chCURLOPT_URL'http://vkontakte.ru/album-'.$album.'?st='.$page);
        
    $result curl_exec($ch);
    }
    curl_close($ch);
    fclose($f);
    ?>
     
    iehon, Zander и vanderv нравится это.