Pull to refresh

Автопостинг 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 теги.

Вот так, посмотреть в действии можно здесь.
Код конечно не идеален, поэтому о всех ошибках и недостатках — пишите, поправлю.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.