Mediawiki rollback bot(Mass撤消巨魔行动!)

时间:2010-12-22 00:28:21

标签: php mediawiki

我想回滚某个IP地址已编辑的每个页面,并删除他们所做的任何页面。

如何使用机器人或插件甚至默认功能来执行此操作?我找到了机器人文档(here),但是无法找到任何源代码来获取用户贡献并回滚。

感谢您的帮助!这应该最好是PHP。

5 个答案:

答案 0 :(得分:2)

我们遇到了同样的问题,最后我创建了一个SQL脚本。看这里。我只尝试了两次,它对我有用。以下是脚本的链接。

http://www.gc-k.org/index.php/Cleaning_up_after_Vandals_%28Media_Wiki_Mass_Rollback%29

这是脚本本身。 在使用之前更改数据库属性。第一个命令行参数应该是用户的名称或IP。

echo off
clear
USER=$1
DB_USR=XXX
DB_PWD=XXX
DB_NAME=XXX

echo "For all pages affected by $USER activities set  last revision to the last untouched one"
mysql $DB_NAME --user=$DB_USR --password=$DB_PWD  --execute="update page p set p.page_latest=( SELECT max(r.rev_id) FROM revision r WHERE r.rev_page=p.page_id and r.rev_user_text!='$USER' ) where p.page_id in (select distinct  r2.rev_page from revision r2 where r2.rev_user_text='$USER')"

echo "For all pages make sure that page len is set equal to revision len"
mysql $DB_NAME --user=$DB_USR --password=$DB_PWD  --execute="update page p set p.page_len=( SELECT r.rev_len FROM revision r WHERE r.rev_page=p.page_id and r.rev_id=p.page_latest )"

echo "Delete revisions done by $USER"
mysql $DB_NAME --user=$DB_USR --password=$DB_PWD --execute="delete from revision where rev_user_text='$USER'"

echo Delete $USER from the recent changes
mysql $DB_NAME --user=$DB_USR --password=$DB_PWD --execute="delete from recentchanges where rc_user_text='$USER'"

# Optional - clear cache
# mysql $DB_NAME --user=$DB_USR --password=$DB_PWD --execute="delete FROM `objectcache`"
# mysql $DB_NAME --user=$DB_USR --password=$DB_PWD --execute="delete FROM `querycache`"
# mysql $DB_NAME --user=$DB_USR --password=$DB_PWD --execute="delete FROM `querycachetwo`"

运行脚本后,您必须在浏览器中重新加载页面时按住SHIFT键。否则将呈现缓存版本,您将不会注意到实际发生了回滚。

答案 1 :(得分:2)

显式编写Extension:Nuke以删除给定用户一次创建的所有页面。

我认为没有工具可以删除或恢复一个用户所做的所有贡献,但只需点击一下就可以编辑rollback个脚本。另请参阅Manual:Combating vandalism

答案 2 :(得分:1)

根据Stan Sokolov的SQL查询,我设法在我的wiki中清理了一个可怕的混乱 - 我没有监视它半年,它充满了垃圾邮件。 我必须从特定日期开始清​​理它。

如果您打算尝试相同,请先备份 - 这些SQL查询可能会破坏您的wiki,杀死小猫并导致怀孕。

在此示例中,“tr_”是我的前缀,“189”是最后一个好的页面ID,“41”是最后一个好用户ID,“20130215152547”是第一个垃圾邮件输入日期。

#Update page state to last good before the date
UPDATE tr_page p SET p.page_latest=( SELECT MAX(r.rev_id) FROM tr_revision r 
WHERE r.rev_page=p.page_id 
AND rev_timestamp <20130215152547) WHERE p.page_id IN 
(SELECT  r2.rev_page FROM tr_revision r2 WHERE rev_timestamp >=20130215152547);

#Update page length to match actual
UPDATE tr_page p SET p.page_len=( SELECT r.rev_len FROM tr_revision r WHERE
r.rev_page=p.page_id AND r.rev_id=p.page_latest );

#Clean up spam revisions

DELETE FROM tr_revision WHERE rev_timestamp >=20130215152547;

#Clear recent changes

DELETE FROM tr_recentchanges WHERE rc_timestamp >=20130215152547;

#Block all new bad users from ever entering wiki with this login
UPDATE tr_user SET
  user_password    = '',
  user_newpassword = '',
  user_email       = '',
  user_token       = ''
WHERE user_id>41;

#Delete pages, staring from the last good id
DELETE FROM tr_page WHERE page_id>189;

#Also, you will need TO clean TABLE tr_pagelinks.
#You will have to do it manually. It's easy, use some editor
#like PHPMyAdmin or SQLyog

#Clean cache

DELETE FROM `tr_objectcache`;
DELETE FROM `tr_querycache`;
DELETE FROM `tr_querycachetwo`;

答案 3 :(得分:0)

你可以明确地pywikipediabot做到这一点,不应该太难。

答案 4 :(得分:0)

如果您不想为机器人编写代码,可以使用Navigation Popups,它只需一次点击破坏版,就可以快速恢复50次编辑。