sora32127 / healthy-person-emulator-dotorg

健常者エミュレータ事例集のレポジトリです
https://healthy-person-emulator.org/
GNU General Public License v3.0
15 stars 4 forks source link

機能要望:Discord新着通知機能 #45

Open la-png opened 6 months ago

la-png commented 6 months ago

Xの仕様変更により機能しなくなった新着通知機能の代替として、サイト側から直接Discordに投稿する機能が欲しいです。

具体的な手順 ・Discordの送信先チャンネルの設定画面を開き、(PC版なら)"連携サービス/ウェブフック/新しいウェブフック"に進む。 ・発言に使用したい名前とアイコンを設定し、"ウェブフックURLをコピー"を選択。 ・"https://discord.com/api/webhooks/<数字>/<英数字>"形式のURLが得られるので、非公開な場所に保存。これが流出すると該当チャンネルに無制限に連投などされ、送信者を特定できない。 ・上記URLにapplication/json形式で下記をPOSTする機能を、記事生成時に呼び出す。 { "content": "<記事URL>" } ・望むのであれば記事更新時にも同様の処理をする。URLの前後にテキストを追加しても良い。"\n"で改行を入れても良い。

la-png commented 6 months ago

最初の説明に漏れがありました。 ・urllibデフォルトUAだと拒否られるので、Pythonでやる場合は気をつけてください。 ・ボタンを添付する場合、Botで作成したURLでないと拒否られます。人間が作ったものは無効。

Discordサバの方でボタン付けたら良いんじゃない?という話になり、そこの説明までテキストでやることに限界を感じたため、サンプルコードを添付します。

import json
from urllib.request import Request, urlopen

webhook_url = 'https://discord.com/api/webhooks/xxxxx'

data = {
    "content": "これは送信テストです\nhttps://healthy-person-emulator.org/archives/26852",
    "components": [
        {
            "type": 1,
            "components": [
                {
                    "type": 2,
                    "style": 5,
                    "label": "𝕏",
                    "url": "https://twitter.com/intent/post?url=https%3A%2F%2Fhealthy-person-emulator.org%2Farchives%2F26852&text=%E8%A8%80%E8%91%89%E3%81%AF%E4%BA%BA%E6%A0%BC%E4%BF%AE%E6%AD%A3%E3%83%91%E3%83%83%E3%83%81%E3%81%A7%E3%81%82%E3%82%8B+%E5%81%A5%E5%B8%B8%E8%80%85%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E4%BA%8B%E4%BE%8B%E9%9B%86+&via=helthypersonemu"
                },  # 以下同様に、横に5つまでコピペで増やせる
                {
                    "type": 2,
                    "style": 5,
                    "label": "misskey",
                    "url": "https://misskeyshare.link/share.html?text=%E8%A8%80%E8%91%89%E3%81%AF%E4%BA%BA%E6%A0%BC%E4%BF%AE%E6%AD%A3%E3%83%91%E3%83%83%E3%83%81%E3%81%A7%E3%81%82%E3%82%8B+%E5%81%A5%E5%B8%B8%E8%80%85%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E4%BA%8B%E4%BE%8B%E9%9B%86+&url=https://healthy-person-emulator.org/archives/26852",
                    "emoji": {
                        "id": "1238053804503597066",
                        "name": "",
                        "animated": False
                    }  # サバ絵文字の追加も可能 Unicode絵文字だったら "name": "😀"だけの形式
                }
            ]
        },
        {  # こうすると縦に5つまで増やせる
            "type": 1,
            "components": [
                {
                    "type": 2,
                    "style": 5,
                    "label": "row2",
                    "url": "https://google.com"
                }
            ]
        }
    ]
}

def post_discord(webhook_url, data):
    headers = {
        "Content-Type": "application/json",
        "User-Agent": "_Python-urllib/3.12",
    }

    request = Request(
        webhook_url,
        data=json.dumps(data).encode(),
        headers=headers,
    )

    with urlopen(request) as response:
        response_body = response.read().decode("utf-8")
        print(response_body)

if __name__ == "__main__":
    post_discord(webhook_url, data)