3. 安裝和設定 Google Colab 環境

  1. 前往 Google Colab
  2. 建立新的 Notebook:點擊「New Notebook」創建一個新的 Python Notebook。
  3. 安裝必要套件
!pip install discord.py

4. 編寫並執行 Bot 程式碼

地震機器人

輸入格式:

* 查詢地震:&地震

* 快速測試:1 #直接顯示最新地震資訊

氣象局金鑰取得網站:https://opendata.cwa.gov.tw/index

import requests
import discord
import nest_asyncio
import asyncio

# 允許 Google Colab 運行 asyncio 事件循環
nest_asyncio.apply()

# 定義查詢地震資訊的函數
def earth_quake():
    result = []
    code = '氣象局取得的金鑰'
    try:
        # 小區域地震資料查詢網址
        url = f'https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0016-001?Authorization={code}'
        req1 = requests.get(url)
        data1 = req1.json()
        eq1 = data1['records']['Earthquake'][0]
        t1 = eq1['EarthquakeInfo']['OriginTime']

        # 顯著有感地震資料查詢網址
        url2 = f'https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001?Authorization={code}'
        req2 = requests.get(url2)
        data2 = req2.json()
        eq2 = data2['records']['Earthquake'][0]
        t2 = eq2['EarthquakeInfo']['OriginTime']

        result = [eq1['ReportContent'], eq1['ReportImageURI']]
        if t2 > t1:
            result = [eq2['ReportContent'], eq2['ReportImageURI']]
    except Exception as e:
        print(e)
        result = ['抓取失敗...', '']
    return result

# 設定 Discord Bot
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

# 定義事件函數
@client.event
async def on_ready():
    print('目前登入身份:', client.user)

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('&'):
        # 查詢地震資訊
        if message.content.startswith('&地震'):
            earthquake_info = earth_quake()
            await message.channel.send(earthquake_info[0])
            if earthquake_info[1]:
                await message.channel.send(earthquake_info[1])

        # 說明指令
        elif '說明' in message.content:
            await message.channel.send(
                '輸入格式:\n1. 查詢地震:&地震\n'
                '2. 快速測試:1 #直接顯示最新地震資訊'
            )

    # 測試指令:快速顯示地震資訊
    if message.content == '1':
        earthquake_info = earth_quake()
        await message.channel.send(f"地震資訊:\n{earthquake_info[0]}")
        if earthquake_info[1]:
            await message.channel.send(earthquake_info[1])

# 啟動 Bot
async def start_bot():
    await client.start('輸入你自己的 Discord 金鑰')
# 啟動 asyncio 事件循環並執行 Bot
try:
    asyncio.run(start_bot())
except RuntimeError:
    loop = asyncio.get_event_loop()
    loop.run_until_complete(start_bot())

同學推薦的參考網站: