iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

今天就是要來講Discord.py中定時指令的用法,事不宜遲讓我們直接進主題。

如何在Discord.py中運行定時任務或指令:

首先,需要導入以下模組:

import discord
from discord.ext import tasks, commands

然後創建一個Discord bot並定義一個async函數來執行您想要的定時任務內容:

intents= discord.Intents.all()
bot = commands.Bot(command_prefix='^^',
                   intents=intents)

@tasks.loop(hours=24) # 這裡可以是 seconds,minutes,hours 等參數設置間隔時間
async def called_once_a_day():
    # 您的程式碼
    print("這個任務每天執行一次") 

@called_once_a_day.before_loop
async def before():
    await bot.wait_until_ready()
    print("準備開始每日任務")

在這裡,我使用 @tasks.loop 裝飾器來創建一個每天執行一次的任務。可以通過傳入不同的時間參數來設置任務的執行頻率。

然後 @called_once_a_day.before_loop 裝飾器用來在任務開始前執行初始化操作。

最後需要啟動任務:

called_once_a_day.start() 

現在這個任務會每天在bot啟動時自動運行一次。

也可以創建另一個指令來手動啟動/停止任務:

@bot.command()
async def start_task(ctx):
    called_once_a_day.start()
    await ctx.send("已開始每日任務")
    
@bot.command()  
async def stop_task(ctx):
    called_once_a_day.stop()
    await ctx.send("已停止每日任務")

這樣就可以基於discord.py實現定時任務了,可以根據實際需求調整時間間隔和任務內容。


如果要在Cog檔中實現discord.py的定時任務,步驟如下:

  1. 導入tasks模塊
from discord.ext import tasks
  1. 在Cog類中定義任務內容
class MyCog(commands.Cog):

    def __init__(self, bot):
        self.bot = bot
        self.my_task.start() # 啟動任務
        
    async def cog_unload(self):
        self.my_task.stop()# 停止任務

    @tasks.loop(hours=1)
    async def my_task(self):
        # 任務內容
        print('任務執行中...')

這裡要注意async def cog_unload這個函式是為了當Cog檔被卸載時也將任務進行停止的動作,否則任務會繼續執行。

  1. 在before_loop函數中等待bot啟動完成(可加可不加)
    @my_task.before_loop
    async def before_my_task(self):
        await self.bot.wait_until_ready()
  1. 可以選擇性地定義start/stop指令來控制任務
    @commands.command()
    async def start_task(self, ctx):
        self.my_task.start()
        await ctx.send('任務已開始')

    @commands.command()  
    async def stop_task(self, ctx):
        self.my_task.stop()
        await ctx.send('任務已停止')

當然你也可以使用cancel()方法來停止任務,但與stop()不同的是用一旦使用cancel()方法來停止任務後就無法再被開啟(start)。

  1. 最後加入Cog檔別忘了
async def setup(bot):
    await bot.add_cog(MyCog(bot))

這樣就可以在Cog中實現自定義的定時任務了。整體流程與在主檔案中定義任務類似,只是將內容寫入了Cog類中。


discord.py中的@tasks.loop裝飾器還提供了以下一些方法可以使用:

  • start():開始任務的執行
  • stop():停止任務的執行
  • restart():重新啟動任務
  • cancel():永久取消任務
  • is_running():返回任務目前是否正在運行
  • set_interval():設置任務運行的時間間隔
  • get_task():返回任務對象
  • add_exception_type():添加任務執行時需要忽略的異常類型
  • remove_exception_type():移除任務添加的異常類型
  • @after_loop():在每次任務執行後調用的函數
  • @before_loop():在每次任務執行前調用的函數
  • @error():當任務出錯時調用的函數

這些方法可以讓我們更方便的控制任務的運行狀態和行為。通過組合使用,可以實現比較複雜的任務邏輯。

詳細可以參考 https://discordpy.readthedocs.io/en/stable/ext/tasks/index.html


上一篇
[DAY23]Discord bot斜槓指令(slash command)
下一篇
[DAY25]Discord bot Cog檔建立
系列文
selenium爬蟲應用至discord bot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言