Вступление
Приветствую уважаемое Хабрасообщество! Не знаю на сколько давно, но в социальной сети ВКонтакте появилась возможность автопостинга 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 теги.
Вот так, посмотреть в действии можно здесь.
Код конечно не идеален, поэтому о всех ошибках и недостатках — пишите, поправлю.