1. ホーム
  2. パイソン

[解決済み] discord.py v1.4.1を使ったお天気コマンドの作り方

2022-03-03 21:10:03

質問

を作りたい場合 weather コマンドを使用し、あなたのボットにクールな追加をすることができます。 weather コマンドを作成します。

解決方法は?

このようなコマンドを作成する予定です。


まず始めに オープンウィアーマップ APIは、APIキーが必要です。 ウェブサイト .

APIキーが取得できれば、それでOKです。

第二段階として、コーディングを開始します。 requests . 単純にインポートすればいいのです。

import requests

インポートした後、次のようなものを定義しておくと使いやすくなります。

api_key = "your_api_key"
base_url = "http://api.openweathermap.org/data/2.5/weather?"

次のステップでは、このコマンドに city を引数として与えます。

@client.command()
async def weather(ctx, *, city: str):

その後、Webサイトのレスポンス取得に requests を使って、レスポンスを読み取ります。 json . また、WEはコマンドが使用されるチャンネルを定義します。

    city_name = city
    complete_url = base_url + "appid=" + api_key + "&q=" + city_name
    response = requests.get(complete_url)
    x = response.json()
    channel = ctx.message.channel

ここで city_name が有効な都市であることを示すために、単純な if ステートメントを使用します。また async with channel.typing() これは、ボットがウェブサイトからコンテンツを取得するまでの間、タイピングしていることを示すものです。

    if x["cod"] != "404":
        async with channel.typing():

今度は天気に関する情報を取得します。

            y = x["main"]
            current_temperature = y["temp"]
            current_temperature_celsiuis = str(round(current_temperature - 273.15))
            current_pressure = y["pressure"]
            current_humidity = y["humidity"]
            z = x["weather"]
            weather_description = z[0]["description"]

さて、情報を入手したら、その情報を discord.Embed というように

            weather_description = z[0]["description"]
            embed = discord.Embed(title=f"Weather in {city_name}",
                              color=ctx.guild.me.top_role.color,
                              timestamp=ctx.message.created_at,)
            embed.add_field(name="Descripition", value=f"**{weather_description}**", inline=False)
            embed.add_field(name="Temperature(C)", value=f"**{current_temperature_celsiuis}°C**", inline=False)
            embed.add_field(name="Humidity(%)", value=f"**{current_humidity}%**", inline=False)
            embed.add_field(name="Atmospheric Pressure(hPa)", value=f"**{current_pressure}hPa**", inline=False)
            embed.set_thumbnail(url="https://i.ibb.co/CMrsxdX/weather.png")
            embed.set_footer(text=f"Requested by {ctx.author.name}")

embedを構築した後、送信します。

        await channel.send(embed=embed)
    else:
        await channel.send("City not found.")

また else 文は、API が言及された都市の天気をフェッチできない場合、都市が見つからないことを送信します。


で、これで無事に weather コマンドを実行します。

もし、エラーに遭遇したり、疑問があれば、必ず以下にコメントしてください。できる限りお手伝いさせていただきます。

ありがとうございます。