А теперь хотим, чтобы бот оповещал о новых правках на сайте с MediaWiki. Идея такая же, как и с оповещениями для сайта на WordPress’е.

Что для этого нужно

Идём туда, где лежит наш сайт на MediaWiki (у меня версия 1.25.3), там заходим в каталог extensions и создаём внутри каталог hp2tb, например. В нём создаём такую структуру:

├── i18n
│   └── en.json
├── extension.json
├── hp2tb.json
├── hp2tb.php
└── hp2tb_body.php

На самом деле, нужны только эти два файла: extension.json и hp2tb_body.php.

extension.json:

{
    "name": "HTTP POST to Telegram bot",
    "author": "ТВАЁИМЯ",
    "url": "https://ТВОЙ.КРУТОЙ.САЙТ/",
    "description": "Sends a notification to Telegram about new change",
    "version": "0.1",
    "license-name": "GPLv3",
    "type": "other",
    "AutoloadClasses": {
        "HPtoTB": "hp2tb_body.php"
    },
    "Hooks": {
        "PageContentSaveComplete": [
            "HPtoTB::sendNotification"
        ]
    }
}

Здесь PageContentSaveComplete - это хук MediaWiki, срабатывающий каждый раз при сохранении любой правки - то, что нам и нужно - вешаем на него свою функцию в hp2tb_body.php:

<?php
class HPtoTB {
    public static function sendNotification( $article, $user, $content, $summary,
        $isMinor, $isWatch, $section, $flags, $revision, $status, $baseRevId ) {

        $token = "ТУТТВОЙТОКЕН";
        $chatID = "ТУТIDПОЛЬЗОВАТЕЛЯГРУППЫИЛИКАНАЛА";

        $link2article = "ТУТТВОЁДОМЕННОЕИМЯ" . "/index.php/Special:RecentChanges";
        $msg = "Новая правка на вичке!%0A%0A"
            . "*Пользователь*: " . $user . "%0A"
            . "*Статья*: " . $article->getTitle() . "%0A%0A"
            . $link2article;

        $ch = curl_init("https://api.telegram.org/bot" . $token . "/sendMessage?chat_id=" . $chatID . "&text=" . $msg . "&parse_mode=Markdown&disable_web_page_preview=true");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
        curl_exec($ch);
        curl_close ($ch);

        return true;
    }
}

И теперь осталось подключить это расширение в LocalSettings.php:

wfLoadExtension('hp2tb');

Теперь при каждой правке на сайте бот будет оповещать о ней заданный круг лиц. Если ресурс у вас активно правится ежедневно, то скорее всего потребуется настроить какие-то фильтры, например не уведомлять о правках зарегистрированных пользователей, а только об анонимных.

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

Все исходники здесь.


Обновления

2024-01-11 | Обновление до MediaWiki 1.41

После обновления MediaWiki с 1.25.3 до 1.41.0 расширение работать перестало. Судя по всему, это потому что хук PageContentSaveComplete был объявлен устаревшим, и вместо него теперь надо использовать PageSaveComplete. Более того, набор входных параметров тоже изменился, и таким образом вот что теперь будет в hp2tb_body.php:

class HPtoTB
{
    public static function sendNotification($wikiPage, $user, $summary, $flags, $revisionRecord, $editResult)
    {
        // ...
    }
}

соответственно, в extension.json значение Hooks тоже будет другое:

{
    "...": "...",
    "Hooks":
    {
        "PageSaveComplete":
        [
            "HPtoTB::sendNotification"
        ]
    },
    "...": "..."
}

Ну а раз уж мы всё равно обновляем расширение, давайте ещё тогда сделаем ему наконец-то нормальный конфиг, чтобы не хардкодить токен и ID чята прямо в коде. Для этого в extension.json надо добавить секцию config:

{
    "...": "...",
    "config":
    {
        "HPtoTBToken": { "value": "" },
        "HPtoTBChatID": { "value": "" }
    },
    "...": "..."
}

и в hp2tb_body.php такое:

public static function sendNotification($wikiPage, $user, $summary, $flags, $revisionRecord, $editResult)
{
    global $wgHPtoTBToken, $wgHPtoTBChatID; // from extension.json or LocalSettings.php

    $msg = "Новая правка на..."

    // кстати говоря, содержимое $msg желательно закодировать с помощью urlencode()
    $ch = curl_init("https://api.telegram.org/bot" . $wgHPtoTBToken . "/sendMessage?chat_id=" . $wgHPtoTBChatID . "&text=" . urlencode($msg) . "&parse_mode=Markdown&disable_web_page_preview=true");

    // ...

Теперь значения токена и ID чята можно задать или в extension.json, или в LocalSettings.php:

wfLoadExtension('hp2tb');
$wgHPtoTBToken = 'ТУТ-ТОКЕН-БОТА';
$wgHPtoTBChatID = 'А-ТУТ-ID-ЧЯТА';

Ещё, я так понял, важно указать в extension.json версию манифеста:

{
    "manifest_version": 2,
    "...": "..."
}

Коммит со всеми изменениями можно посмотреть здесь.