Расширение MediaWiki для бота Telegram
А теперь хотим, чтобы бот оповещал о новых правках на сайте с 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,
"...": "..."
}
Коммит со всеми изменениями можно посмотреть здесь.
Social networks
Zuck: Just ask
Zuck: I have over 4,000 emails, pictures, addresses, SNS
smb: What? How'd you manage that one?
Zuck: People just submitted it.
Zuck: I don't know why.
Zuck: They "trust me"
Zuck: Dumb fucks