Try   HackMD

10/8 Discord Bot 開發(一)

時間:2023/10/08 20:30 ~ 2023/10/09 00:00
地點:線上會議(Discord)
參與:xiaojie4082、wei、StarLeisure、SmingXO

本次討論事項

  • 功能開發設計
  • Python 爬蟲教學
  • 講解選課相關指令

氣象預報功能

申請 API 授權碼

API 網址

  • 中央氣象署開放資料平臺之資料擷取API
  • 所需資料
    • 一般天氣預報-今明 36 小時天氣預報
      • https://opendata.cwa.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=授權碼&locationName=%E8%87%BA%E4%B8%AD%E5%B8%82
    • 台中未來一周天氣預報
      • https://opendata.cwa.gov.tw/api/v1/rest/datastore/F-D0047-075?Authorization=授權碼&limit=5&format=JSON
    • 一般天氣預報-台中市天氣小幫手
      • https://opendata.cwa.gov.tw/fileapi/v1/opendataapi/F-C0032-021?Authorization=授權碼&downloadType=WEB&format=JSON
    • 天氣特報-各別縣市地區目前之天氣警特報情形
      • https://opendata.cwa.gov.tw/api/v1/rest/datastore/W-C0033-001?Authorization=授權碼&locationName=%E8%87%BA%E4%B8%AD%E5%B8%82

程式碼

套件安裝

  • pip install requests
  • pip install beautifulsoup4

抓取 API 資料

import requests

# 設定 API 參數
api_url = "https://opendata.cwa.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=授權碼&locationName=%E8%87%BA%E4%B8%AD%E5%B8%82"


# 發送請求
response = requests.get(api_url)

# 解析回應
data = response.json()

# 建立陣列
weather_data = []

# 遍歷資料
for location in data["records"]["location"]:
    # 建立一個新的物件
    weather = {}
    weather["locationName"] = location["locationName"]

    # 遍歷天氣要素
    for weather_element in location["weatherElement"]:
        # 將天氣要素存入物件
        weather[weather_element["elementName"]] = weather_element["time"][0]["parameter"]

    # 將物件加入陣列
    weather_data.append(weather)

# 印出陣列
print(weather_data)
weather = [{'locationName': '臺中市',
 'Wx': {'parameterName': '多雲', 'parameterValue': '4'}, 
 'PoP': {'parameterName': '20', 'parameterUnit': '百分比'}, 
 'MinT': {'parameterName': '27', 'parameterUnit': 'C'}, 
 'CI': {'parameterName': '舒適至悶熱'}, 
 'MaxT': {'parameterName': '29', 'parameterUnit': 'C'}
}]
#輸出'locationName'的資料
print(weather_data[0]["locationName"])

#輸出'Wx'中'parameterName'的資料
print(weather_data[0]["Wx"]["parameterName"])

 #輸出'PoP'中'parameterName'的資料
print(weather_data[0]["PoP"]["parameterName"])

icon_url

Wx_icon_url = {
        "多雲": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/67aaf9dbe30989c25cbde6c6ec099213.png",
        "晴時多雲": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/67aaf9dbe30989c25cbde6c6ec099213.png",
        "晴朗": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/575900edccbc7def167f7874c02aeb0b.png",
        "陰天": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/66117fab0f288a2867b340fa2fcde31b.png",
        "小雨": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/a55fef55bbeb0762a8dd329b4b8ad342.png",
        "陣雨": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/4417bf88c7bbcd8e24fb78ee6479b362.png",
        "雷陣雨": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/efffb1e26f6de5bf5c8adbd872a2933a.png",
        "小雪": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/00171e3b54b97dee8c1a2f6a62272640.png",
        "陣雪": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/e95fb90fc5a4aac111be78770921beb1.png",
        "雷陣雪": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/efffb1e26f6de5bf5c8adbd872a2933a.png",
        "濃霧": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/d35bb25d12281cd9ee5ce78a98cd2aa7.png",
        "大雷雨": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/efffb1e26f6de5bf5c8adbd872a2933a.png",
        "大雨": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/451d37e6cea3af4a568110863a1adcf7.png",
        "豪雨": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/451d37e6cea3af4a568110863a1adcf7.png",
        "暴風雨": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/451d37e6cea3af4a568110863a1adcf7.png",
        "風雪": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/e95fb90fc5a4aac111be78770921beb1.png",
        "冰雹": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/9189cb49e806d1ebfeed24f33367143c.png",
        "霾": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/73ae8300a30e895e3739cd50ade0dfe1.png",
        "沙塵暴": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/ad9e41c68b6a2671d2bcd843be1baa86.png",
        "乾燥": "https://help.apple.com/assets/64067987823C71654C27CD1A/64067990823C71654C27CD47/zh_TW/ad9e41c68b6a2671d2bcd843be1baa86.png"
    }

嵌入式訊息

embed=discord.Embed(title="天氣資訊 (沙鹿區)", description="晴時多雲,午後局部短暫雷陣雨,外出活動留意天氣變化", color=0xffffff)
embed.set_thumbnail(url="https://ssl.gstatic.com/onebox/weather/64/partly_cloudy.png")
embed.add_field(name="天氣狀況", value="多雲", inline=True)
embed.add_field(name="最高低溫", value="27 ~ 29 °C", inline=True)
embed.add_field(name="降雨機率", value="20 %", inline=True)
embed.add_field(name="體感狀態", value="舒適至悶熱", inline=True)
embed.set_footer(text="資料來源:https://opendata.cwa.gov.tw/")
await ctx.send(embed=embed)
embed=discord.Embed(title="天氣資訊 (沙鹿區)", description=info, color=0xffffff)
embed.set_thumbnail(url=url)
embed.add_field(name="天氣狀況", value=weather[0]["Wx"]["parameterName"], inline=True)
embed.add_field(name="最高低溫", value=weather[0]["MinT"]["parameterName"] + " ~ " + weather[0]["MaxT"]["parameterName"] + " °C", inline=True)
embed.add_field(name="降雨機率", value=weather[0]["PoP"]["parameterName"] + " %", inline=True)
# embed.add_field(name="體感狀態", value=weather[0]["CI"]["parameterName"], inline=False)
embed.set_footer(text="資料來源:https://opendata.cwa.gov.tw/")

完成

下次討論事項

  • 10/12 晚上 20:00 Discord Bot 開發(二)
    • 定時發布天氣資訊
    • 使用應用程式指令
    • 講解選課相關指令
tags: 討論共筆