Extension:AbuseFilter/Rules format
Pravidla jsou vlastní jazyk. Jsou formátovány podobně jako podmíněné podmínky v jazyce podobném C/Java/Perlu.
Řetězce
Literál můžete zadat tak, že jej umístíte do jednoduchých nebo dvojitých uvozovek (pro řetězce), nebo jej napíšete tak, jak je (pro čísla s plovoucí desetinnou čárkou i celé číslo).
Můžete získat zalomení řádků s \n
, znaky tabulátoru s \t
a znak uvozovky můžete také escapovat zpětným lomítkem.
Pomocí symbolu +
(plus) zřetězí dva znakové řetězce nebo hodnoty dvou proměnných s řetězcem hodnoty.
- Příklady
"Toto je řetězec"
'Toto je také řetězec'
'Tento řetězec by neměl\t selhat'
"Tento řetězec\nMá zalomení řádku"
1234
1.234
-123
Uživatelsky definované proměnné
Pro snazší pochopení můžete definovat vlastní proměnné pomocí přiřazovacího symbolu :=
v řádku (uzavřeném ;
) v rámci podmínky.
Tyto proměnné mohou používat písmena, podtržítka a čísla (kromě prvního znaku) a nerozlišují malá a velká písmena.
Příklad (pro w:Special:AbuseFilter/79):
(
line1:="(\{\{(r|R)eflist|\{\{(r|R)efs|<references\s?/>|</references\s?>)";
rcount(line1, removed_lines)
) > (
rcount(line1, added_lines)
)
Pole
AbuseFilter má podporu pro neasociativní pole, která lze použít jako v následujících příkladech.
![]() | Výrazy jako page_namespace in [14, 15] nemusí fungovat podle očekávání. Tento bude vyhodnocen jako true také v případě, že page_namespace je 1, 4 nebo 5. Další informace a možná řešení naleznete v části T181024. |
my_array := [ 5, 6, 7, 10 ];
my_array[0] == 5
length(my_array) == 4
int( my_array ) === 4 // Stejná jako délka
float( my_array ) === 4.0 // Počítá prvky
string(my_array) == "5\n6\n7\n10\n" // Poznámka: Poslední zalomení řádku může být v budoucnu odstraněno
5 in my_array == true
'5' in my_array == true
'5\n6' in my_array == true // Poznámka: Toto je způsobeno tím, jak jsou pole přetypována na řetězec, tj. jejich implodováním pomocí zalomení řádků
1 in my_array == true // Poznámka: K tomu dochází, protože 'in' přenáší argumenty na řetězce, takže 1 je zachycena v '10' a vrací true.
my_array[] := 57; // Tím se přidá prvek na konec pole
my_array === [ 5, 6, 7, 10, 57 ]
my_array[2] := 42; // A to pro změnu prvku v poli
my_array === [ 5, 6, 42, 10, 57 ]
Komentáře
Komentáře můžete zadat pomocí následující syntaxe:
/* Toto je komentář */
Aritmetika
Základní aritmetické symboly můžete použít k aritmetice proměnných a literálů s následující syntaxí:
-
– odečte pravý operand od levého operandu.+
– přidá pravý operand k levému operandu.*
– vynásobí levý operand pravým operandem./
– vydělí levý operand pravým operandem.**
– zvýší levý operand na exponenciální mocninu určenou pravým operandem.%
– vrátí zbytek daný, když je levý operand dělen pravým operandem.
Typ vráceného výsledku je stejný, jaký by vrátilo PHP, pro které lze nalézt mnoho dokumentace online. Vyčerpávající příklady lze nalézt v tomto testu analyzátoru AF.
Příklad | Výsledek |
---|---|
1 + 1 |
2 |
2 * 2 |
4 |
1 / 2 |
0.5 |
9 ** 2 |
81 |
6 % 5 |
1 |
Booleovské operace
Shodovat se můžete tehdy a pouze tehdy, pokud jsou splněny všechny podmínky, jedna z mnoha podmínek nebo jedna a pouze jedna ze všech podmínek.
x | y
— OR – vrátí hodnotu true, pokud je splněna jedna nebo více podmínek.x & y
— AND – vrátí hodnotu true, pokud jsou splněny obě podmínky.x ^ y
— XOR – vrátí true, pokud je splněna jedna a pouze jedna ze dvou podmínek.!x
— NOT – vrátí true, pokud podmínka není pravdivá.
Příklady
Kód | Výsledek |
---|---|
1 | 1
|
true |
1 | 0
|
true |
0 | 0
|
false |
1 & 1
|
true |
1 & 0
|
false |
0 & 0
|
false |
1 ^ 1
|
false |
1 ^ 0
|
true |
0 ^ 0
|
false |
!1
|
false |
!0
|
true |
Jednoduchá přirovnání
proměnné můžete porovnat s jinými proměnnými a literaly s následujícími syntaxemi:
<
,>
– vrátí hodnotu true, pokud je levý operand menší než/větší než pravý operand. Pozor: Operandy jsou přetypovány do řetězců a, stejně jako v PHP,null < jakékoli číslo === true
anull > jakékoli číslo === false
.<=
,>=
– vrátí hodnotu true, pokud je levý operand menší nebo roven/větší nebo roven pravému operandu. Pozor: Operandy jsou přetypovány do řetězců a, stejně jako v PHP,null <= jakékoli číslo === true
anull >= jakékoli číslo === false
.==
(nebo=
),!=
– vr8t9 true, pokud se levý operand rovná/nerovná pravému operandu.===
,!==
– vrátí true, pokud je levý operand rovný/není se pravý operand A levý operand je stejný/není stejný datový typ pro pravý operand. .
Příklad | Výsledek |
---|---|
1 == 2 |
false |
1 <= 2 |
true |
1 >= 2 |
false |
1 != 2 |
true |
1 < 2 |
true |
1 > 2 |
false |
2 = 2 |
true |
'' == false |
true |
'' === false |
false |
1 == true |
true |
1 === true |
false |
['1','2','3'] == ['1','2','3'] |
true |
[1,2,3] === [1,2,3] |
true |
['1','2','3'] == [1,2,3] |
true |
['1','2','3'] === [1,2,3] |
false |
[1,1,''] == [true, true, false] |
true |
[] == false & [] == null |
true |
['1'] == '1' |
false[1] |
Vestavěné proměnné
Filtr zneužívání předává různé proměnné podle názvu do analyzátoru. K těmto proměnným lze přistupovat zadáním jejich názvu na místo, kde by fungoval literál. Proměnné přidružené ke každému požadavku můžete zobrazit v protokolu zneužití.
Proměnné z AbuseFilter
Vždy dostupné proměnné
![]() | Uživatelské proměnné jsou vždy k dispozici, kromě jednoho případu: vytvoření účtu, když tvůrce není přihlášen. Všechny proměnné začínající na user_ jsou ovlivněny kromě user_type . |
Popis | Název | Datový typ | Poznámky |
---|---|---|---|
Akce | action |
řetězec | Jedna z následujících: edit, move, createaccount, autocreateaccount, delete, upload[2], stashupload[3] |
Unix časové razítko změny | timestamp |
řetězec | int(timestamp) vám dává číslo, pomocí kterého můžete vypočítat datum, čas, den v týdnu atd. |
Databázový název wiki | wiki_name |
řetězec | Například toto je "enwiki" na anglické Wikipedii a "itwikiquote" na italské Wikiquote. |
Kód jazyka wiki | wiki_language |
řetězec | Například toto je "en" na anglické Wikipedii a "it" na italské Wikicitaci. Vícejazyčné wiki jako Commons, Meta a Wikidata se také budou hlásit jako "en". |
Počet uživatelových editací | user_editcount |
celé číslo/nula | Null pouze pro neregistrované uživatele. |
Uživatelské jméno (IP in case the user is not registered) | user_name |
řetězec | Pro akce "createaccount" a "autocreateaccount" použijte
accountname , chcete-li název vytvářeného účtu. |
Typ uživatelského účtu ($1) | user_type |
řetězec | Typ uživatele, který bude jeden z ip , temp (pokud uživatel používá dočasný účet ), named , external nebo unknown .
|
Čas, kdy byla ověřena e-mailová adresa | user_emailconfirm |
řetěz/nula | Ve formátu: RRRRMMDDHHMMSS. Null, pokud e-mail nebyl potvrzen. |
Stáří uživatelského účtu | user_age |
celé číslo | V sekundách. 0 pro neregistrované uživatele. |
Jestli je uživatel zablokovaný | user_blocked |
boolean | True pro zablokované registrované uživatele. Platí také pro úpravy z blokovaných IP adres, i když je editor registrovaným uživatelem, který není blokován. False jinak. To nerozlišuje mezi částečnými a celowebovými bloky.
|
Skupiny (včetně implicitních), do kterých uživatel patří | user_groups |
pole řetězců | Podívejte se na stránku Special:ListGroupRights |
Práva, která má uživatel | user_rights |
pole řetězců | Podívejte se na stránku Special:ListGroupRights. |
ID stránky | article_articleid |
celé číslo | (zastaralé) Použijte místo toho page_id .
|
ID stránky (lze zobrazit pomocí odkazu "informace o stránce" v postranním panelu) | page_id |
celé číslo | Toto je 0 pro nové stránky, ale je nespolehlivé při kontrole minulých přístupů. Pokud při kontrole minulých požadavků potřebujete přesný výsledek, použijte "page_age == 0" k identifikaci vytvoření nové stránky. (všimněte si však, že je pomalejší.) Tento problém byl opraven v 9369d08, sloučeno 11. září 2023. |
Jmenný prostor stránky | article_namespace |
celé číslo | (zastaralé) Místo ní používejte přímo page_namespace .
|
Jmenný prostor stránky | page_namespace |
celé číslo | odkazuje na index jmenného prostoru . Zkontrolujte jmenné prostory pomocí výrazů jako "page_namespace == 2" nebo "equals_to_any(page_namespace, 1, 3)" |
Stáří stránky (v sekundách) | page_age |
celé číslo | počet sekund od první úpravy (nebo 0 pro nové stránky). To je spolehlivé, ale bývá pomalé. Zvažte použití page_id , pokud nepotřebujete velkou přesnost.
|
Název stránky (bez jmenného prostoru) | article_text |
řetězec | (zastaralé) Místo ní používejte přímo page_title .
|
Název stránky (bez jmenného prostoru) | page_title |
řetězec | |
Úplný název stránky | article_prefixedtext |
řetězec | (zastaralé) Místo ní používejte přímo page_prefixedtitle .
|
Úplný název stránky | page_prefixedtitle |
řetězec | |
Úroveň zamčení stránky pro editaci | article_restrictions_edit |
řetězec | (zastaralé) Místo ní používejte přímo page_restrictions_edit .
|
Úroveň zamčení stránky pro editaci | page_restrictions_edit |
pole řetězců | |
Úroveň zamčení stránky pro přesun | article_restrictions_move |
řetězec | (zastaralé) Místo ní používejte přímo page_restrictions_move .
|
Úroveň zamčení stránky pro přesun | page_restrictions_move |
pole řetězců | |
Úroveň zamčení souboru pro načtení | article_restrictions_upload |
řetězec | (zastaralé) Místo ní používejte přímo page_restrictions_upload .
|
Úroveň zamčení souboru pro načtení | page_restrictions_upload |
pole řetězců | |
Úroveň zamčení stránky pro založení | article_restrictions_create |
řetězec | (zastaralé) Místo ní používejte přímo page_restrictions_create .
|
Úroveň zamčení stránky pro založení | page_restrictions_create |
pole řetězců | |
Posledních deset uživatelů, kteří editovali příslušnou stránku | article_recent_contributors |
array of strings | (zastaralé) Místo ní používejte přímo page_recent_contributors .
|
Posledních deset uživatelů, kteří editovali příslušnou stránku | page_recent_contributors |
pole řetězců | To bývá pomalé (viz #Výkon). Pokuste se dát podmínky s vyšší pravděpodobností vyhodnocení na false před tuto, abyste se vyhnuli zbytečnému spouštění dotazu. Tato hodnota je prázdná, pokud je uživatel jediným přispěvatelem na stránku (?) a skenuje pouze posledních 100 revizí |
První autor této stránky | article_first_contributor |
řetězec | (zastaralé) Místo ní používejte přímo page_first_contributor .
|
První autor této stránky | page_first_contributor |
řetězec | To bývá pomalé (viz #Výkon).[4] Pokuste se dát podmínky s vyšší pravděpodobností vyhodnocení na false před tuto, abyste se vyhnuli zbytečnému spouštění dotazu. |
Proměnné dostupné pro některé akce
Popis | Název | Datový typ | Poznámky |
---|---|---|---|
Shrnutí editace/zdůvodnění | summary |
řetězec | Souhrny automaticky vytvořené MediaWiki ("Nová sekce", "Vyprázdněná stránka" atd.) jsou vytvořeny poté, co filtr zkontroluje úpravy, takže se ve skutečnosti nikdy nezachytí, i když debugger ukazuje, že by měly. The variable contains whatever the user sees in the edit summary window, which may include MediaWiki preloaded section titles.[5] |
minor_edit |
Zakázáno a nastaveno na hodnotu false pro všechny položky v letech 2016 až 2018.[6] | ||
Původní zdrojový text stránky před editací | old_wikitext |
řetězec | Tato proměnná může být velmi velká. Pokud je to možné, zvažte použití removed_lines ke zlepšení výkonu.
|
Nový zdrojový text stránky po editaci | new_wikitext |
řetězec | Tato proměnná může být velmi velká. Pokud je to možné, zvažte použití added_lines ke zlepšení výkonu.
|
Unifikovaný diff změn způsobených editací | edit_diff |
řetězec | |
Unifikovaný rozdíl změn způsobených editací, po transformaci před uložením | edit_diff_pst |
řetězec | To bývá pomalé (viz #Výkon). Kontrola added_lines a removed_lines je pravděpodobně efektivnější.[7]
|
Nová velikost stránky | new_size |
celé číslo | |
Původní velikost stránky | old_size |
celé číslo | |
Změna velikosti způsobená editací | edit_delta |
celé číslo | |
Řádky přidané při editaci, po transformaci před uložením | added_lines_pst |
pole řetězců | Pokud je to možné, použijte added_lines , což je efektivnější.
|
Řádky přidané při editaci | added_lines |
pole řetězců | Zahrnuje všechny řádky v konečném rozdílu, které začínají + |
Řádky odstraněné při editaci | removed_lines |
pole řetězců | |
Všechny externí odkazy ve výsledném textu | all_links |
pole řetězců | To bývá pomalé (viz #Výkon). |
Odkazy na stránce před editací | old_links |
pole řetězců | To bývá pomalé (viz #Výkon). |
Všechny externí odkazy přidané při editaci | added_links |
pole řetězců | To bývá pomalé (viz #Výkon). Zvažte nejprve kontrolu proti added_lines , poté zkontrolujte added_links , aby bylo zpomaleno méně úprav. Toto se řídí pravidly MediaWiki pro externí odkazy . Do pole se přidávají pouze jedinečné odkazy. Změna odkazu se bude počítat jako 1 přidaný a 1 odstraněný odkaz.
|
Všechny externí odkazy odstraněné při editaci | removed_links |
pole řetězců | To bývá pomalé (viz #Výkon). Zvažte nejprve kontrolu proti removed_lines , poté zkontrolujte removed_links , aby bylo zpomaleno méně úprav. Toto se řídí pravidly MediaWiki pro externí odkazy . Do pole se přidávají pouze jedinečné odkazy. Změna odkazu se bude počítat jako 1 přidaný a 1 odstraněný odkaz.
|
Wikitext nové stránky po transformaci před uložením | new_pst |
řetězec | Tato proměnná může být velmi velká. |
Vygenerovaný HTML kód nové verze | new_html |
řetězec | Tato proměnná může být velmi velká. Pokud je to možné, zvažte použití added_lines ke zlepšení výkonu.
|
Nový text stránky zbavený formátování | new_text |
řetězec | Tato proměnná může být velmi velká. Pokud je to možné, zvažte použití added_lines ke zlepšení výkonu.
|
old_html |
Zakázáno z důvodu výkonu. | ||
old_text |
Zakázáno z důvodu výkonu. | ||
Čas od poslední úpravy stránky v sekundách ($1) | page_last_edit_age |
celé číslo nebo null |
null , když stránka neexistuje
|
SHA-1 otisk obsahu souboru | file_sha1 |
řetězec | [2] |
Velikost souboru v bajtech | file_size |
celé číslo | Velikost souboru v bajtech[2] |
Šířka souboru v pixelech | file_width |
celé číslo | Šířka v pixelech[2] |
Výška souboru v pixelech | file_height |
celé číslo | Výška v pixelech[2] |
Barevná hloubka souboru v bitech na barevný kanál | file_bits_per_channel |
celé číslo | Počet bitů na barevný kanál[2] |
MIME typ souboru | file_mime |
řetězec | Typ souboru MIME.[2] |
Typ obsahu tohoto souboru | file_mediatype |
řetězec | Typ média souboru.[8][2] |
ID stránky, na kterou se přesouvá | moved_to_articleid |
celé číslo | (zastaralé) Místo ní používejte přímo moved_to_id .
|
ID stránky, na kterou se přesouvá | moved_to_id |
celé číslo | |
Název, na který se stránka přesouvá | moved_to_text |
řetězec | (zastaralé) Místo ní používejte přímo moved_to_title .
|
Název, na který se stránka přesouvá | moved_to_title |
řetězec | |
Úplný název, na který se stránka přesouvá | moved_to_prefixedtext |
řetězec | (zastaralé) Místo ní používejte přímo moved_to_prefixedtitle .
|
Úplný název, na který se stránka přesouvá | moved_to_prefixedtitle |
řetězec | |
Jmenný prostor, do kterého se přesouvá | moved_to_namespace |
celé číslo | |
Stáří stránky, na kterou se přesunuje (v sekundách) | moved_to_age |
celé číslo | |
Time since last move destination page edit in seconds ($1) | moved_to_last_edit_age
|
celé číslo nebo null |
null , pokud cílová stránka neexistuje
|
Úroveň zamčení stránky, na kterou se přesouvá, pro editaci | moved_to_restrictions_edit |
pole řetězců | Stejně jako page_restrictions_edit , ale pro cíl přesunu.
|
Úroveň zamčení stránky, na kterou se přesouvá, pro přesun | moved_to_restrictions_move |
pole řetězců | Stejně jako page_restrictions_move , ale pro cíl přesunu.
|
Úroveň zamčení stránky, na kterou se přesouvá, pro načtení souboru | moved_to_restrictions_upload |
pole řetězců | Stejně jako page_restrictions_upload , ale pro cíl přesunu.
|
Úroveň zamčení stránky, na kterou se přesouvá, pro založení stránky | moved_to_restrictions_create |
pole řetězců | Stejně jako page_restrictions_create , ale pro cíl přesunu.
|
Posledních deset uživatelů, kteří editovali stránku, na kterou se přesouvá | moved_to_recent_contributors |
pole řetězců | Stejně jako page_recent_contributors , ale pro cíl přesunu.
|
První uživatel, který editoval stránku, na kterou se přesouvá | moved_to_first_contributor |
řetězec | Stejně jako page_first_contributor , ale pro cíl přesunu.
|
Původní jmenný prostor přesouvané stránky | moved_from_namespace |
celé číslo | |
Název přesouvané stránky | moved_from_text |
řetězec | (zastaralé) Místo ní používejte přímo moved_from_title .
|
Název přesouvané stránky | moved_from_title |
řetězec | |
Úplný název přesouvané stránky | moved_from_prefixedtext |
řetězec | (zastaralé) Místo ní používejte přímo moved_from_prefixedtitle .
|
Úplný název přesouvané stránky | moved_from_prefixedtitle |
řetězec | |
ID přesouvané stránky | moved_from_articleid |
celé číslo | (zastaralé) Místo ní používejte přímo moved_from_id .
|
ID přesouvané stránky | moved_from_id |
celé číslo | |
Stáří stránky, která se přesunuje (v sekundách) | moved_from_age |
celé číslo | |
Time since last move source page edit in seconds ($1) | moved_from_last_edit_age |
celé číslo | |
Úroveň zamčení přesouvané stránky pro editaci | moved_from_restrictions_edit |
pole řetězců | Stejné jako page_restrictions_edit , ale pro stránku, která se přesouvá.
|
Úroveň zamčení přesouvané stránky pro přesun | moved_from_restrictions_move |
pole řetězců | Stejné jako page_restrictions_move , ale pro stránku, která se přesouvá.
|
Úroveň zamčení přesouvané stránky pro načtení souboru | moved_from_restrictions_upload |
pole řetězců | Stejné jako page_restrictions_upload , ale pro stránku, která se přesouvá.
|
Úroveň zamčení přesouvané stránky pro založení stránky | moved_from_restrictions_create |
pole řetězců | Stejné jako page_restrictions_create , ale pro stránku, která se přesouvá.
|
Posledních deset uživatelů, kteří editovali přesouvanou stránku | moved_from_recent_contributors |
pole řetězců | Stejné jako page_recent_contributors , ale pro stránku, která se přesouvá.
|
První uživatel, který editoval přesouvanou stránku | moved_from_first_contributor |
řetězec | Stejné jako page_first_contributor , ale pro stránku, která se přesouvá.
|
Uživatelské jméno (při zakládání nového účtu) | accountname |
řetězec | |
Obsahový model staré revize | old_content_model
|
řetězec | Informace o změnách modelu obsahu naleznete v části Nápověda:ChangeContentModel |
Obsahový model nové revize | new_content_model
|
řetězec | Informace o změnách modelu obsahu naleznete v části Nápověda:ChangeContentModel |
Chráněné proměnné
Proměnnou lze považovat za chráněnou. Například na wiki s povolenými dočasnými účty jsou IP považovány za PII a přístup k nim musí být omezen.
Chráněné proměnné a filtry, které je používají, jsou přístupné pouze správcům s právem abusefilter-access-protected-vars
.
Použití chráněné proměnné označí filtr také jako chráněný.
Filtr následně nelze zrušit, i když již chráněnou proměnnou aktivně nepoužívá, protože jeho historické protokoly zůstanou dostupné.
Výchozí chráněné proměnné jsou definovány v AbuseFilterProtectedVariables
v extension.json
.
Popis | Název | Datový typ | Poznámky |
---|---|---|---|
IP adresa uživatelského účtu (pouze odhlášení a dočasné účty) ($1) | user_unnamed_ip
|
řetězec | IP uživatele pro anonymní uživatele/dočasné účty Toto vrátí
null pro registrované uživatele. |
Proměnné z jiných rozšíření
Popis | Název | Datový typ | Hodnoty | Přidáno |
---|---|---|---|---|
Globální skupiny, do kterých uživatel patří | global_user_groups
|
pole | CentralAuth | |
Globální počet editací uživatele | global_user_editcount
|
celé číslo | CentralAuth | |
Global groups that the user is in on account creation ($1) | global_account_groups
|
pole | Dostupné pouze v případě, že action je createaccount (pak je vždy prázdné) nebo autocreateaccount .
|
CentralAuth |
Global edit count of the user on account creation ($1) | global_account_editcount
|
celé číslo | Dostupné pouze v případě, že action je createaccount (pak je vždy nula) nebo autocreateaccount .
|
CentralAuth |
OAuth consumer used to perform this change ($1) | oauth_consumer
|
celé číslo | OAuth | |
ID Strukturované diskuse | board_articleid
|
celé číslo | (zastaralé) Místo ní používejte přímo board_id .
|
StructuredDiscussions |
ID Strukturované diskuse | board_id
|
celé číslo | StructuredDiscussions | |
Jmenný prostor Strukturované diskuse | board_namespace
|
celé číslo | odkazuje na index jmenného prostoru | StructuredDiscussions |
Název (bez jmenného prostoru) strukturovaného diskusního fóra | board_text
|
řetězec | (zastaralé) Místo ní používejte přímo board_title .
|
StructuredDiscussions |
Název (bez jmenného prostoru) strukturovaného diskusního fóra | board_title
|
řetězec | StructuredDiscussions | |
Úplný název Strukturované diskuse | board_prefixedtext
|
řetězec | (zastaralé) Místo ní používejte přímo board_prefixedtitle .
|
StructuredDiscussions |
Úplný název Strukturované diskuse | board_prefixedtitle
|
řetězec | StructuredDiscussions | |
Zdrojový text překladové jednotky | translate_source_text
|
řetězec | Translate | |
Target language for translation | translate_target_language
|
řetězec | Toto je kód jazyka, například en pro angličtinu.
|
Translate |
Zda byla tato editace provedena z výstupního uzlu sítě Tor | tor_exit_node
|
boolean | true, pokud akce pochází z výstupního uzlu toru. | TorBlock |
Zda uživatel edituje prostřednictvím mobilního rozhraní | user_mobile
|
boolean | true pro mobilní uživatele, jinak false. | MobileFrontend |
Zda uživatel edituje z mobilní aplikace | user_app
|
boolean | true, pokud uživatel provádí úpravy z mobilní aplikace, jinak false. | MobileApp |
Zobrazení stránky[1] | article_views
|
celé číslo | (zastaralé) Místo ní používejte přímo page_views .
|
HitCounters |
Zobrazení stránky[2] | page_views
|
celé číslo | počet zobrazení stránek | HitCounters |
Zobrazení zdrojové stránky[3] | moved_from_views
|
celé číslo | počet zobrazení zdrojové stránky | HitCounters |
Cílová zobrazení stránek[4] | moved_to_views
|
celé číslo | počet zobrazení cílové stránky | HitCounters |
Zda je IP adresa blokována pomocí seznamu stopforumspam.com[5] | sfs_blocked
|
boolean | Zda je IP adresa blokována pomocí seznamu stopforumspam.com | StopForumSpam |
Poznámky
Když je action='move'
, jsou k dispozici pouze proměnné summary
, action
, timestamp
a user_*
.
Proměnné page_*
jsou také k dispozici, ale předpona je nahrazena moved_from_
a moved_to_
, které představují hodnoty názvu článku původního a cílového.
Například moved_from_title
a moved_to_title
místo page_title
.
Od verze MediaWiki 1.28 (1 $) se action='upload'
používá pouze při publikování nahraného obsahu, nikoli pro nahrání do úschovy.
Zavádí se nový action='stashupload'
, který se používá pro všechna nahrávání, včetně nahrávání do zásobníku.
Chová se jako dřívější action='upload'
a poskytuje pouze proměnné metadat souboru (file_*
).
Proměnné související s úpravou stránky, včetně summary
, new_wikitext
a několika dalších, jsou nyní k dispozici na action='upload'
.
Pro každé nahrání souboru mohou být filtry volány s action='stashupload'
(pro nahrávání do zásobníku) a jsou vždy volány s action='upload'
. Nejsou voláni s action='edit'
.
Autoři filtrů by měli použít action='stashupload' | action='upload'
v kódu filtru, když lze soubor zkontrolovat pouze na základě obsahu souboru – například pro odmítnutí souborů s nízkým rozlišením – a action='upload'
pouze tehdy, když je třeba prozkoumat i wikitextové části úpravy – například, odmítnout soubory bez popisu.
To umožňuje nástrojům, které oddělují nahrávání souboru a publikování souboru (např. UploadWizard nebo upload dialog), informovat uživatele o selhání dříve, než stráví čas vyplňováním údajů o nahrávání.
Výkon
Jak je uvedeno v tabulce výše, některé z těchto proměnných mohou být velmi pomalé.
Při psaní filtrů mějte na paměti, že limit podmínky není dobrá metrika toho, jak těžké jsou filtry.
Například proměnné jako *_recent_contributors
nebo *_links
vždy potřebují k výpočtu DB dotaz, zatímco proměnné *_pst
budou muset provést analýzu textu, což je opět těžká operace; všechny tyto proměnné by měly být používány velmi, velmi opatrně.
Například na italské Wikipedii bylo pozorováno, že při 135 aktivních filtrech a průměrně 450 použitých podmínkách byla doba provedení filtrů kolem 500 ms, přičemž špičky dosahovaly 15 sekund.
Odstranění proměnné added_links
z jednoho filtru a snížení případů, kdy by jiný filtr použil added_lines_pst
, přineslo průměrnou dobu provádění na 50 ms.
Konkrétněji:
- Použijte proměnné
_links
, když potřebujete vysokou přesnost a kontrola "http://..." v jiných proměnných (napříkladadded_lines
) by mohla vést k vážným poruchám; - Proměnné
_pst
použijte, pokud jste si opravdu jisti, že proměnné jiné než PST nestačí. Můžete se také podmíněně rozhodnout, který z nich zkontrolovat: pokud například chcete prozkoumat podpis, nejprve zkontrolujte, zdaadded_lines
obsahuje~~~
; - Obecně platí, že když se zabýváme těmito proměnnými, je vždy mnohem lepší použít další podmínky, ale vyhnout se náročným výpočtům. Abyste toho dosáhli, vždy dávejte těžké proměnné jako poslední podmínky.
V neposlední řadě si uvědomte, že kdykoli je pro daný filtr vypočítána proměnná, bude uložena a jakýkoli jiný filtr ji okamžitě načte. To znamená, že jeden jediný filtr počítající tuto proměnnou se počítá víceméně jako desítky filtrů, které ji používají.
Klíčová slova
Pro často používané funkce jsou zahrnuta následující speciální klíčová slova:
like
(nebomatches
) vrátí true, pokud levý operand odpovídá globálnímu vzoru v pravém operandu.in
vrátí hodnotu true, pokud pravý operand (řetězec) obsahuje levý operand. Poznámka: Prázdné řetězce nejsou obsaženy ani neobsahují žádný jiný řetězec (ani prázdný řetězec samotný).contains
funguje jakoin
, ale s přepnutým levým a pravým operandem. Poznámka: Prázdné řetězce nejsou obsaženy ani neobsahují žádný jiný řetězec (ani prázdný řetězec samotný).rlike
(neboregex
) airlike
vrátí hodnotu true, pokud levý operand odpovídá (obsahuje) vzoru regulárního výrazu v pravém operandu (irlike
nerozlišuje malá a velká písmena) .if ... then ... end
if ... then ... else ... end
... ? ... : ...
true
,false
,null
Příklady
Kód | Výsledek | Poznámka |
---|---|---|
"1234" like "12?4"
|
True | |
"1234" like "12*"
|
True | |
"foo" in "foobar"
|
True | |
"foobar" contains "foo"
|
True | |
"o" in ["foo", "bar"]
|
True | Kvůli obsazení řetězce |
"foo" regex "\w+"
|
True | |
"a\b" regex "a\\\\b"
|
True | Chcete-li hledat zpětné lomítko escape znaku pomocí regulárního výrazu, musíte použít buď čtyři zpětná lomítka, nebo dvě \x5C . (Obě funguje dobře.)
|
"a\b" regex "a\x5C\x5Cb"
|
True |
Funkce
Pro usnadnění některých běžných problémů je zahrnuta řada vestavěných funkcí.
Jsou prováděny v obecném formátu functionName( arg1, arg2, arg3 )
a lze je použít místo libovolného literálu nebo proměnné.
Jeho argumenty mohou být uvedeny jako literály, proměnné nebo dokonce jiné funkce.
název | popis |
---|---|
lcase |
Vrátí argument převedený na malá písmena. |
ucase |
Vrátí argument převedený na velká písmena. |
length |
Vrátí délku řetězce zadaného jako argument. Pokud je argument pole, vrátí počet jeho prvků. |
string |
Přetypuje na datový typ řetězce. Pokud je argument pole, imploduje jej pomocí zalomení řádků. |
int |
Přetypuje na celočíselný datový typ. |
float |
Přetypuje na datový typ s plovoucí desetinnou čárkou. |
bool |
Přetypuje na booleovský datový typ. |
norm |
Ekvivalent rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1)))) .
|
ccnorm
|
Normalizuje zaměnitelné/podobné znaky v argumentu a vrací kanonický tvar. Seznam znaků a jejich náhrad lze nalézt na git, např. ccnorm( "Eeèéëēĕėęě3ƐƷ" ) === "EEEEEEEEEEEEE" .[9] Výstup této funkce je vždy velkým písmenem. I když tato funkce není náročná, není ani jednoduchá a při opakovaném volání by mohla filtr zpomalit.
|
ccnorm_contains_any
|
Normalizuje zaměnitelné/podobné znaky ve všech svých argumentech a vrací hodnotu true, pokud první řetězec obsahuje jakýkoli řetězec z následujících argumentů (neomezený počet argumentů, logický režim OR). Seznam znaků a jejich nahrazení lze nalézt na git. Kvůli použití ccnorm může být tato funkce pomalá, pokud je předáno příliš mnoho argumentů.
|
ccnorm_contains_all
|
Normalizuje zaměnitelné/podobné znaky ve všech svých argumentech a vrátí hodnotu true, pokud první řetězec obsahuje řetězec každý z následujících argumentů (neomezený počet argumentů, režim logického AND). Seznam znaků a jejich nahrazení lze nalézt na git. Kvůli použití ccnorm může být tato funkce pomalá, pokud je předáno příliš mnoho argumentů.
|
specialratio |
Vrátí počet nealfanumerických znaků vydělený celkovým počtem znaků v argumentu. |
rmspecials |
Odstraní všechny speciální znaky v argumentu a vrátí výsledek. Neodstraňuje mezery. (Ekvivalent s/[^\p{L}\p{N}\s]//g.) |
rmdoubles |
Odstraní opakované znaky v argumentu a vrátí výsledek. |
rmwhitespace |
Odstraní mezery (mezery, tabulátory, nové řádky). |
count |
Vrátí, kolikrát se jehla (první řetězec) objevila v kupce sena (druhý řetězec). Pokud je zadán pouze jeden argument, rozdělí jej čárkami a vrátí počet segmentů. |
rcount
|
Podobné jako count , ale jehla místo toho používá regulární výraz. Může být rozlišováno mezi malými a velkými písmeny tím, že necháte regulární výraz začínat "(?i)". Upozorňujeme, že pro prosté řetězce může být tato funkce až 50krát pomalejší než count [10], takže pokud je to možné, používejte tuto funkci.
|
get_matches
|
MW 1.31+ Hledá shody jehly regulárního výrazu (první řetězec) v kupce sena (druhý řetězec). Vrátí pole, kde prvek 0 je celá shoda a každý prvek [n] je shoda n'-té skupiny zachycení jehly. Může být rozlišováno mezi malými a velkými písmeny tím, že necháte regulární výraz začínat "(?i)". Pokud se zachytávací skupina neshoduje, pozice pole bude mít hodnotu false.
|
ip_in_range |
Vrátí hodnotu true, pokud IP (první řetězec) uživatele odpovídá zadanému rozsahu IP adres (druhý řetězec může být v CIDR notace, explicitní notaci jako "1.1.1.1-2.2.2.2" nebo jeden IP). Funguje pouze pro anonymní uživatele. Podporuje adresy IPv4 i IPv6. |
ip_in_ranges |
Vrátí true , pokud IP (první řetězec) uživatele odpovídá jakémukoli ze zadaných rozsahů IP (následující řetězce v režimu logického NEBO, může být v CIDR notace, explicitní zápis jako "1.1 .1.1-2.2.2.2" nebo jedna IP adresa). Funguje pouze pro anonymní uživatele. Podporuje adresy IPv4 i IPv6.
|
contains_any |
Vrátí hodnotu true, pokud první řetězec obsahuje řetězec any z následujících argumentů (neomezený počet argumentů v režimu logického OR). Pokud je prvním argumentem pole, přetypuje se na řetězec. |
contains_all |
Vrátí hodnotu true, pokud první řetězec obsahuje řetězec každý z následujících argumentů (neomezený počet argumentů v režimu logického AND). Pokud je prvním argumentem pole, přetypuje se na řetězec. |
equals_to_any |
Vrátí hodnotu true, pokud je první argument identický (=== ) s kterýmkoli z následujících (neomezený počet argumentů). V zásadě je equals_to_any(a, b, c) totéž jako a===b | a===c , ale je kompaktnější a šetří podmínky.
|
substr |
Vrátí část prvního řetězce pomocí posunu od druhého argumentu (začíná na 0) a maximální délky od třetího argumentu (volitelné). |
strlen |
Stejné jako length .
|
strpos
|
Vrátí číselnou pozici prvního výskytu jehly (druhý řetězec) v kupce sena (první řetězec), počínaje odsazením od třetího argumentu (volitelné, výchozí hodnota je 0). Tato funkce může vrátit 0, když je jehla nalezena na začátku kupky sena, takže může být jiným srovnávacím operátorem chybně interpretována jako hodnota false. Lepší způsob je použít === nebo !== pro testování, zda je nalezen. Differently from PHP's strpos(), which returns false when the needle is not found, this function returns -1 when the needle is not found.
|
str_replace |
Nahradí všechny výskyty hledaného řetězce náhradním řetězcem. Funkce přebírá 3 argumenty v následujícím pořadí: Text, ve kterém se má vyhledávat, text k nalezení, nahrazující text. |
str_replace_regexp |
Nahradí všechny výskyty hledaného řetězce náhradním řetězcem pomocí regulárních výrazů. Funkce přebírá 3 argumenty v následujícím pořadí: text, ve kterém se má vyhledávat, regulární výraz, který se má shodovat, nahrazující výraz. |
rescape |
Vrátí argument s některými znaky, kterým předchází znak escape "\", takže řetězec lze použít v regulárním výrazu, aniž by tyto znaky měly zvláštní význam. |
set |
Nastaví proměnnou (první řetězec) s danou hodnotou (druhý argument) pro další použití ve filtru. Další syntaxe: name := value .
|
set_var |
Stejné jako set .
|
Příklady
Kód | Výsledek | Poznámka |
---|---|---|
length( "Wikipedia" )
|
9 | |
lcase( "WikiPedia" )
|
wikipedia | |
ccnorm( "w1k1p3d14" )
|
WIKIPEDIA | ccnorm výstup je vždy velkými písmeny
|
ccnorm( "ωɨƙɩᑭƐƉ1α" )
|
WIKIPEDIA | |
ccnorm_contains_any( "w1k1p3d14", "wiKiP3D1A", "foo", "bar" )
|
true | |
ccnorm_contains_any( "w1k1p3d14", "foo", "bar", "baz" )
|
false | |
ccnorm_contains_any( "w1k1p3d14 is 4w3s0me", "bar", "baz", "some" )
|
true | |
ccnorm( "ìíîïĩїį!ľ₤ĺľḷĿ" )
|
IIIIIII!LLLLLL | |
norm( "!!ω..ɨ..ƙ..ɩ..ᑭᑭ..Ɛ.Ɖ@@1%%α!!" )
|
WIKIPEDAIA | |
norm( "F00 B@rr" )
|
FOBAR | norm odstraní mezery, speciální znaky a duplikáty a poté použije ccnorm
|
rmdoubles( "foobybboo" )
|
fobybo | |
specialratio( "Wikipedia!" )
|
0.1 | |
count( "foo", "foofooboofoo" )
|
3 | |
count( "foo,bar,baz" )
|
3 | |
rmspecials( "FOOBAR!!1" )
|
FOOBAR1 | |
rescape( "abc* (def)" )
|
abc\* \(def\) | |
str_replace( "foobarbaz", "bar", "-" )
|
foo-baz | |
str_replace_regexp( "foobarbaz", "(.)a(.)", "$2a$1" )
|
foorabzab | |
ip_in_range( "127.0.10.0", "127.0.0.0/12" )
|
true | |
ip_in_ranges( "127.0.10.0", "10.0.0.0/8", "127.0.0.0/12" )
|
true | |
contains_any( "foobar", "x", "y", "f" )
|
true | |
get_matches( "(foo?ba+r) is (so+ good)", "fobaaar is soooo good to eat" )
|
['fobaaar is soooo good', 'fobaaar', 'soooo good'] |
Pořadí operací
Operace se obecně provádějí zleva doprava, ale existuje pořadí, podle kterého se řeší. Jakmile filtr nevyhoví jedné z podmínek, přestane kontrolovat zbývající z nich (kvůli vyhodnocení zkratu) a přejde k dalšímu filtru. Pořadí hodnocení je:
- Vše v závorkách (
(
a)
) je vyhodnoceno jako jedna jednotka. - Převádění proměnných/literálů na jejich příslušná data. (např.
page_namespace
až 0) - Volání funkcí (
norm
,lcase
atd.) - Unární
+
a-
(definující kladnou nebo zápornou hodnotu, např.-1234
,+1234
) - Klíčová slova (
in
,rlike
atd.) - Booleovská inverze (
!x
) - Umocňování (
2**3 → 8
) - Související s násobením (násobení, dělení, modulování)
- Sčítání a odčítání (
3-2 → 1
) - Porovnání (
<
,>
,==
) - Booleovské operace (
&
,|
,^
) - Ternární operátor (
... ? ... : ...
) - Úkoly (
:=
)
Příklady
A & B | C
je ekvivalent(A & B) | C
, nikoliA & (B | C)
. Konkrétněfalse & true | true
afalse & false | true
se vyhodnotí jakotrue
.A | B & C
je ekvivalent(A | B) & C
, nikoliA | (B & C)
. Konkrétnětrue | true & false
atrue | false & false
se vyhodnotí jakofalse
.added_lines rlike "foo" + "|bar"
je špatně, použijte místo tohoadded_lines rlike ("foo" + "|bar")
.
Počítání podmínek
Limitem podmínky je (víceméně) sledování počtu porovnávacích operátorů + počtu zadaných volání funkcí.
Další vysvětlení, jak snížit použité podmínky, lze nalézt na Extension:AbuseFilter/Conditions .
Vyjímky
Přestože funkce prozkoumání AbuseFilter identifikuje akce "vrácení zpět" jako úpravy, AbuseFilter nevyhodnotí akce vrácení pro shodu.[11]
Užitečné odkazy
Poznámky pod čarou
- ↑ Porovnání polí s jinými typy vždy vrátí hodnotu false, s výjimkou příkladu výše
- ↑ 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Jediné proměnné, které jsou aktuálně dostupné pro nahrávání souborů (action='upload'), jsou user_*, page_*, file_sha1, file_size, file_mime, file_mediatype, file_width, file_height, file_bits_per_channel (posledních pět bylo přidáno teprve od vydání za MediaWiki 1.27 gerrit:281503). Všechny proměnné file_* nejsou dostupné pro jiné akce (včetně action='edit').
- ↑ Od MediaWiki 1.28 (gerrit:295254)
- ↑ Několik filtrů (12), které používají tuto proměnnou, se zobrazilo v řídicí panel AbuseFilterSlow Grafanak ( zobrazení vyžaduje přístup logstash). Zdálo se, že posunutí této proměnné ke konci filtru pomohlo.
- ↑ Podívejte se na phabricator:T191722
- ↑ Zastaralé s tímto potvrzením a zakázané s tímto.
- ↑ Některé filtry používající tuto proměnnou se zobrazily na řídicím panelu AbuseFilterSlow Grafana (příklad, vyžaduje přístup logstash). Například místo použití
"text" in edit_diff_pst
(nebo dokonceedit_diff
) zvažte něco jako"text" in added_lines & !("text" in removed_lines)
- ↑ Seznam typů viz zdrojový kód.
- ↑ Buďte si vědomi phab:T27619. Můžete použít Special:AbuseFilter/tools k vyhodnocení
ccnorm( "your string" )
, abyste viděli, které znaky jsou transformovány. - ↑ https://3v4l.org/S6IGP
- ↑ T24713 - rollback neodpovídá AF