파이썬에서 Discord webhook에 메시지를 게시하는 비망록

최근 RaspberryPi에서 파이썬을 실행하고 Discord에 메시지를 게시합니다 ...
같은 것을 초콜릿 초코 만들고 있는데 매번 매번 망설인다.
고민하고 싶은 것은 거기가 아니다.

공식 제대로 읽을 수 있어 이야기입니다만, 샘플 거의 실려 있지 않으므로 비망록.

참고



Discord에 Webhook에 다양한 게시
Webhook Resource
파일
Visualizer and validator for Discord embeds.
Videos in Rich Embeds

소재



python3:3.7.3
json: 2.0.9
requests: 2.21.0
첨부 파일 샘플로 : 브랜드 가이드라인

메시지만


import json
import requests

WEBHOOK_URL = "うえぶふっくURL?wait=true"

payload = {
    "username"      : "メッセージ",
    "content"       : "だけだよ。",
    "avatar_url"    : "https://github.com/qiita.png",
}

### メッセージだけ
res = requests.post( WEBHOOK_URL, json=payload )
print( res.status_code )
print( json.dumps( json.loads(res.content), indent=4, ensure_ascii=False ) )
application/json , json 지정하기만 하면 됩니다.
webohook URL 에 ?wait=true 을 붙여 주면 content 돌려준다. 붙이지 않으면 status_code 가 204, content 돌아오지 않는다.
채널 아래의 스레드에 투하하고 싶다면 thread_id도 붙여 준다. 아카이브 된 스레드는 자동으로 아카이브 해제 해주는 것 같다.
스레드 ID를 얻으려면 "사용자 설정"→ "앱 설정"→ "고급 설정"에서 "개발자 모드"를 켜면 표시되는 "ID 복사"메뉴에서 복사하는 것이 빠릅니다. .
각각 WebhookURL에 연결하면 이런 느낌.https://discord.com/api/webhooks/{webhookID}/{webhookトークン}?wait=true&thread_id={スレッドID}

첨부파일만


import json
import requests

WEBHOOK_URL = "うえぶふっくURL?wait=true"

### 画像添付
with open("favicon.png", 'rb') as f:
    file_bin = f.read()
files_qiita = {
    "favicon" : ( "favicon.png", file_bin),
}
res = requests.post( WEBHOOK_URL, files = files_qiita )
print( res.status_code )
print( json.dumps( json.loads(res.content), indent=4, ensure_ascii=False ) )
multipart/form-data , 바이너리 read하고 files 에 지정할 뿐.wait 붙지 않아도 content 돌아온다.

메시지 + embed + 첨부 파일


import json
import requests

WEBHOOK_URL = "うえぶふっくURL?wait=true"

payload2 = {
    "payload_json" : {
        "username"      :"メッセージと、",
        "content"       :"添付ファイルと、",
        "avatar_url"    : "https://github.com/qiita.png",
        "embeds": [
            {
                "title"         : "payload_json",
                "description"   : "embedsそのまま使うと怒られる。代わりにpayload_jsonに全部ぶち込んで文字列にdumpしたら良さげ。ensure_ascii=False 無くても多分大丈夫。",
                "url"           : "https://birdie0.github.io/discord-webhooks-guide/structure/file.html",
                "timestamp"     : "2020-08-22T15:18:00+0900",
                "color"         : 5620992,
                "footer": {
                    "icon_url"  : "attachment://favicon.png",
                    "text"      : "Qiita",
                },
                "thumbnail": {
                    "url"       : "attachment://logo-background-color.png"
                },
                "image": {
                    "url"       : "attachment://logo-effect-background-color.png"
                },
                "author": {
                    "name"      : "embedと。",
                    "url"       : "https://qiita.com/",
                    "icon_url"  : "attachment://favicon.png",
                },
                "video": {
                    "url"       : "https://www.youtube.com/embed/q05aeEf17Kc"
                },
                "fields": [
                    {
                        "name"  : "添付画像を",
                        "value" : "embedsで使うと別表示しなくなるっぽい。",
                        "inline": True,
                    },
                    {
                        "name"  : "attachment:",
                        "value" : "embedの中でしか添付使えないっぽい。",
                        "inline": True,
                    },
                    {
                        "name"  : "Visualizer and validator for Discord embeds.",
                        "value" : "日本語入れたら怒らたけど、color pickerが地味に便利。",
                    },
                    {
                        "name"  : "Youtubeの",
                        "value" : "[埋め込みは無理っぽい](https://support.discord.com/hc/en-us/community/posts/360037387352-Videos-in-Rich-Embeds)\nvideo URL 指定しても無視される。",
                    },
                ],
            }
        ]
    }
}

### embed付き
with open("favicon.png", 'rb') as f:
    file_bin_favicon = f.read()
with open("logo-background-color.png", 'rb') as f:
    file_bin_logobg = f.read()
with open("logo-effect-background-color.png", 'rb') as f:
    file_bin_logoeffect = f.read()
files_qiita  = {
    "favicon" : ( "favicon.png", file_bin_favicon ),
    "logo_bg" : ( "logo-background-color.png", file_bin_logobg ),
    "logo_effect" : ( "logo-effect-background-color.png", file_bin_logoeffect ),
}
payload2['payload_json'] = json.dumps( payload2['payload_json'], ensure_ascii=False )
res = requests.post(WEBHOOK_URL, files = files_qiita  , data = payload2 )
print( res.status_code )
print( json.dumps( json.loads(res.content), indent=4, ensure_ascii=False ) )
multipart/form-data첨부 파일은 전항과 같이 files 로 지정. 메시지 내용은 공식 읽어도 푹신하고 분명 모른다.
첨부 파일을 붙일 경우 embed라든지 그대로 사용하면 화난다 . 대신 payload_json 에 모두 넣고 dump하여 문자열화, data 로 지정. 이것으로 어떻게든 되었다.
첨부한 이미지 파일은 embeds 안에서는 사용할 수 있었지만, avatar_url 에는 사용할 수 없었다.
Embed Objectvideo 가 있었기 때문에 youtube URL 을 시도해 보겠지만, 현재 webhook에는 사용할 수 없을 것 같다.wait 붙지 않아도 content 돌아온다.
실제로 투고하면 이런 느낌.

좋은 웹페이지 즐겨찾기