---
# System prepended metadata

title: 10/8 Discord Bot 開發(一)

---

# 10/8 Discord Bot 開發(一)

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

![](https://hackmd.io/_uploads/S1Q-W7gZT.png)
:::

## 本次討論事項
-   功能開發設計
-   Python 爬蟲教學
-   講解選課相關指令

## 氣象預報功能
### 申請 API 授權碼
- [氣象資料開放平臺](https://opendata.cwa.gov.tw/)
    - 註冊帳號
    - 取得授權碼
    ![](https://hackmd.io/_uploads/B10CmQlZ6.png)

### API 網址
- [中央氣象署開放資料平臺之資料擷取API
](https://opendata.cwa.gov.tw/dist/opendata-swagger.html?urls.primaryName=openAPI#/%E9%A0%90%E5%A0%B1/get_v1_rest_datastore_F_C0032_001)
- 所需資料
    - 一般天氣預報-今明 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 資料
```python!
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)
```

```json
weather = [{'locationName': '臺中市',
 'Wx': {'parameterName': '多雲', 'parameterValue': '4'}, 
 'PoP': {'parameterName': '20', 'parameterUnit': '百分比'}, 
 'MinT': {'parameterName': '27', 'parameterUnit': 'C'}, 
 'CI': {'parameterName': '舒適至悶熱'}, 
 'MaxT': {'parameterName': '29', 'parameterUnit': 'C'}
}]
```

```python! 
#輸出'locationName'的資料
print(weather_data[0]["locationName"])

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

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

### icon_url
```python
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"
    }
```

### 嵌入式訊息
```python!
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)
```

```python
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/")
```

### 完成
![](https://hackmd.io/_uploads/By-cgUx-a.png)


## 下次討論事項
- 10/12 晚上 20:00 Discord Bot 開發(二)
    - 定時發布天氣資訊
    - 使用應用程式指令
    - 講解選課相關指令

###### tags: `討論共筆`