Получение на email комментариев из группы ВКонтакте

Дабы поддерживать диалог с подписчиками группы/паблика ВКонтакте и при этом не мониторить комментарии в группе, сделаем так, чтобы можно было получать их на электронную почту.

Если новых комментариев несколько, все они будут включены в одно письмо с указанием даты и времени, ссылки на публикацию или топик в группе и текста самого комментария.

Следующий скрипт выгребает со стены и топиков заданной группы ВКонтакте все комментарии и при обнаружении новых комментариев отправляет их на email.

<?php
function pism_elem($su) {
  if ($su == 'shapka') {
  	return '<!DOCTYPE html><html lang="ru-RU"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"/></head><body>';
  } elseif ($su == 'podval') {return '</body></html>';}
}

// выводит пришедшие комментарии
function vk_comm_pokaz($result,$link,$mass) {
  $itms2 = $result->items;
  $cn = count($itms2);
  for ($j=0; $j < $cn; $j++) {
	$dat = $itms2[$j]->date;
	$text = $itms2[$j]->text;
	$txt = date('Y-m-j H:i:s', $dat).' <a href="'.$link.'">'.$link.'</a>'.'<br>'.$text;
	$mass[] = array("data"=>$dat, "txt"=>$txt);
  }
  return $mass;
}

// получает все комментарии из поста стены
function vk_post($method, $link, $mass) {
$wall = file_get_contents($method);
$wall = json_decode($wall);
$result = $wall->response;
$cn = $result->count;
$mass = vk_comm_pokaz($result,$link,$mass);
$co = intval($cn/100);
for ($i=1; $i <= $co; $i++) {
  usleep(300000); // задержка скрипта на 0,3 секунды
  $xx = $i * 100;
  $wall = file_get_contents($method."&offset=".$xx);
  $wall = json_decode($wall);
  $result = $wall->response;
  $mass = vk_comm_pokaz($result,$link,$mass);
}
return $mass;
}

// отбирает посты с комментариями
function wall_posts($result, $wall_get_comment, $link, $mass) {
$itms = $result->items;
$cn = count($itms);
for ($i=0; $i < $cn; $i++) {
  $com = $itms[$i]->comments;
  $comc = $com->count;
  if ($comc > 0) {
  	$id = $itms[$i]->id; // id поста, в котором есть комментарии
  	$mass = vk_post($wall_get_comment."&post_id=".$id,$link.$id,$mass);
  }
}
return $mass;
}

// получает посты со стены
function vk_wall($wall_link, $wall_get, $wall_get_comment) {
$wall = file_get_contents($wall_get);
$wall = json_decode($wall);
$result = $wall->response;
$cn = $result->count;
$mass = wall_posts($result,$wall_get_comment,$wall_link,$mass);
$co = intval($cn/100);
for ($i=1; $i <= $co; $i++) {
  usleep(300000); // задержка скрипта на 0,3 секунды
  $xx = $i * 100;
  $wall = file_get_contents($wall_get."&offset=".$xx);
  $wall = json_decode($wall);
  $result = $wall->response;
  $mass = wall_posts($result,$wall_get_comment,$wall_link,$mass);
}
return $mass;
}

define('WP_USE_THEMES', false); // грузим ядро WordPress без его тем оформления
require_once($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
date_default_timezone_set('Europe/Moscow');
$ver = '5.101'; // версия API VK
$serv_key = 'XXXXXXXXXXXXXXX'; // Сервисный ключ доступа приложения
$wall_get_comment = "https://api.vk.com/method/wall.getComments?access_token=" . $serv_key . "&count=100&sort=desc&v=" . $ver . "&owner_id=-";
$wall_get = "https://api.vk.com/method/wall.get?access_token=" . $serv_key . "&count=100&v=" . $ver . "&owner_id=-";
$group = YYYYYYYY; // id группы ВКонтакте
$wall_get_comment1 = $wall_get_comment . $group;
$wall_get1 = $wall_get . $group;
$wall_link = "https://vk.com/fotodushi?w=wall-" . $group . "_"; // ссылка стены группы ВКонтакте
$mass = vk_wall($wall_link, $wall_get1, $wall_get_comment1);

$board_get_comment = "https://api.vk.com/method/board.getComments?group_id=" . $group . "&sort=desc&count=100&v=" . $ver;
$board_link = "https://vk.com/topic-" . $group . "_";

usleep(300000); // задержка скрипта на 0,3 секунды
$pid = ZZZZZZZZ; // id темы обсуждения №1
$mass = vk_post($board_get_comment."&topic_id=".$pid,$board_link.$pid,$mass);

usleep(300000); // задержка скрипта на 0,3 секунды
$pid = QQQQQQQQ; // id темы обсуждения №2
$mass = vk_post($board_get_comment."&topic_id=".$pid,$board_link.$pid,$mass);

rsort($mass);

$vk = file_get_contents('vk.txt'); // считаем файл, хранящий метку времени самого свежего комментария с момента последней проверки
$cn = count($mass);
$k = 0; $mv = 0;
for ($j=0; $j < $cn; $j++) {
  if (0+$mass[$j]['data'] > 0+$vk) {
	$k=$k+1;
	if ($k==1) {$rzd=''; $mv = 0 + $mass[$j]['data'];} else {$rzd='<br><br>';}
	$nk = $nk . $rzd . $mass[$j]['txt'];
  } else {break;}
}
// если появились новые комментарии, то запишем метку времени последнего комментария в файл vk.txt 
if ($mv > 0) {
  $fp = fopen('vk.txt', 'w');
  $test = fwrite($fp, $mv);
  fclose($fp);
}
// отправим письмо на email
if ($k > 0) {
  $eh2pok = pism_elem('shapka') . '<p>Поступил новый комментарий в группе ВКонтакте:</p><p>' . $nk . '</p>' . pism_elem('podval');
  $tema = 'Новый комментарий'; // тема сообщения
  $headers2[] = 'From: [SITE.RU] <otkuda@site.ru>';
  $headers2[] = 'Content-type: text/html; charset=utf-8';  
  $headers2[] = 'Precedence: bulk';
  wp_mail("kuda@site.ru", $tema, $eh2pok, $headers2); // отправить письмо нам
}
?>

Чтобы получить доступ к данным ВКонтакте в коде нужно заменить XXXXXXXXXXXXXXX на сервисный ключ доступа. Для этого нужно уже иметь или создать приложение ВКонтакте типа сайт здесь. Зайдя в настройки приложения находим там поле Сервисный ключ доступа. Также в коде меняем YYYYYYYY на id своей группы ВКонтакте. ZZZZZZZZ — на id темы обсуждения №1, а QQQQQQQQ — на id темы обсуждения №2. Количество тем обсуждения, за комментариями в которых необходимо следить, может быть любым, для этого нужно лишь размножить следующий кусок кода:

usleep(300000); // задержка скрипта на 0,3 секунды
$pid = ZZZZZZZZ; // id темы обсуждения №1
$mass = vk_post($board_get_comment."&topic_id=".$pid,$board_link.$pid,$mass);

В коде используется небольшая задержка PHP-скрипта перед каждым обращением к API ВКонтакте — это нужно чтобы не попасть под ограничение большого количества одновременных подключений с одного IP-адреса.

Чтобы понимать, какие комментарии считать свежими, используется файл vk.txt, который необходимо создать в той же директории, где находится скрипт. В файле, будет храниться метка времени самого свежего комментария с момента осуществления последней проверки.

В случае, если свежие комментарии появились, то они будут отправлены по email. Для отправки письма по email используется встроенная функция WordPress, почта отправляется с ящика otkuda@site.ru на ящик kuda@site.ru.

Осталось только на сервере дать задание cron, чтобы скрипт запускался в заданное время, например раз в полчаса, уведомляя о появлении новых комментариев в нашей группе ВКонтакте.

*/30 * * * * user /usr/bin/php /web/site.ru/www/vk_gr_comm.php >/dev/null 2>&1

Читайте все статьи из IT - Интернет технологии:

Поделиться статьей:  

Поделитесь своим мнением

Правила сообщений

Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Копирование материалов разрешено только с указанием источника и прямой индексируемой ссылкой на оригинал.
Яндекс.Метрика
© 2016 - 2019 Хороший отзыв · Лично · Разумно · Честно