モジュールrequestsでDiscordに画像を投稿する

コマンドcurlは便利だ。
しかしプログラムで送信するならモジュールを使う方が都合が良く、Requests(日本語訳)は便利だ。

メッセージだけを送るなら
import json
import requests

# TOKEN: トークン
# CHANNEL_ID: チャンネルID

uri = 'https://discord.com/api/channels/{}/messages'.format(CHANNEL_ID)
headers = {
	'Authorization': 'Bot {}'.format(TOKEN),
	'Content-Type': 'application/json',
}
data = {'content': 'メッセージ'}

kwargs = {
	'headers': headers,
	'data': json.dumps(data),
}

session = requests.Session()
r = session.request('post', uri, **kwargs)
print(r.status_code, r.content)
で送れる。

ファイルを添付するときは少し面倒だ:
import json
import requests
import os
import mimetypes
import magic # pip install python-magic

# TOKEN: トークン
# CHANNEL_ID: チャンネルID
# PATH: 添付するファイルのパス

# アップロードするファイルに関するデータを取得する
def get_file(field_name, path, name=None, mime=None):
	def _get_mimetype(path):
		try: return magic.from_file(path, mime=True)
		except: return mimetypes.guess_type(path)[0]
	if name is None: name = os.path.split(path)[1]
	if mime is None: mime = _get_mimetype(path)
	file_info = (name, open(path, 'rb'), mime)
	return (field_name, file_info)

basename = os.path.basename(PATH)
uri = 'https://discord.com/api/channels/{}/messages'.format(CHANNEL_ID)
headers = {
	'Authorization': 'Bot {}'.format(TOKEN),
}
data = {
	'content': 'メッセージ',
	'image': {
		'url': 'attachment://{}'.format(basename),
	},
	'attachments': [
		{
			'id': 0,
			'filename': basename,
		},
	],
}

files = []
files.append(get_file('files[0]', PATH, basename)) # files[]のインデックスをattachmentsのidの値に合わせる

kwargs = {
	'headers': headers,
	'data': {'payload_json': (json.dumps(data), 'application/json'),},
	'files': files,
}

session = requests.Session()
r = session.request('post', uri, **kwargs)
print(r.status_code, r.content)
さらにembedsでメッセージに埋め込むとき、embedsが含む画像をattachmentsに追加する。
2022/08/07 09:27
タグ