Скрипт php для вконтакта — авто удаление спама со стены по api callback
Добрый день, замучил меня спам в группе вконтакте, пишут и пишут на стену разную ерунду а встроенный функционал спама реагирует только на комментарии и посты не фильтрует.
Решил написать на php простенький скрипт для вконтакта: автоматическое удаление спама (постов) со стены группы по api callback
Для работы скрипта нужно:
- создать файл рядом со скриптом log.inc
- получить ключ api callback в настройках группы ($confirmation_token)
- получить ключ профиля — администратора группы, для удаления постов ($token_2)
- настроить, пользоваться.
Получить ключ api callback от группы:
Заходим в настройки группы > Работы с API > Ключи доступа > Создать ключ
Получить access_token от своего аккаунта вконтакте не так сложно:
Вам нужно создать Standalone-приложение. С другими работать не будет.
После — переходите по ссылке
https://oauth.vk.com/authorize?client_id=ИД_ВАШЕГО_ПРИЛОЖЕНИЯ&scope=notify,friends,photos,offline,wall&redirect_uri=blank.html&display=popup&response_type=token
После этого копируете из адресной строки token (находится между access_token= и &expires_in)
Скрипт работает так: в группу посетитель пишет пост > событие о том что появился пост с его индефикатором и текстом уходит на адрес скрипта по callback api > скрипт принимает параметры и ищет в тексте запрещенные фразы, если нашел > по api вконтакту с использованием токена аккаунта администратора группы удаляем данный пост.
Сам код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
<?php //set_time_limit(10800); //Header('Content-Type: text/html; charset=utf-8'); $cache_file_log="log.inc"; $today = date("H:i:s d-m-Y"); $log_text = "$today proverka"; if (!isset($_REQUEST)) { return; } //Строка для подтверждения адреса сервера из настроек Callback API $confirmation_token = '12345678'; //Получаем и декодируем уведомление $data = json_decode(file_get_contents('php://input')); //Проверяем, что находится в поле "type" switch ($data->type) { //Если это уведомление для подтверждения адреса сервера... case 'confirmation': //...отправляем строку для подтверждения адреса echo $confirmation_token; $log_text = "$today confirmation"; break; //Если это уведомление о новом сообщении на стене... case 'wall_post_new': //...получаем id его автора $user_id = $data->object->from_id; $id_post = $data->object->id; $text_post = $data->object->text; //затем с помощью users.get получаем данные об авторе //$user_info = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$user_id}&v=5.0")); //и извлекаем из ответа его имя //$user_name = $user_info->response[0]->first_name; //заисываем лог $log_text = "$today new message wall - $user_id, $id_post, $text_post"; //проверяем есть ли плохое слово в тексте и если есть то удаляем пост $bad_word = "секс,порно,размером,безoткaзный,paзвеcти,тeлочкy,мeтод,пeнис,оргазм,нaсилуeт,постоянного партнера,имeть,развратная,чпокнул,встречусь с симпатичным,любовника,очень хочется,повиртим,трах,пенис,член,ceкc,сeкc,куни,cекc,члeн,cекс"; $bad_word_massiv = explode(",", $bad_word); $bad_word_count=count($bad_word_massiv); $text_post = mb_strtolower($text_post, 'UTF-8'); $nashli_plohoe_slovo = ""; for($i=0;$i<$bad_word_count;$i++) { if ( strstr($text_post, $bad_word_massiv[$i]) ) {$nashli_plohoe_slovo="1";} } //если длина поста меньше 6 символов if ( strlen(utf8_decode($text_post))<6 ) {$nashli_plohoe_slovo="1";} if ($nashli_plohoe_slovo=="1") { //echo "нашли плохое слово"; //Ключ доступа сообщества $token_2 = 'gjfbif5dc887328d4d5d12dgujr9828c5cae6378bc1265416c725d506514744f434a8e6tyhnf56c35ebda'; $gruppa_id="-1234567"; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'owner_id' => $gruppa_id, 'post_id' => $id_post, 'access_token' => $token_2, 'v' => '5.0' ); $get_params = http_build_query($request_params); $ch = curl_init( 'https://api.vk.com/method/wall.delete?'. $get_params ); curl_setopt ( $ch, CURLOPT_HEADER, false ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false ); //curl_setopt ( $ch, CURLOPT_POST, true ); //curl_setopt ( $ch, CURLOPT_POSTFIELDS, $params ); $data = curl_exec($ch); curl_close($ch); //echo $data; $log_text = "$today new message wall - $user_id, $id_post, $text_post - плохое, удаляем"; } //if ( strstr($text_post, $bad_word) ) {echo "нашли плохое слово";} else {echo "не нашли";} //Возвращаем "ok" серверу Callback API echo('ok'); break; } //записываем лог $fp=fopen("$cache_file_log","a"); fwrite($fp, "\r\n" . "$log_text"); fclose($fp); ?> |
Сделал дополнение, которое проверяет на репост заданной записи, если нет репоста то пишется комментарий от имени группы к посту пользователя а потом через 9 секунд пост пользователя удаляется. Код тут — https://pastebin.com/KjbTd1kz
Возможно сделать удаление постов тех, кто не вступил в группу?
Да, добавить функцию с проверкой что человек в группе (используя api вконтакте) и если нету его то удалять.
Все сделал, залил на хостинг, пишет в логах «new message wall — 51180181, 267357, 1 — плохое, удаляем», по факту не удаляет. Пробовал токен из приложения VKAPI, токен из группы, всё равно не удаляет.
Ещё исправь, что $confirmation_token = ’12345678′; брать из вкладки «настройки сервера», а то долго мучался с этим)
Вот этот код отвечает за удаление сообщения со стены:
$token_2 = 'gjfbif5dc887328d4d5d12dgujr9828c5cae6378bc1265416c725d506514744f434a8e6tyhnf56c35ebda';
$gruppa_id="-1234567";
//С помощью messages.send и токена сообщества отправляем ответное сообщение
$request_params = array(
'owner_id' => $gruppa_id,
'post_id' => $id_post,
'access_token' => $token_2,
'v' => '5.0'
);
$get_params = http_build_query($request_params);
$ch = curl_init( 'https://api.vk.com/method/wall.delete?'. $get_params );
curl_setopt ( $ch, CURLOPT_HEADER, false );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
//curl_setopt ( $ch, CURLOPT_POST, true );
//curl_setopt ( $ch, CURLOPT_POSTFIELDS, $params );
$data = curl_exec($ch);
curl_close($ch);
//echo $data;
Попробуйте вручную вбить номер группы (с минусом), номер поста и расскоментировать echo $data дата и посмотреть что выдает вконтакт.
Код удобно тестировать на сайте пхпфидле.орг