Блокированное удаление пользователей

Как массово удалить спамеров, которые регистрируются на форумах для индексации поисковиками ссылок на их сайт ?

Жаль, что flowBB не позволяет модулировать доступ к информации о пользователях в соответствии с их стажем.

Первый ответ на спам очень прост: Спам уже становится бесполезным, если файл robots.txt запрещает поисковикам доступ к профилям:

disallow:/forum/profile.php
disallow:/forum/userlist.php

Затем время от времени нужно будет очистить базу данных от ненужных регистраций, все спамеры, чьи сообщения были стерты или не разместили сообщения.

Но это не так просто: между таблицами базы существуют множественные отношения и если удалить запись в одной из них, то нужно удалить и все ссылки на эту запись.

Таблицы flowBB и зарегистрированные участники

Итак, мы увидим все таблицы и столбцы, относящиеся к пользователям.

пользователи

id: идентификатор, сохраненный в других таблицах.
username: имя в других таблицах.
num_posts: количество сообщений.

изгнания

username: пользователя можно запретить, запись в bans тоже нужно удалить .

перенесения

reported_by: (id) для маловероятного случая, когда спамер сделал бы отчет.

подподписи

user_id: (id) в случае, если спамер согласился бы с этой нитью обсуждения .

Запрос на запрос

Из интерфейса PHPMyAdmin или любого другого интерфейса в SQL уже можно увидеть, сколько неактивных пользователей:

SELECT username FROM users WHERE num_posts='0' AND username != 'Guest'

Замените пользователей на xxxusers, если в конфигурации .php объявлен префикс xxxx.
Исключается Guest, который является общим именем гостей в английской версии. Это может быть другое имя в вашей версии, проверьте в списке пользователей для id 1.

На самом деле необходимо сохранить пользователя с идентификатором 1.

Просмотр пользователей без сообщений :

SELECT * FROM bans, users WHERE bans.username=users.username AND users.num_posts='0'

Другая формулировка, пригодная для исключения:

SELECT * FROM bans WHERE username IN (SELECT username FROM users WHERE num_posts='0')

Для удаления вместо SELECT * будет использоваться DELETE.

Запрос на удаление

Пользователи без сообщений удаляются с помощью этой команды SQL:

DELETE FROM $usertable WHERE num_posts='0' AND username != 'Guest'

Важно: Во франкоязычной версии заменить гостя на гостя. У него номер 1 .

Но сначала мы должны исключить ссылки:

DELETE FROM bans WHERE username IN (SELECT username FROM users WHERE num_posts='0')
DELETE FROM reports WHERE reported_by IN (SELECT id FROM users WHERE num_posts='0')
DELETE FROM subscriptions WHERE user_id IN (SELECT id FROM users WHERE num_posts='0')

Можно просто сначала проверить ссылки и сделать простое удаление, если их нет.

Создать сценарий

Во второй части представлен PHP-скрипт для размещения на сайте и выполнения операции автоматически.

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

Скрипт более сложен, чем простая команда SQL, так как будет тестировать таблицу сообщений, чтобы убедиться, что пользователь их не размещал, и не просто просматривать количество сообщений в таблице пользователей.
Последняя действительно не обновляется потоком BB после удаления билета. Это односторонний счетчик!

Больше таблиц flowBB

Помимо таблиц, описанных в первой части, на этот раз мы будем использовать таблицу сообщений.

Таблица сообщений:

  постер poster_id      
  ник пользователя его идентификационный номер      

Нужно только проверить, нет ли у пользователя билетов.

Таблица по теме:

  постер      
  ник пользователя      

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

Запрос

Повторяем запросы, данные в первой части, и добавляем обработку для таблицы сообщений.

Проверить количество сообщений для одного пользователя (мы проведем тест для всех пользователей на самом деле):

$user = "xxxx";  
$query = SELECT * WHERE  poster='$user'
$hnd = mysqli_query($db_handler, $query);
if(mysqli_num_rows($hnd) == 0)
{
  echo "$user n'a aucun message.<br>";
}

Если количество сообщений равно нулю, можно обновить количество билетов в таблице пользователей:

UPDATE users SET num_posts='0' WHERE poster='$user'

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

DELETE FROM bans WHERE username IN (SELECT username FROM users WHERE num_posts='0')
DELETE FROM reports WHERE reported_by IN (SELECT id FROM users WHERE num_posts='0')
DELETE FROM subscriptions WHERE user_id IN (SELECT user_id FROM users WHERE num_posts='0')
DELETE FROM users WHERE num_posts='0' AND id != '1'

Мы сохраняем запись 1 гостя «Гость» на английском языке, которая всегда должна присутствовать.

Сценарий удаления

include("config.php");

$hnd = mysqli_query($db_handler, "SELECT username FROM users");
while($userlist = mysqli_fetch_assoc($hnd))
{
  $user = $userlist['username'];
  $hndposts = mysqli_query($db_handler, "SELECT * FROM $posts WHERE poster='$user'");
  if(mysqli_num_rows($hndposts) == 0)
  {
       mysql_query("UPDATE users SET num_posts='0' WHERE username='$user'", $db_handler);
  }
}
mysql_query("DELETE FROM bans WHERE username IN (SELECT username FROM users WHERE num_posts='0')",  $db_handler);
mysql_query("DELETE FROM reports WHERE reported_by IN (SELECT id FROM users WHERE num_posts='0')",  $db_handler);
mysql_query("DELETE FROM subscriptions WHERE user_id IN (SELECT id FROM users WHERE num_posts='0')",  $db_handler);
mysql_query("DELETE FROM users WHERE num_posts='0' AND id != '1'",  $db_handler);

echo "Done!";

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

Загрузить и использовать

Для использования скрипта его помещают в корневой каталог flowBB и сразу вызывают файл из браузера.
Например:

http://www.monsiteweb.com/forum/killbill.php 

Ты можешь увидеть, что будет делать скрипт, не изменяя ничего, временно включив флаг DEBUG в исходном коде:

$DEBUG = true;   

Сценарий массового удаления пользователей flowBB

Файл называется killbill.php. Вы можете изменить это имя и дать ему произвольное имя.

Перед первым использованием необходимо выполнить резервное копирование базы данных с помощью команды экспорта PHPMyAdmin или функции панели администрирования.