0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

discord.pyでファイルを送信しようと思ったらこけた時のこと。

Posted at

discord.pyでファイルを送信しようと思ったらこけた時のこと。

タイトルの通りdiscord.pyでbotを作っていた時にこけたので対処法を忘れんうちに書いとく。
まずこけたコードはこれ

from PIL import Image
import io
import discord
async def send_pic(message :discord.Message):
    pic = Image.open("path")
    # -----------
    # 色々画像処理
    # -----------
    data = io.BytesIO() # バイトライクオブジェクト作成
    pic.save(data,format="png") # 保存
    file = discord.File(data) # discord.pyのFileクラスのインスタンスを生成
    await message.channel.send(content="send pic",file=file) # 送信

PILで画像を読み込み処理してからBytesIOに保存して送信するコードだが、いざ走らせてみると送信自体はされるがデータが0Bの状態で送られてきていた。

原因

BytesIOのシークの位置がpic.save(data,format="png")の際に一番後ろになったままの状態でFileクラスに渡していたのが原因だった。

解決策

from PIL import Image
import io
import discord
async def send_pic(message :discord.Message):
    pic = Image.open("path")
    # -----------
    # 色々画像処理
    # -----------
    data = io.BytesIO() # バイトライクオブジェクト作成
    pic.save(data,format="png") # 保存
    data.seek(0) # <- シーク位置を先頭に持ってきている。
    file = discord.File(data) # discord.pyのFileクラスのインスタンスを生成
    await message.channel.send(content="send pic",file=file) # 送信

data.seek(0)でシーク位置を先頭に持ってきている。
これで正しく中身のあるデータが送信されるようになった。

よくよく考えたらファイルを書き込んだときは最後のバイトを書き込んだ位置のままなのだから、先頭に戻してやらないと読み込んでもファイルの最後と認識してしまうじゃないか。<-早く気づけ

##参考
[io - Pythonドキュメント]
(https://docs.python.org/ja/3/library/io.html)
discord.py リファレンス

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?