↑の記事のpython版です。
@m77so 様の記事がわかりやすいかと思いますので、cloud functionを作るところまではそちらを参考にしてください。
cloud functionを作る
「関数の作成」を選択して、構成は任意で大丈夫です。
今回は例として
- 環境: 2世代
- 関数名: test
- リージョン: us-central1
にします。また、HTTPSに関しては「未承認の呼び出しを許可」します。
ランタイムはpython3.9で行いました。
import json
import functions_framework
from flask import abort
from flask import jsonify
from nacl.exceptions import BadSignatureError
from nacl.signing import VerifyKey
def validate_request(request):
verify_key = VerifyKey(bytes.fromhex(public_discord_key))
signature = request.headers["X-Signature-Ed25519"]
timestamp = request.headers["X-Signature-Timestamp"]
body = request.data.decode("utf-8")
try:
verify_key.verify(f"{timestamp}{body}".encode(), bytes.fromhex(signature))
except BadSignatureError:
return False
return True
@functions_framework.http
def handle_request(request):
is_valid = validate_request(request)
if not is_valid:
abort(401, "invalid request signature")
request_type = request.json["type"]
if request_type == 1:
return jsonify({"type": 1})
else:
message_id = request.json["data"]["id"]
print(f"message_id: {message_id}")
return jsonify(
{
"type": 4,
"data": {
"tts": False,
"content": "You use command!",
"embeds": [],
"allowed_mentions": {"parse": []},
},
}
)
上記の記事のほぼコピペです。pubsub関連の関数を削除しただけです。
最後に
「CloudFunction Discord Slash Python」みたいに検索したときに日本語の記事が出てこなかったので、メモ書きとして残しておきます。