Как стать автором
Обновить

Автопостинг RSS ленты в сообщество ВКонтакте на PHP

Вступление


Приветствую уважаемое Хабрасообщество! Не знаю на сколько давно, но в социальной сети ВКонтакте появилась возможность автопостинга RSS ленты в сообщество, но при условии, что Вы являетесь администратором сообщества, в сообществе есть 10 участников и на сайте установлен один из виджетов. Но я решил пойти другим путём и сделал это с помощью ВКонтакте API, о чём и решил написать свой первый пост на Хабрахабре.

Подготовка


Для того, чтобы пользоваться API, нужно создать Standalone-приложение и получить токен, который понадобится для совершения запросов к API. Для запросов к API я использовал свой php класс, который можно взять тут (позже допишу туда примеры и комментарии).

Сам код


try {
    require_once "vk_api.class.php";
    
    $channels  = array(
        "http://habrahabr.ru/rss/best/",
        "http://lenta.ru/rss/news/science/soft",
        "http://lenta.ru/rss/news/science/gadget",
    );

    $vk_api    = new VkApi("{ACCESS_TOKEN}");
    /*
    -- Таблица для уже опубликованных новостей
    
    --
    -- Структура таблицы `published_links`
    --

    CREATE TABLE IF NOT EXISTS `published_links` (
      `link` varchar(128) NOT NULL,
      UNIQUE KEY `link` (`link`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    */
    $dbh       = new PDO("mysql:host=localhost;dbname={DB_NAME};charset=utf8", "{USER}", "{PASS}");

    foreach($channels as $channel) {

        $feed = simplexml_load_file($channel);

        foreach( $feed->channel->item as $item) {
            // Новости старше 24 часов не публикуем
            if( ( time() - strtotime($item->pubDate) ) > 60*60*24 ) {
                continue;
            }

            $sth = $dbh->prepare("SELECT EXISTS ( SELECT * FROM `published_links` WHERE `link` = ? ) ");
            $sth->execute(array($item->link));

            if(!$sth->fetch(PDO::FETCH_NUM)[0]) {

                $vk_api->api("wall.post", array( //http://vk.com/dev/wall.post
                    "owner_id"    => "-{GROUP_ID}", // Обязательно с минусом
                    "from_group"  => 1,
                    "attachments" => $item->link
                ));

                $sth = $dbh->prepare("INSERT INTO `published_links` (`link`) VALUES (?)");
                $sth->execute(array($item->link));

                // Останавливаем оба цикла, чтобы за 1 раз публиковалась только одна новость.
                break 2;
            }
        }

    }

    $dbh = null;

} catch (Exception $e) {
    print($e->getMessage());
}

Остаётся только добавить это всё в планировщик задач, например в Cron:
*/5 * * * * /usr/bin/php /home/aleki/vk/main.php

Каждые 5 минут будет публиковаться по одной новости.
Можно публиковать не только ссылки, но и, например, краткое описание, но стоит учесть, что у некоторых каналов есть HTML теги.

Вот так, посмотреть в действии можно здесь.
Код конечно не идеален, поэтому о всех ошибках и недостатках — пишите, поправлю.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.