PythonでDiscord bot 「6.トピック紹介(1)embed」

スポンサーリンク

こんにちは。初級編はひと休みして、今回は中級編です。
embedについて学びます。使いこなせると楽しいです。
DIscord botの醍醐味だと思ってます。
DIscordに触れていれば一度は目にしたことがあると思います。こんなやつです。

(hihi-jetsさん、手ごろな画像を使わせていただきました。無断で使ってごめんなさい。)

今回はembedの作り方を紹介します。最初にコードの全体像を掲載します。

BOT_TOKEN = "*************************************"
 
import discord
import datetime
import traceback
import random

client = discord.Client()

#起動時のshellメッセージ 
@client.event
async def on_ready():
       print('Logged in as')
       print('BOT-NAME :', client.user.name)
       print('BOT-ID   :', client.user.id)
       print('Time     :', datetime.datetime.now())
       print('------')


@client.event
async def on_message(message):

 if client.user == message.author:
   return

 if message.content.startswith('k1/embed'): 
  time = datetime.datetime.now()
  time2 = time.strftime('%Y/%m/%d %H:%M:%S')
  col=discord.Color(random.randint(0, 0xFFFFFF))
  msg = discord.Embed(title='<embedテスト>', colour=col)
  length = len(str(message.author.avatar_url))-15
  if str(message.author.avatar_url).find('embed/avatars')!=-1:
   msg.set_thumbnail(url=str(message.author.default_avatar_url))
  else:
   if str(message.author.avatar_url).find('.gif')!=-1:
    msg.set_thumbnail(url=str(str(message.author.avatar_url)[0:(length+5)]))
   else:
    msg.set_thumbnail(url=str(message.author.avatar_url)[0:length]) 
  msg.set_author(name = message.author)
  msg.add_field(name = '名前' , value = 'こげさん')
  msg.add_field(name = '性別' , value = '秘密')
  msg.add_field(name = '年齢' , value = '秘密')
  length = len(client.user.avatar_url)-15
  msg.set_footer(text='Given by ' + client.user.name + " | " + str(time2), icon_url=str(client.user.avatar_url)[0:length])
  file = discord.File('gazou/pandero.png', filename='pandero.png')
  msg.set_image(url="attachment://pandero.png")
  await message.channel.send(file=file,embed=msg)
   
client.run(BOT_TOKEN)

このコードでbotを走らせて、「k1/embed」で表示されるのが以下です。

順を追ってコードを説明していきます。
これまでに出てきた自明のものは説明を省略しますので、過去の投稿を確認してください。
今回のコードは、私が試行錯誤を重ねて編み出した(?)ものが含まれます。
(お金を取りたいくらいです笑)

import discord
import datetime
import traceback
import random

これまでのコードに「import random」が追加されています。
これはembedには直接関係ないのですが、私の趣味のために入っています(笑)

  time = datetime.datetime.now()
  time2 = time.strftime('%Y/%m/%d %H:%M:%S')

1行目は、現在時刻を取得しています。
2行目で、時刻のフォーマットを変換しています。

  col=discord.Color(random.randint(0, 0xFFFFFF))

ここが先ほど言った「趣味」の部分です。
embedの画像を見るとわかるのですが、左側に色つきのラインを入れることができます。
色のコードをランダムで指定しているのがこの部分です。コマンドを打つたびに色が変わって面白いです。

  msg = discord.Embed(title='<embedテスト>', colour=col)

embedの本体の部分です。タイトルと先ほどの色を指定しています。

  length = len(str(message.author.avatar_url))-15
  if str(message.author.avatar_url).find('embed/avatars')!=-1:
   msg.set_thumbnail(url=str(message.author.default_avatar_url))
  else:
   if str(message.author.avatar_url).find('.gif')!=-1:
    msg.set_thumbnail(url=str(str(message.author.avatar_url)[0:(length+5)]))
   else:
    msg.set_thumbnail(url=str(message.author.avatar_url)[0:length]) 

ここは、呪文だと思ってください。
thumbnailというのはembed右上の小さな画像の部分なのですが、そこにコマンドを打った人のアイコンを表示させるための命令です。ユーザーのアイコンは、デフォルトのままだったり、画像指定していたり、はたまたアニメーションgifだったりします。
上記のコードよりスマートな方法があるのかもしれませんが、一応これでいずれのアイコンにも対応しています。
ちなみに、「msg.set_thumbnail()」の部分が、本体のmsgにthumbnailを追加する命令です。

  msg.set_author(name = message.author)

embed上部の名前を指定する部分です。

  msg.add_field(name = '名前' , value = 'こげさん')
  msg.add_field(name = '性別' , value = '秘密')
  msg.add_field(name = '年齢' , value = '秘密')

ここでembedの中身を記述していきます。一つのfieldには確か2000文字までしか入らなかったと思います。

  length = len(client.user.avatar_url)-15
  msg.set_footer(text='Given by ' + client.user.name + " | " + str(time2), icon_url=str(client.user.avatar_url)[0:length])

embedの下部(フッター)の記述部分の命令です。ここでは、botのアイコンと名前と時間を表示させています。len()は文字数をカウントする命令なのですが、「client.user.avatar_url」で取り出せるbotのアイコンのURLがそのまま使えず、一部を切り取って使っていると思います。

  file = discord.File('gazou/pandero.png', filename='pandero.png')
  msg.set_image(url="attachment://pandero.png")

embedに画像を埋め込む方法は、以下の2パターンあります。
①http形式のURLを指定する方法
②ローカルにある画像を一旦Discordにアップロードし、それを指定する方法
最近①の調子が悪いようなので、私は②を使っています。
使い方にやや癖があります。
bot本体のファイル(〇〇.py)に「gazou」というフォルダがあり、その中に「pandero.png」という画像が保存されているとします。

file = discord.File('gazou/pandero.png', filename='pandero.png')

画像の場所を指定して、「filename」で名前を付けます。これでアップロードを意味しているはずです。

  msg.set_image(url="attachment://pandero.png")

msg.set_image()はembed下部に画像を埋め込む命令で、そこに先ほどアップロードした画像をこのように指定します。

  await message.channel.send(file=file,embed=msg)

最後にembedを送信する命令です。(file=file,embed=msg)は呪文だと思いましょう。

繰り返しになりますが、これで「k1/embed」とコマンドを打つと以下が表示されるはずです。

いかがでしたか?コードも急に長くなり、少し難しかったでしょうか。
embedを使いこなせるとbot開発が楽しくなります。
今回、fieldの中身は固定値にしましたが、それを変数にしてみたりするのも良いと思います。
色々試してみてください!

最後に~寄付のお願い~

私のbotは、無償で開発しています。また、稼働しているサーバー代が毎月かかっており、完全持ち出しの状況です。もし寄付してもいいよ、という方がいらっしゃいましたらよろしくお願いいたします。リンク先はMONAの寄付ですが、他の通貨でのご寄付をいただける場合は私までご連絡いただけると大変ありがたいです。 (私、こげさんは「アルファDIscord」にいます。)
ほしいMONAリスト (komikikaku.com)

よろしければ記事のシェアをお願いします!