In bulk pagina's verwijderen (MediaWiki)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

Wiki's worden nogal eens misbruikt voor spam-artikelen. Als dat kwaad is geschied, hoe verwijder je dan in bulk die spam-artikelen? Tot op heden heb ik geen extentie gevonden die dit kan op de manier die ik in gedachten heb. Daarnaast doe ik dit soort dingen toch al graag rechtstreeks op database-niveau.

Database-model

Tabel page is de esssentie van een artikel. Voorbeeld:

+---------+----------------+------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
| page_id | page_namespace | page_title | page_restrictions | page_is_redirect | page_is_new | page_random    | page_touched   | page_links_updated | page_latest | page_len | page_content_model | page_lang |
+---------+----------------+------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
|       1 |              0 | Main_Page  |                   |                0 |           0 | 0.466292306715 | 20160213141748 | 20160213141748     |           5 |      109 | wikitext           | NULL      |
|       2 |              0 | Test       |                   |                0 |           1 | 0.156450813014 | 20160213141732 | 20160213141732     |           4 |       25 | wikitext           | NULL      |
+---------+----------------+------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
2 rows in set (0.00 sec)

Kolom page_latest bevat foreign keys uit tabel revision. Voorbeeld:

mysql> select * from revision;
+--------+----------+-------------+-----------------------------------------------+----------+-------------------+----------------+----------------+-------------+---------+---------------+---------------------------------+-------------------+--------------------+
| rev_id | rev_page | rev_text_id | rev_comment                                   | rev_user | rev_user_text     | rev_timestamp  | rev_minor_edit | rev_deleted | rev_len | rev_parent_id | rev_sha1                        | rev_content_model | rev_content_format |
+--------+----------+-------------+-----------------------------------------------+----------+-------------------+----------------+----------------+-------------+---------+---------------+---------------------------------+-------------------+--------------------+
|      1 |        1 |           1 |                                               |        0 | MediaWiki default | 20160101005732 |              0 |           0 |     592 |             0 | glba3g2evzm40dqnqxegze66eqibkvb | NULL              | NULL               |
|      2 |        1 |           2 |                                               |        0 | 127.0.0.1         | 20160101011300 |              0 |           0 |      63 |             1 | ivu5fi6fmtakex5dkb97vxdfhafuxvr | NULL              | NULL               |
|      3 |        1 |           3 |                                               |        0 | 127.0.0.1         | 20160213141718 |              0 |           0 |      80 |             2 | 46pf638olnd9sj6k1obe2ozzaaqlj2g | NULL              | NULL               |
|      4 |        2 |           4 | Created page with "En dit is een testpagina!" |        0 | 127.0.0.1         | 20160213141732 |              0 |           0 |      25 |             0 | 6zp2f3tlopkgswleti9boxxrhyea8vf | NULL              | NULL               |
|      5 |        1 |           5 |                                               |        0 | 127.0.0.1         | 20160213141748 |              0 |           0 |     109 |             3 | sxb6701qcle5mhphy8v76e1y767n7y1 | NULL              | NULL               |
+--------+----------+-------------+-----------------------------------------------+----------+-------------------+----------------+----------------+-------------+---------+---------------+---------------------------------+-------------------+--------------------+
5 rows in set (0.00 sec)

En helemaal handig: Beide tabellen bevatten de primaire sleutel van de artikelen:

* Tabel page     - page_id
* Tabel revision - rev_id

Als je deze hebt (bv. opgeslagen in een tijdelijke tabel), dan kun je in één moeite alle ongewenste artikelen & revisies verwijderen.

Oplossing

-- =========================================================================
-- Join om alle ongewenste pagina's te selecteren
-- =========================================================================
-- In dit geval alle pagina's van gebruikers met id>2
--
select page_id, page_title, page_touched, revision.rev_comment, revision.rev_user 
from page join revision
on page.page_latest = revision.rev_id
where revision.rev_user>2;

-- =========================================================================
-- Sla id's van ongewenste pagina's/revisies op in tijdelijke tabel 'pageid'
-- =========================================================================
--
create temporary table pageid
select page_id
from page join revision
on page.page_latest = revision.rev_id
where revision.rev_user>2;

-- ===========================================================
-- Verificatie: Alle ongewenste records in tabel 'page'
-- ===========================================================
--
select page.page_id, page_title, page_touched
from page 
join pageid on page.page_id = pageid.page_id;

-- ===========================================================
-- Verificatie: Alle ongewenste records in tabel 'revision'
-- ===========================================================
--
select *
from revision
join pageid on pageid.page_id = revision.rev_page;

-- ===========================================================
-- Alle ongewenste revisies verwijderen
-- ===========================================================
-- Eerst onderstaande regels un-commenten
--
-- delete revision
-- from revision
-- join pageid
-- on pageid.page_id = revision.rev_page
-- where revision.rev_page = pageid.page_id;

-- ===========================================================
-- Alle ongewenste artikelen verwijderen
-- ===========================================================
-- Eerst onderstaande regels un-commenten
--
-- delete page
-- from page
-- join pageid
-- on pageid.page_id = page.page_id
-- where pageid.page_id = page.page_id

-- ===========================================================
-- Eindresultaat
-- ===========================================================
--
select * from page;

Bronnen