# 10/21 Discord Bot 開發(五)
:::info
時間:2023/10/21 21:00 ~ 2023/10/22 02:15
地點:線上會議(Discord)
參與:xiaojie4082、wei._.614、StarLeisure、SmingXO

:::
## 本次討論事項
- 添加按鈕
- 公車資訊
## 添加按鈕
```python!
button = discord.ui.Button(label="中央氣象局", url="https://www.cwa.gov.tw/V8/C/W/Town/Town.html?TID=6601300")
view = discord.ui.View()
view.add_item(button)
await ctx.interaction.response.send_message(embed=embed, view=view)
```
## 公車資訊
- 運輸資料流通服務平臺
- [https://tdx.transportdata.tw](https://tdx.transportdata.tw)
- 範例程式
- https://github.com/tdxmotc/SampleCode/blob/master/Python3/auth_TDX.py
- 資料網址

- https://tdx.transportdata.tw/api/basic/v2/Bus/EstimatedTimeOfArrival/City/Taichung/162?%24filter=StopUID%20eq%20%27TXG20091%27&%24orderby=StopSequence&%24format=JSON
### 程式碼
```python!
import requests
import json
app_id = ''
app_key = ''
# 162 靜宜大學(校門), 主顧樓, 聖母堂(終), 聖母堂(起)
# 301 靜宜大學(校門), 主顧樓, 靜園餐廳(終), 靜園餐廳(起)
# 368 靜宜大學(校門), 主顧樓, 聖母堂(終), 聖母堂(起)
stop_dict = {'162': ['TXG20091', 'TXG20092', 'TXG20093', 'TXG20094'], '301': ['TXG20091', 'TXG20094','TXG15247','TXG15230'], '368':['TXG24503','TXG24504','TXG24505','TXG24506']}
auth_url="https://tdx.transportdata.tw/auth/realms/TDXConnect/protocol/openid-connect/token"
def EstimateTime():
class Auth():
def __init__(self, app_id, app_key):
self.app_id = app_id
self.app_key = app_key
def get_auth_header(self):
content_type = 'application/x-www-form-urlencoded'
grant_type = 'client_credentials'
return{
'content-type' : content_type,
'grant_type' : grant_type,
'client_id' : self.app_id,
'client_secret' : self.app_key
}
class data():
def __init__(self, app_id, app_key, auth_response):
self.app_id = app_id
self.app_key = app_key
self.auth_response = auth_response
def get_data_header(self):
auth_JSON = json.loads(self.auth_response.text)
access_token = auth_JSON.get('access_token')
return{
'authorization': 'Bearer '+access_token
}
try:
d = data(app_id, app_key, auth_response)
except:
a = Auth(app_id, app_key)
auth_response = requests.post(auth_url, a.get_auth_header())
d = data(app_id, app_key, auth_response)
EstimateTime = {}
for route, uids in stop_dict.items():
EstimateTime[route] = []
for uid in uids:
url = "https://tdx.transportdata.tw/api/basic/v2/Bus/EstimatedTimeOfArrival/City/Taichung/" + route + "?%24filter=StopUID%20eq%20%27" + uid + "%27&%24orderby=StopSequence&%24format=JSON"
try:
data_response = requests.get(url, headers=d.get_data_header())
except:
data_response = requests.get(url, headers=d.get_data_header())
data = json.loads(data_response.text)
try:
EstimateTime[route].append(data[0]["EstimateTime"]/60 + "分鐘")
except:
EstimateTime[route].append("-")
return EstimateTime
```
```python!
@tasks.loop(minutes=1)
async def bus_background_task():
try:
Estimate = EstimateTime()
current_time = time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())
embed=discord.Embed(title="校園公車站牌資訊", description=
"校門\n" +
":bus: `162` `" + Estimate["162"][0] + "`\n" +
":bus: `301` `" + Estimate["301"][0] + "`\n" +
":bus: `368` `" + Estimate["368"][0] + "`\n\n" +
"主顧樓\n"
":bus: `162` `" + Estimate["162"][1] + "`\n" +
":bus: `301` `" + Estimate["301"][1] + "`\n" +
":bus: `368` `" + Estimate["368"][1] + "`\n\n" +
"聖母堂/靜園餐廳\n"
":bus: `162` `" + Estimate["162"][3] + "`\n" +
":bus: `301` `" + Estimate["301"][3] + "`\n" +
":bus: `368` `" + Estimate["368"][3] + "`\n\n"
, color=0xfff700)
embed.set_footer(text="更新時間:" + current_time + "\n" + "資料來源:https://tdx.transportdata.tw")
message = await bot.get_channel().fetch_message()
await message.edit(embed=embed)
# channel = bot.get_channel()
# await channel.send(embed=embed)
except Exception as e:
print(e)
```
### 完成

## 下次討論事項
- 期中考暫停兩周討論 Discord Bot 開發(六)
- 公車查詢
- 按鈕與定時任務整合