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

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

# 補足
今回は文字だけだとなんか悲しいなということで新しく`Embed`という返信方式にしてみました。
別パターンとして文字だけの返信方式も書いてあるのでご安心を。
# Embedとは
Discord上にリンク・文字・画像といった複合的要素をレイアウトして送信できるメッセージ形態です。(引用元は参考欄にあり)
らしいです。(下図参照)
すごいなぁ...
![Embed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/541ec0b6-aa6e-649c-0beb-18e911c9b64e.png)

# バージョンなど
```console
$ python3 --version
Python 3.10.6

$ pip show discord
Version: 2.1.0 
```

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

https://www.alphavantage.co/

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

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

https://www.alphavantage.co/documentation/#digital-currency

### 基本コード
:::note warn
注意
お使いの環境によっては正常に動作しない可能性があります。ご了承ください。
:::
```python
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返信パターンです

### 簡単な説明

```python
@bot.tree.command(name="jpy",description="1ドル何円かを送信します")
```
`name=`のところは"/"の後に打ち込む文字を指します。ここでは`/jpy`と打ち込むことによってコマンドが実行されます。
`description=`のところはスラッシュコマンドの説明文の部分です。(下画像参照)
![description.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/5828ba5e-cde1-43da-f221-4213b144a88d.png)

```python
url = 'https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=USD&to_currency=JPY&apikey=your_token'
```
urlの最後の`your_token`は先ほど作成したtokenを入れてください。

https://www.alphavantage.co/
```python
embed = discord.Embed
```
ここからEmbedの設定をしていきます

```python
 title="ドル円レート(1$)"
```
ここではコードの通りEmbedのタイトルを設定しています。
![Embedtitle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/f652c20b-8fcf-653e-5499-07a5f1727bfa.png)

```python
color=0x00ff00
```
ここではEmbedの帯のところの色を設定しています。(今回は緑色)
また、カラーコードを変えれば自由な色変更することができます。
![Embedcolor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/51255f81-4445-ad97-206e-5c0b14e2ccb7.png)

```python
description="1$=" + USDJPY + "円"
```
ここではタイトルの下の文章を設定しています。
![Embeddescription.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/c7d4beb2-8757-8342-6775-45c0b685c7a6.png)
＊画像では134.0~と説明がされていますが、134.10~の間違いです。
```python
embed.add_field(name="最終更新時間",value=datetime)
```
ここでは更新時間を書いたほうがいいと思い、追加しました。実際このコードがなくても`Embed`としては機能するものと思われます。
`name`で太字のタイトル。(最初のタイトルとは違います)
`value`で送る文章を設定しています。今回は基本コードを見てもらえれば分かる通り`datetime`という更新時間を取得しているためこのような書き方になっています。
ちなみにdatetimeは日本時間とは異なりUTC(協定世界時)です。ご了承ください。
![Embedadd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/14d3471d-c70a-b7ed-c677-f9894f5a5bb1.png)

```python
await ctx.response.send_message(embed=embed)
```
最後に設定した`Embed`をメッセージとして送信します。

```python
bot.run('your_token')
```
最後の行の`your_token`の変更も忘れずに！

:::note warn
注意
ここの`your_token`は先ほどの為替情報のtokenとは違いDiscordのbotのtokenとなります。お気を付けください。
:::
ここから確認できます。

https://discord.com/developers/applications

### 別パターン
※ここのコードは`Embed`を使用しないパターンとなります。
```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/aa73688d-a824-a781-1730-af522ce27e6c.png)
Embed不使用パターン
![notEmbed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917811/0ed74fcc-598f-a5b5-8781-b779bf80bbfd.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コール量をご希望の場合は、プレミアムメンバーシップをご覧ください。"

サイト

https://www.alphavantage.co/support/#api-key

今回は読みづらい記事だったと思います。申し訳ありません。お読みいただきありがとうございました。
# 参考
https://qiita.com/hisuie08/items/5b63924156080694fc81

https://www.alphavantage.co/documentation/#digital-currency