# 10/12 Discord Bot 開發(三)
:::info
時間:2023/10/12 21:30 ~ 2023/10/13 00:10
地點:線上會議(Discord)
參與:xiaojie4082、wei、StarLeisure

:::
## 本次討論事項
- 定時發布天氣資訊
- ~~使用應用程式指令~~
- 講解選課相關指令
## 定時發布
- 錯誤版本
```python
import discord
from discord.ext import tasks
import datetime
# 創建 Discord intents 物件並啟用訊息內容 (message_content) 的接收
intents = discord.Intents.default()
intents.message_content = True
# 載入環境變數從 .env 檔案中
load_dotenv()
# 獲取 Discord 機器人令牌從環境變數
bot_token = os.getenv("DISCORD_TOKEN")
# 設置命令前綴和 intents
bot = commands.Bot(command_prefix='!', intents=intents)
@bot.event
async def on_ready():
# 設定每日 00:00 執行 `send_message()` 函式
send_message.start()
@tasks.loop(hours=24)
# 每天上午 9:00 @tasks.loop(hours=24, time="09:00")
async def send_message():
# 發送每日訊息
await bot.get_channel(channel_id).send("今日日期:" + datetime.datetime.now().strftime("%Y-%m-%d"))
client.run(bot_token)
```
- 修正版
```python
# 匯入 time 模組
import time
import datetime
# 匯入 asyncio 模組 (非同步I/O)
import asyncio
# 匯入讀取 .env 檔案的相關套件
import os
from dotenv import load_dotenv
# 匯入 discord.py 套件
import discord
from discord.ext import commands, tasks
# 創建 Discord intents 物件並啟用訊息內容 (message_content) 的接收
intents = discord.Intents.default()
intents.message_content = True
# 載入環境變數從 .env 檔案中
load_dotenv()
# 獲取 Discord 機器人令牌從環境變數
bot_token = os.getenv("DISCORD_TOKEN")
# 設置命令前綴和 intents
bot = commands.Bot(command_prefix='&', intents=intents)
# 時區設定
utc = datetime.timezone(datetime.timedelta(hours=8))
# 定時執行
times = [
datetime.time(hour=23, minute=10, tzinfo=utc),
datetime.time(hour=23, minute=11, tzinfo=utc),
datetime.time(hour=23, minute=12, tzinfo=utc),
datetime.time(hour=23, minute=13, tzinfo=utc),
datetime.time(hour=23, minute=14, tzinfo=utc),
]
@tasks.loop(time=times)
async def background_task():
channel = bot.get_channel(1158443986294423556) # 替換成你的頻道 ID
await channel.send('!!!!!!!')
@bot.event
async def on_ready():
print(f"Logged in as {bot.user}")
# 開始定時任務
background_task.start()
@bot.command()
async def ping(ctx):
start = time.time()
message = await ctx.send('pong...')
end = time.time()
latency = (end - start) * 1000
await message.edit(content=f'{latency:.1f} ms')
@bot.slash_command(name="ping", description="檢查機器人的延遲")
async def ping(ctx):
start = time.time()
message = await ctx.respond('等待中...')
end = time.time()
latency = (end - start) * 1000
await message.edit_original_response(content=f'{latency:.1f} ms')
bot.run(bot_token)
```
## 定時發布天氣資訊
- 添加套件
```python
import datetime
from discord.ext import tasks
```
```python
# 時區設定
utc = datetime.timezone(datetime.timedelta(hours=8))
# 定時執行
times = [
datetime.time(hour=6, minute=1, tzinfo=utc),
datetime.time(hour=18, minute=1, tzinfo=utc),
]
@tasks.loop(time=times)
async def weather_background_task():
weather, info, url = today_weather()
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/")
channel = bot.get_channel(1162046869170573343)
await channel.send(embed=embed)
```
## 下次會議討論事項
- 10/17 晚上 20:00 Discord Bot 開發(四)
- 公車資訊
- 講解選課相關指令
- 10/14 或 15 晚上 20:00 PUHub 網頁(一)
- 調整統整