1
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?

discord.pyを使用してBOTから為替情報を送る方法

Last updated at Posted at 2023-02-21

きっかけ

僕は前にMinecraftの海外サーバー「Hypixel」で遊んでいた時期がありました。
そのサーバーではお金を払ってVIP(できることがが増える役職?)みたいなものを買えていたのですが、海外のサーバーということもありすべて$(ドル)表記でした。そこでいちいちChromeを開いて調べるよりかは常に使っているDiscordで分かるようにしようと思ったからです。
しかし、調べてもその機能が使えるBOTが出てこなかったのです。
なら自分で作ってしまおう!
なにか遠回りをしているような感じですがそういうことです。

補足

今回は文字だけだとなんか悲しいなということで新しくEmbedという返信方式にしてみました。
別パターンとして文字だけの返信方式も書いてあるのでご安心を。

Embedとは

Discord上にリンク・文字・画像といった複合的要素をレイアウトして送信できるメッセージ形態です。(引用元は参考欄にあり)
らしいです。(下図参照)
すごいなぁ...
Embed.png

バージョンなど

$ python3 --version
Python 3.10.6

$ pip show discord
Version: 2.1.0 

実装

情報源の取得

どこから為替情報を取得しようかと調べているといいサイトを見つけました。

ここからまずはAPIキーを取得します。職業と組織名(学校名・社名)とメールアドレスを登録すれば簡単に取得できます。

取得したら
このサイトを参考にコードを書いてみます。

基本コード

注意
お使いの環境によっては正常に動作しない可能性があります。ご了承ください。

import discord
import requests
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='/',help_command=None,intents=intents)

@bot.tree.command(name="jpy",description="1ドル何円かを送信します")
async def kabuka(ctx):
    url = 'https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=USD&to_currency=JPY&apikey=your_token'
    raw = requests.get(url)
    data = raw.json()
    datetime = data["Realtime Currency Exchange Rate"]["6. Last Refreshed"]
    USDJPY = data["Realtime Currency Exchange Rate"]["5. Exchange Rate"]
    embed = discord.Embed(
    title="ドル円レート(1$)",
    color=0x00ff00,
    description="1$=" + USDJPY + "")
    embed.add_field(name="最終更新時間",value=datetime)
    await ctx.response.send_message(embed=embed)
bot.run('your_token')

※このコードは1$何円かを返信するコードです。
※これはEmbed返信パターンです

簡単な説明

@bot.tree.command(name="jpy",description="1ドル何円かを送信します")

name=のところは"/"の後に打ち込む文字を指します。ここでは/jpyと打ち込むことによってコマンドが実行されます。
description=のところはスラッシュコマンドの説明文の部分です。(下画像参照)
description.png

url = 'https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=USD&to_currency=JPY&apikey=your_token'

urlの最後のyour_tokenは先ほど作成したtokenを入れてください。

embed = discord.Embed

ここからEmbedの設定をしていきます

 title="ドル円レート(1$)"

ここではコードの通りEmbedのタイトルを設定しています。
Embedtitle.png

color=0x00ff00

ここではEmbedの帯のところの色を設定しています。(今回は緑色)
また、カラーコードを変えれば自由な色変更することができます。
Embedcolor.png

description="1$=" + USDJPY + ""

ここではタイトルの下の文章を設定しています。
Embeddescription.png
*画像では134.0~と説明がされていますが、134.10~の間違いです。

embed.add_field(name="最終更新時間",value=datetime)

ここでは更新時間を書いたほうがいいと思い、追加しました。実際このコードがなくてもEmbedとしては機能するものと思われます。
nameで太字のタイトル。(最初のタイトルとは違います)
valueで送る文章を設定しています。今回は基本コードを見てもらえれば分かる通りdatetimeという更新時間を取得しているためこのような書き方になっています。
ちなみにdatetimeは日本時間とは異なりUTC(協定世界時)です。ご了承ください。
Embedadd.png

await ctx.response.send_message(embed=embed)

最後に設定したEmbedをメッセージとして送信します。

bot.run('your_token')

最後の行のyour_tokenの変更も忘れずに!

注意
ここのyour_tokenは先ほどの為替情報のtokenとは違いDiscordのbotのtokenとなります。お気を付けください。

ここから確認できます。

別パターン

※ここのコードはEmbedを使用しないパターンとなります。

import discord
import requests
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='/',help_command=None,intents=intents)

@bot.tree.command(name="jpy",description="1ドル何円かを送信します")
async def kabuka(ctx):
    url = 'https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=USD&to_currency=JPY&apikey=your_token'
    raw = requests.get(url)
    data = raw.json()
    datetime = data["Realtime Currency Exchange Rate"]["6. Last Refreshed"]
    USDJPY = data["Realtime Currency Exchange Rate"]["5. Exchange Rate"]
    await ctx.response.send_message("1$=" + USDJPY + "円です。\n" + "最終更新時間は" + datetime + "です。")
bot.run('your_token')

結果

Embed使用パターン
jpy.png
Embed不使用パターン
notEmbed.png

どちらとも為替レートの情報が送れていますね!
今思うと1$が何円かわかっただけだと「3$だからえっと...何円だ?」ということになりそうなので計算できるようにもしたいです。

~追記~
今回使ったAPIは一日で25リクエストまで無料で対応使えるそうです。使いすぎには注意しましょう。
以下、サイトの原文、翻訳後の文、サイトを貼り付け。

原文
"We are pleased to provide free stock API service covering the majority of our datasets for up to 25 requests per day. If you would like to target a larger API call volume, please visit premium membership."

翻訳後文
"弊社では、1日あたり25リクエストまで、弊社のデータセットの大部分をカバーするストックAPIサービスを無料で提供しております。より多くのAPIコール量をご希望の場合は、プレミアムメンバーシップをご覧ください。"

サイト

今回は読みづらい記事だったと思います。申し訳ありません。お読みいただきありがとうございました。

参考

1
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
1
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?