最近、NapCatQQのWebUIが完成したことに気づいた。初心者向けに非常に適しているため、この記事を書くこととした。
本文では基本的な使い方のみを扱い、高度な機能は省略されている可能性がある。ただし、以下の基礎知識が必要である:コマンドライン、HTTPプロトコル、Docker、Python。完全な初心者ではないことを前提とする。(もしWebhookによる通知や既存のNoneBotプラグインを使用したいだけなら、Pythonプログラミングは不要である)。
使用するツールはNapCatQQとNoneBotである。前者はQQを実行し、OneBot11などのプロトコルに対応しており、後者はPythonでプロトコルを呼び出すフレームワークである。問題が発生した場合は公式ドキュメントを参照すること。(もしWebhookによる通知のみを使いたい場合、NapCatQQのセットアップだけで十分である)。
NapCatQQのインストール方法は多数あるが、サービスとして利用するのであれば、Dockerでシェル版を推奨する: https://napneko.github.io/guide/boot/Shell#napcat-docker-linux容器化部署 DockerコンテナにはNTQQ本体が含まれており、別途対応バージョンのQQをインストールする必要はない。
これにより、http://[IP]:6099/webui にアクセスすることでNTQQのWebページが表示される。ログインや設定が可能となる。ログインパスワードはログファイルを確認(デフォルトは:napcat)し、ログイン後はすぐに変更することを推奨する。
または、docker logs napcatでログを確認し、QRコードでログインすることも可能。
QRコードログインの際は、「次回からスマートフォン認証不要」をチェックすることを推奨する。
WebUIでネットワーク設定->新規作成->HTTPサーバーに移動し、名前、ホスト、ポートは自由に設定可能。メッセージ形式はArrayを推奨する。実際にテストしたところ、Stringにも対応しており、テキストと画像の混合メッセージ送信が可能。また、悪意のあるリクエストを防ぐためにTokenの記入を強く推奨する。
有効化後はインターフェースデバッグ->HTTPや、お好みのAPIテストツールでテストを行うことができる。APIの詳細は: https://napcat.apifox.cn/
Tokenの使用方法は以下の2通りがある:
Authorization: [Token]を追加する。?access_token=[Token]を追加する。ここでの最も重要なインターフェースは、プライベートメッセージの送信とグループメッセージの送信である。インターフェースデバッグ->HTTPで対応するAPIを見つけることができ、メッセージの構築機能もあるため、非常に簡単である。
以下にプライベートメッセージ送信の例を示す:

一部のアプリケーションはshoutrrrをWebhookの実装として使用している。以下の設定を参考にするとよい:
一部のアプリケーションはすでにOneBot11プロトコルをサポートしている場合があり、その場合はhttp://[IP]:3000、Token、およびターゲットQQ番号を入力すればよい。
ドメインを持っている場合、以下のNapCatQQのnginx設定例を参考にすることができる:
ドキュメントは非常に充実しており、ここでは繰り返さない。
QQはプラグインの使用を検知できるため、アカウントに以下の問題が発生する可能性がある:強制ログアウト、ログイン制限、凍結。 各ユーザーは自分の状況に応じて、この記事を参考にロボットを構築するかどうかを判断すること。著者はこの記事に基づいてロボットを構築したことによる一切の結果について責任を負わない。
docker run -d \
-v /data/napcat/QQdata:/app/.config/QQ \\ # QQデータディレクトリ
-v /data/napcat/logs:/app/napcat/logs \\ # ログディレクトリ
-v /data/napcat/config:/app/napcat/config \\ # 設定ディレクトリ
-v /etc/localtime:/etc/localtime:ro \\
--net=host \\ # hostネットワークを使用することを推奨。その後のNoneBotとの接続のために
--name napcat \
--restart=always \
mlikiowa/napcat-docker:latest
curl -X GET 'http://[IP]:3000/get_friend_list' -H 'Authorization: [Token]'
curl -X GET 'http://[IP]:3000/get_friend_list?access_token=[Token]'
curl -X POST 'http://[IP]:3000/send_private_msg' -H 'Content-Type: application/json' -H 'Authorization: [Token]' -d '{
"user_id": "[TargetQQ]",
"message": [
{
"type": "text",
"data": {
"text": "Hello World!"
}
},
{
"type": "face",
"data": {
"id": "63"
}
},
{
"type": "image",
"data": {
"file": "https://napneko.github.io/assets/newlogo.png"
}
}
]
}'
generic://[IP]:3000/send_private_msg?access_token=[Token]&template=json&titleKey=user_id&messageKey=message&@Content-Type=application/json&$user_id=[TargetQQ]
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name qq.example.cn;
access_log /var/log/nginx/access.qq.log;
error_log /var/log/nginx/error.qq.log;
location /webui {
proxy_pass http://127.0.0.1:6099$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /api {
proxy_pass http://127.0.0.1:6099$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /files {
proxy_pass http://127.0.0.1:6099$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
if ($request_method = POST) {
access_log /var/log/nginx/post.qq.log postdata;
}
proxy_pass http://127.0.0.1:3000$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}