Vkontakte=>ipb парсер

Тема в разделе "PHP", создана пользователем ZiX, 30 дек 2011.

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

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    Помогите разобраться. Допиливаю парсер контента вконтакте, на форум ipb. Запросы допилил, а вот собрать контент с вконтакте не получается...

    <?
    set_time_limit(0);
    include('config.php');
    include('simple_html_dom.php');

    // connect to forum db
    //

    mysql_connect("localhost", "xxxxx", "xxx");
    mysql_select_db("xxxxx");
    mysql_query("SET NAMES cp1251");

    $user_cookie_file = 'cookie.txt';
    $bad_symbols = array('{', '}');
    $min_date = mktime(19, 45, 12, 04, 21, 2008);

    function Login($uname, $pass)
    {
    global $user_cookie_file;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://vkontakte.ru/login.php');
    curl_setopt($ch, CURLOPT_COOKIEJAR, $user_cookie_file);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'email='.$uname.'&pass='.$pass);
    curl_exec($ch);
    curl_close($ch);
    }

    function GetPageContent($url)
    {
    global $user_cookie_file;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $user_cookie_file);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $res = curl_exec($ch);
    curl_close($ch);

    return $res;
    }

    function AddUser($name, $date)
    {
    global $table_prefix;

    $reg_date = $date - mt_rand(300, 1296000);

    // reg user if not registered
    //

    $row = mysql_fetch_array(mysql_query("SELECT `member_id` FROM `ipb_members` WHERE `name` = '{$name}'"));


    if ($row)
    $user_id = $row['member_id'];
    else
    {
    mysql_query("INSERT INTO `{ipb_members` (`member_group_id`, `name`, `members_display_name`,`members_seo_name`, `user_regdate`) VALUES ('3', '{$name}', '{$name}', '{$name}', '{$reg_date}')");
    $user_id = mysql_insert_id();
    mysql_query("INSERT INTO `{ipb_profile_portal` (`pp_member_id`) VALUES ('{$user_id}')");


    }

    return $user_id;
    }


    if (isset($_POST['ok']))
    {
    if (isset($_POST['status']) && $_POST['status'] >= 0 && $_POST['status'] <=1)
    {
    $status = intval($_POST['status']);
    }

    // login to vkontakte
    //

    $uname = $_POST['uname'];
    $pass = $_POST['pass'];

    Login($uname, $pass);

    // get title, author, first page and count max offset
    //

    $topic = trim($_POST['topic']);

    $content = GetPageContent($topic);

    if (trim($content) == '')
    exit('error');

    $html = str_get_html(str_replace($bad_symbols, '', $content));


    $title = $html->find('a#topic_title', 0);
    $title = $title->innertext;

    if ($status ==0)
    {
    $author = $html->find('span.postAuthor a', 0);
    $author = $author->innertext;
    }
    else
    {
    $nick = file("nick.txt");
    $quantity = count($nick) -1;
    $number_element = mt_rand(0, $quantity);
    $author = $nick[$number_element];
    }

    $post = $html->find('div.postMessage', 0);
    $post = $post->innertext;

    $pageList = $html->find('ul.pageList', 0);


    if ($pageList != null)
    {
    $last_url = end($pageList->find('li a'))->href;

    list($tmp, $max_offset) = explode('=', $last_url);
    }
    else
    $max_offset = 0;

    $offset = 0;

    //

    $forum_id = $_POST['forum_id'];


    $topic_date = mt_rand($min_date, time()-2592000);

    $user_id = AddUser($author, $topic_date);

    // create topic
    //

    mysql_query("INSERT INTO `{ipb_topics` (`forum_id`, `approved`, `title`, `last_poster_name`, `start_date`, `starter_name`) VALUES
    ('{$forum_id}', '1', '{$title}', '{$user_id}', '{$topic_date}', '{$author}')");

    $topic_id = mysql_insert_id();

    mysql_query("INSERT INTO `{ipb_posts` (`author_id`, `topic_id`, `new_topic`) VALUES ('{$user_id}', '{$topic_id}', '1')");

    mysql_query("UPDATE `{ipb_forums` SET
    `topics` = `topics` + 1
    WHERE `forum_id` = '{$forum_id}'");



    // parse topic from vkontakte
    //

    $post_date = $topic_date;

    sleep(5);

    while ($offset <= $max_offset)
    {
    $content = GetPageContent($topic."?offset={$offset}");

    $html = str_get_html(str_replace($bad_symbols, '', $content));

    foreach ($html->find('div.postBody') as $postBody)
    {
    $postAuthor = $postBody->find('div[class=bp_author_wrap]');
    $postMessage = $postBody->find('div.bp_text', 0);

    if ($status ==0)
    $postAuthor = $postAuthor->innertext;
    else
    {
    $nick = file("nick.txt");
    $quantity = count($nick) -1;
    $number_element = mt_rand(0, $quantity);
    $postAuthor = $nick[$number_element];
    }
    $postMessage = $postMessage->innertext;

    echo $postAuthor->innertext;
    echo "Name :{$postAuthor}";


    $user_id = AddUser($postAuthor, $post_date);

    // add post
    //

    mysql_query("INSERT INTO `{ipb_posts` (`topic_id`,`author_id`, `post_date`, `approved`, `post`, `new_topic`) VALUES
    ('{$topic_id}', '{$user_id}', '{$post_date}', '1', '{$postMessage}', '1')");

    $post_id = mysql_insert_id();


    mysql_query("UPDATE `{ipb_topics` SET
    `forum_id` = '{$forum_id}',
    `last_poster_id` = '{$post_id}',
    `starter_id` = '{$user_id}',
    `starter_name` = '{$postAuthor}',

    `last_post` = '{$post_date}'
    WHERE `tid` = '{$topic_id}'");

    mysql_query("UPDATE `{ipb_members` SET
    `user_posts` = `user_posts` + 1
    WHERE `user_id` = '{$user_id}'");

    mysql_query("UPDATE `{ipb_forums` SET
    `forum_posts` = `forum_posts` + 1,

    `forum_last_post_time` = '{$post_date}',
    `forum_last_poster_name` = '{$postAuthor}',
    `forum_last_poster_id` = '{$user_id}',
    `forum_last_post_id` = '{$post_id}'
    WHERE `forum_id` = '{$forum_id}'");


    $post_date += mt_rand(300, 172800);

    if ($post_date > time())
    $post_date = time();
    }

    $offset += 20;


    $html->clear();
    unset($tmp);
    unset($html);
    unset($postBody);
    unset($postAuthor);
    unset($postMessage);

    sleep(3);
    }
    $query = sprintf("select count(pid) as id from `{ipb_posts` where `topic_id` = '{$topic_id}'");
    $res = mysql_query($query);
    $myres = mysql_fetch_assoc($res);
    $quantity = $myres['id'];
    $rand = mt_rand(2,5);
    $quantity = $quantity*$rand;
    $query = sprintf("UPDATE `{ipb_topics` set `views` = '{$quantity}' where `tid` = '{$topic_id}'");
    $result = mysql_query($query);
    echo "{$postAuthor}";
    echo "Готово";
    }
    else
    {
    // get forums names
    //


    $opt = '';
    $res = mysql_query("SELECT `id`, `name` FROM `ipb_forums` WHERE `status` = '1'");



    while ($row = mysql_fetch_array($res))


    $opt = "<option value=\"{$row['forum_id']}\">{$row['forum_name']}</option>";


    echo "{$opt}";

    // show form
    //

    echo"
    <table cellpadding=\"0\" cellspacing=\"0\">
    <form method=\"post\" action=\"\">
    <tr>
    <td>
    Логин:
    </td>
    <td>
    <input type=\"text\" name=\"uname\" />
    </td>
    </tr>
    <tr>
    <td>
    Пароль:
    </td>
    <td>
    <input type=\"password\" name=\"pass\" />
    </td>
    </tr>
    <tr>
    <td>
    Ссылка на обсуждение:
    </td>
    <td>
    <input type=\"text\" name=\"topic\" size=\"50\" />
    </td>
    </tr>
    <tr>
    <td>
    Парсить в раздел:
    </td>
    <td>
    <select name=\"forum_id\">".$opt."</select>
    </td>
    </tr>
    <tr>
    <td>
    Реальные имена
    </td>
    <td>
    <input type=radio name='status' value=0 checked = 'checked'>
    </td>
    </tr>
    <tr>
    <td>
    Подставлять ники
    </td>
    <td>
    <input type=radio name='status' value=1 >
    </td>
    </tr>
    </table>
    <input type=\"submit\" name=\"ok\" value=\"Поехали!\" /><br />
    <span style=\"color: red;\">Кнопку нужно нажать один раз и ждать пока появится надпись \"Готово\"</span>
    </form> "

    ;
    }
    ?>

    немогу вытащить тело автора, тело сообщения...
    проблема в этом коде
     
  2. partykat

    partykat Писатель

    Регистр.:
    30 дек 2011
    Сообщения:
    1
    Симпатии:
    0
    а можно на pastebin выложить, а то мне например не видно :(
     
  3. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    так видно?
     
  4. bmanuev

    bmanuev Создатель

    Регистр.:
    3 авг 2009
    Сообщения:
    12
    Симпатии:
    0
    А что он парсит?
     
  5. Nellisen

    Nellisen Постоялец

    Регистр.:
    4 авг 2008
    Сообщения:
    54
    Симпатии:
    8
    Код:
    $title = $html->find('a#topic_title', 0);
    Такого тега, с таким id на странице обсуждения контакта нет.


    На странице обсуждения такой код:
    Код:
    <a href="/some_link" onclick="return nav.go(this, event)" id="bt_title">тут название</a>
    Т.е. попробуй заменить на:
    Код:
    $title = $html->find('a#bt_title', 0);
    Точно также и с автором:
    Код:
    $author = $html->find('span.postAuthor a', 0);
    Меняешь на:
    Код:
    $author = $html->find('.bt_author a.mem_link', 0);
    Теперь должно заработать.