PukiBot Pyとbot.inc.phpで遊んでみる

私が昔作ったPukiWiki用のボットAPI「bot.inc.php」とPython用フレームワーク「PukiBot Py」でページを自動で編集するボットを作ってみます。

https://pukiwiki.sourceforge.io/?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/bot.inc.php

上記のサイトからプラグインとフレームワークがダウンロードできます。ぜひ使ってみてください。

# 準備
※PythonやPukiWikiなどの導入はあらかじめしておいてください。ここでは記述しません。

1.&nbsp;以下のリンクからプラグイン`bot.inc.php`を入手し、PukiWikiの`plugin/`に入れておく 
- https://github.com/PTOM76/PukiWiki-Plugins/releases/download/bot-1.3/bot.inc.php

2.&nbsp;以下のリンクからPukiBot Pyをダウンロードする
- https://github.com/PTOM76/PukiBot-Py/archive/refs/tags/v1.0.zip

3.&nbsp;require.batまたは以下を実行してFlaskを入れる
```sh
pip install --upgrade pip
pip install Flask
```

4.&nbsp;bot.inc.php内のPLUGIN_BOT_ALLOW_TOKEN_LISTへトークンを設定する
   デフォルトではMDhEOTQ2MjE4NjJDRjAwRjdGNzhCNDlEQTgxN0RBMzkが設定されていますが、公開されているWikiでは利用しないでください。
```bot.inc.php
// トークンの指定、作成
define('PLUGIN_BOT_ALLOW_TOKEN_LIST', array("MDhEOTQ2MjE4NjJDRjAwRjdGNzhCNDlEQTgxN0RBMzk", "dG9tYXRvMTIzNDU2Nzg5MA"));

// ボット名設定 ("(TOKEN)" => (ボット名))
// こちらでユーザー認証をボットに適用されることもできます
define('PLUGIN_BOT_NAMES', array(
	'DEFAULT' => 'bot',
	'MDhEOTQ2MjE4NjJDRjAwRjdGNzhCNDlEQTgxN0RBMzk' => 'example_bot',
	'dG9tYXRvMTIzNDU2Nzg5MA' => 'tomato',
));

// パーミッション設定 ("(TOKEN)" => (パーミッション))
// パーミッションはplugin_bot_define_permissions関数を参照してください
plugin_bot_define_permissions();
define('PLUGIN_BOT_PERMISSIONS', array(
	"DEFAULT" => BOT_PERMISSION_DEFAULT,
	"MDhEOTQ2MjE4NjJDRjAwRjdGNzhCNDlEQTgxN0RBMzk" => BOT_PERMISSION_DEFAULT | BOT_PERMISSION_PAGE_EDIT,
    "dG9tYXRvMTIzNDU2Nzg5MA" => BOT_PERMISSION_ALL,
));
```
5.&nbsp;PLUGIN_BOT_PERMISSIONSで "設定したトークン" => BOT_PERMISSION_PAGE_EDIT,のようにボットに編集権限を付与する。
6.&nbsp;(公開しているウィキであれば)PLUGIN_BOT_ALLOW_TOKEN_LISTのMDhEOTQ2MjE4NjJDRjAwRjdGNzhCNDlEQTgxN0RBMzkを削除する

## ボットの権限一覧

| 権限名                         | 説明                           |
|--------------------------------|--------------------------------|
| **BOT_PERMISSION_NONE**        | なし                           |
| **BOT_PERMISSION_INFO**        | 情報取得                       |
| **BOT_PERMISSION_PAGE_READ**   | ページの読み取り               |
| **BOT_PERMISSION_PAGE_EDIT**   | ページの書き込み               |
| **BOT_PERMISSION_PAGE_LIST**   | ページ一覧の取得               |
| **BOT_PERMISSION_PAGE_CHECK**  | ページの存在チェック           |
| **BOT_PERMISSION_PAGE_SEARCH** | ページの検索                   |
| **BOT_PERMISSION_PAGE_TOTAL**  | 合計ページ数                   |
| **BOT_PERMISSION_PAGE_RAW**    | 読み取り / 書き込み           |
| **BOT_PERMISSION_PAGE_ALL**    | すべてのページ関連の権限     |
| **BOT_PERMISSION_PLUGIN_EXECUTE** | プラグインの実行             |
| **BOT_PERMISSION_PLUGIN_LIST** | プラグインの一覧取得           |
| **BOT_PERMISSION_PLUGIN_CHECK**| プラグインの存在チェック       |
| **BOT_PERMISSION_PLUGIN_TOTAL**| プラグインの合計               |
| **BOT_PERMISSION_PLUGIN_ALL**  | すべてのプラグイン関連の権限  |
| **BOT_PERMISSION_ATTACH_TOTAL**| 添付ファイルの合計             |
| **BOT_PERMISSION_ATTACH_ALL**  | すべての添付関連の権限       |
| **BOT_PERMISSION_BACKUP_READ** | 履歴の読み取り / 一覧         |
| **BOT_PERMISSION_BACKUP_TOTAL**| 履歴の合計                     |
| **BOT_PERMISSION_BACKUP_ALL**  | すべての履歴関連の権限        |
| **BOT_PERMISSION_DIFF_READ**   | 差分の読み取り                |
| **BOT_PERMISSION_DIFF_TOTAL**  | 差分の合計                     |
| **BOT_PERMISSION_DIFF_ALL**    | すべての差分関連の権限        |
| **BOT_PERMISSION_TOTAL_ALL**   | すべての合計関連の権限        |
| **BOT_PERMISSION_ALL**         | すべての権限                  |
| **BOT_PERMISSION_DEFAULT**     | デフォルト権限（書き込み、実行、検索以外） |

# 本題
※dG9tYXRvMTIzNDU2Nzg5MAをトークンとします。
まず、PukiWikiのURLとBotのトークンを設定しましょう。

```bot.py
from lib import pukibot

URL = "https://example.wiki/"      # PukiWikiのURL
TOKEN = 'dG9tYXRvMTIzNDU2Nzg5MA'   # Botのトークン

bot = pukibot.PukiBot(URL, TOKEN)
```

## ページの取得
```bot.py
from lib import pukibot

URL = "https://example.wiki/"
TOKEN = 'dG9tYXRvMTIzNDU2Nzg5MA'

bot = pukibot.PukiBot(URL, TOKEN)

# 「PukiWiki」というページ名のデータを取得
print(bot.getPage('PukiWiki'))
```

bot.getPage("ページ名")でページのデータを取得することができます。

bot.getPage('PukiWiki')では、
`https://pukiwiki.example.com/?cmd=bot&api=page&authorization=M25rbzEzYTIxNTIxMDM5Nzk&name=PukiWiki`
へ接続しています。

これにより以下のようなJSONのデータを取得できます。
```json
{
    "name": "PukiWiki",
    "source": "#freeze\n#nofollow\n#norelated\n* PukiWiki [#v1621880]\n\n- https:\/\/pukiwiki.osdn.jp\/\n- https:\/\/osdn.jp\/projects\/pukiwiki\/\n\nPukiWikiは Wiki([[WikiWikiWeb]]) と呼ばれているもののひとつで、基本的に誰でも全てのページを作成・編集することができます。\n\nまた、編集には特別な知識を要することなく、簡単なルールに従うだけで整形されたHTML文書を生成できます。\n\n- 漢字をサポートしています。日本語のページ名もOK！\n- 全てのデータはテキストファイルに保存されます\n- 定期的にバックアップが保存されるので、復旧も簡単\n- ページ単位の凍結なども可能です\n- URLを短く表現できる[[InterWiki]]をサポート\n- [[PHP]]で書かれています\n- ライセンスはGPL(( https:\/\/www.gnu.org\/licenses\/gpl.html ))です\n\n** リンク [#nf50e667]\n\n- [[PukiWiki-official:https:\/\/pukiwiki.osdn.jp\/]] からPukiWiki 公式サイトへ飛べます\n-- ご質問や御意見は、こちらへどうぞ。 :)\n\n- Pukiwiki-dev - https:\/\/pukiwiki.osdn.jp\/dev\/\n-- こちらはPukiWiki開発サイトです。PukiWiki開発サイトでは、次期バージョンの開発だけでなく、現行バージョンの1.4系や1.3系の修正、セキュリティfixが行なわれています。[[pukiwiki.dev:開発日記]]で日々の作業の内容が掲載されていますので、PukiWikiを運用されている方は目を通すようお願いします。\n\n- https:\/\/osdn.jp\/projects\/pukiwiki\/\n-- OSDN のプロジェクトサマリです。PukiWikiのダウンロードはこちらからどうぞ。\n\n** 関連ページ [#zf685513]\n\n#ls2\n- [[InterWikiName]] -- [[InterWiki]]のサーバリスト\n",
    "modified_unixtime": 1582433504,
    "modified_time": "",
    "author_username": "",
    "author_fullname": "",
    "editable": false,
    "freeze": true,
    "attaches": []
}
```

## ページの保存
- https://gist.github.com/PTOM76/c618a7ca97c7da3510970f7d0764a765

上記のGistで作成した「PukiBot Pyを使ってPukiWikiでSandBoxを自動で初期化するボットをつくってみる」です。

こちらは、24時になるとページが定期的に更新されるボットです。

ただ、savePageじゃなくてwritePageです。今さら、昔書いたGistが間違えていることに気付きました。

```bot.py
from lib import pukibot
import datetime
import time
import schedule

URL = "https://example.wiki/"
TOKEN = 'dG9tYXRvMTIzNDU2Nzg5MA'

bot = pukibot.PukiBot(URL, TOKEN)

def job():
　# ページの保存
  print(bot.writePage("SandBox", "[省略]"))

# 24時になると定期的にjob()を実行
schedule.every().day.at("00:00").do(job)

while True:
    schedule.run_pending()
    time.sleep(60)
```

ページの保存にはbot.writePage("ページ名", "内容")を利用します。

# 最後に
昔につくったbot apiとフレームワークですが、もしよければ使ってみてください