きっかけ
僕は前にMinecraftの海外サーバー「Hypixel」で遊んでいた時期がありました。
そのサーバーではお金を払ってVIP(できることがが増える役職?)みたいなものを買えていたのですが、海外のサーバーということもありすべて$(ドル)表記でした。そこでいちいちChromeを開いて調べるよりかは常に使っているDiscordで分かるようにしようと思ったからです。
しかし、調べてもその機能が使えるBOTが出てこなかったのです。
なら自分で作ってしまおう!
なにか遠回りをしているような感じですがそういうことです。
補足
今回は文字だけだとなんか悲しいなということで新しくEmbed
という返信方式にしてみました。
別パターンとして文字だけの返信方式も書いてあるのでご安心を。
Embedとは
Discord上にリンク・文字・画像といった複合的要素をレイアウトして送信できるメッセージ形態です。(引用元は参考欄にあり)
らしいです。(下図参照)
すごいなぁ...
バージョンなど
$ 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=
のところはスラッシュコマンドの説明文の部分です。(下画像参照)
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$)"
color=0x00ff00
ここではEmbedの帯のところの色を設定しています。(今回は緑色)
また、カラーコードを変えれば自由な色変更することができます。
description="1$=" + USDJPY + "円"
ここではタイトルの下の文章を設定しています。
*画像では134.0~と説明がされていますが、134.10~の間違いです。
embed.add_field(name="最終更新時間",value=datetime)
ここでは更新時間を書いたほうがいいと思い、追加しました。実際このコードがなくてもEmbed
としては機能するものと思われます。
name
で太字のタイトル。(最初のタイトルとは違います)
value
で送る文章を設定しています。今回は基本コードを見てもらえれば分かる通りdatetime
という更新時間を取得しているためこのような書き方になっています。
ちなみにdatetimeは日本時間とは異なりUTC(協定世界時)です。ご了承ください。
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')
結果
どちらとも為替レートの情報が送れていますね!
今思うと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コール量をご希望の場合は、プレミアムメンバーシップをご覧ください。"
サイト
今回は読みづらい記事だったと思います。申し訳ありません。お読みいただきありがとうございました。
参考