【Proladon】Code a discord bot - EP6 Part 2 - Cog 實作

Поделиться
HTML-код
  • Опубликовано: 29 сен 2024
  • #discord #bot #python #discord機器人
    這集有點複雜,所以跳著看有可能會看不懂喔
    這集主要的重點在於 commands.Cog 的類別繼承 與 其他類別建置
    不太懂 Python 類別(Class) 的各位 可能要自己去學習一下
    回來看才會比較清楚喔~

Комментарии • 142

  • @Proladon
    @Proladon  4 года назад +13

    一堆人在問 from .... import ... 會出現紅色波浪底線錯誤的問題.
    不知道大家有沒有仔細看影片 就連我也有出現那個錯誤 但我依然能照樣運行
    基本上那個錯誤是 VSCode 的 Python路徑設定的問題 但完全不影響執行
    所以只要能正常執行可以不理會他 (想解決這問題 請自行google
    除非你真的無法執行再來留言詢問 謝謝.

    • @darkmoon8219
      @darkmoon8219 4 года назад +2

      我照你講的打
      然後我開啟檔案沒問題
      但指令不能用
      有用到from core.classes import Cog_extension
      但他說找不到此指令
      求解

    • @楊曦曦
      @楊曦曦 4 года назад

      我的是他直接不給執行

    • @楊曦曦
      @楊曦曦 4 года назад

      他說no module name core

    • @darkmoon8219
      @darkmoon8219 4 года назад

      @@楊曦曦 看下你指令?

    • @xiang-yue-fung
      @xiang-yue-fung 3 года назад

      Traceback (most recent call last):
      File "e:\APPDATA\github\discord-bot\discord-bot\bot.py", line 44, in
      bot.load_extension(f'cmds.{filename[:-3]}')
      File "C:\Python39\lib\site-packages\discord\ext\commands\bot.py", line 674, in load_extension
      spec = importlib.util.find_spec(name)
      File "C:\Python39\lib\importlib\util.py", line 94, in find_spec
      parent = __import__(parent_name, fromlist=['__path__'])
      ModuleNotFoundError: No module named 'cmds'
      PS E:\APPDATA\github\discord-bot>
      如果出現以上錯誤應該如何解決呢?

  • @amoeba1125
    @amoeba1125 4 года назад +9

    喔天 這太棒了w
    期末作品用raspberry pi做一隻python的doscor bot
    你這個直接幫我一大把!
    然後我找了一些文章據說form ... import ... 需要新增一個__init__.py的檔案
    我不確定是不是必要的,所以我把if filename.endswith('.py')):
    改成if filename.endswith('.py') and not(filename.startswith('__')):
    避免把__init__.py也當成extension讀進去
    阿米巴

    • @Proladon
      @Proladon  4 года назад +3

      python 的 import 的方式 的確是有些要注意的地方
      不過我倒是沒聽說要加個什麼__init__.py的檔案
      其實你在主檔案裡面加上:
      if __name__ == __main__:
      your code here
      就好了

  • @黑巧-u3k
    @黑巧-u3k 2 года назад

    我想問餵甚麼我load跟unload都可以正常運作但是reload不會,而且終端不會報錯

  • @kagamineO
    @kagamineO Год назад

    我原先用for filename in os.listdir('./cmds'):
    print(filename)測試有沒有讀到cmds裡面的檔案(結果有)
    但是修改成for filename in os.listdir('./cmds'):
    if filename.endswith('.py'):
    bot.load_extension(F'cmds.{filename[:-3]}')在discord [help卻讀取不到
    請問該如何解決?

    • @shanc_is_handsome
      @shanc_is_handsome Год назад +2

      我也是最近才開始學,發現load、reload、unload會因版本問題,寫法會不一樣
      現在load、reload、unload被寫成coroutine,該行指令前面要加await,而且要用async函式包住
      不知道是不是你遇到的問題,給你參考

  • @楊曦曦
    @楊曦曦 4 года назад

    請問需要end class嗎?

  • @sim_ye
    @sim_ye 3 года назад

    @proladon
    no module named 'core' 請問這是什麼原因 我改怎麼救

    • @sim_ye
      @sim_ye 3 года назад

      準確來說 是我使用cog後bot能開啟 但無法使用指令

  • @哈哈-b9y
    @哈哈-b9y 5 лет назад

    我的setting怎麼發生問題了
    發生例外狀況: FileNotFoundError
    [Errno 2] No such file or directory: 'setting.json'
    File "C:\Users\Administrator\Desktop\Trash\GitHub\OAO\bot.py", line 7, in
    with open('setting.json', 'r', encoding='utf8') as jfile:

  • @teemobuibui
    @teemobuibui 2 года назад

    發生例外狀況: ExtensionFailed
    Extension 'cmds.img' raised an error: TypeError: module() takes at most 2 arguments (3 given)
    File "D:\個人\學習\Github Project\DiscordBot_01\cmds\img.py", line 4, in
    from core.classes import Cog_Extension
    File "D:\個人\學習\Github Project\DiscordBot_01\core\classes.py", line 5, in
    class Cog_Extension(commands.cog):
    The above exception was the direct cause of the following exception:
    File "D:\個人\學習\Github Project\DiscordBot_01\bot.py", line 36, in
    bot.load_extension(f'cmds.{Filename[:-3]}') #從檔名開頭取到倒數第三個字
    看不出來哪裡錯

    • @iolk157
      @iolk157 2 года назад +1

      你看一下你的classes.py中"class Cog_Extension(commands.Cog):"那行中最後的.Cog是不是大寫C,我剛遇到的問題應該跟你一樣

  • @lungouo
    @lungouo 4 года назад +1

    請問為什麼我讀不到檔案?

    • @Proladon
      @Proladon  4 года назад

      什麼叫讀不到檔...? 讀不到什麼檔?
      不好意思 我不會通靈>﹏<

    • @lungouo
      @lungouo 4 года назад

      Proladon 我試了許多遍都不行,求幫忙🙏🏻

    • @tunggoungchan9178
      @tunggoungchan9178 3 года назад

      @@lungouo 什麼檔?

    • @朋睿顏
      @朋睿顏 3 года назад

      :(

    • @lungouo
      @lungouo 3 года назад

      @@朋睿顏 一年前啦...

  • @傅傳智
    @傅傳智 7 месяцев назад +1

    for filename in os.listdir("./cmds"):
    if filename.endswith(".py"):
    bot.load_extension(f"cmds.{filename[:-3]}")
    程式無報錯,但在discord用help無法顯示出main和react
    也有用下面程式測試過了,有跑出來main和react,請問是哪裡出了問題呢?
    import os
    for filename in os.listdir("./cmds"):
    print(filename)

    • @matsumimusu
      @matsumimusu 6 месяцев назад

      卡一個,我猜是版本問題

    • @matsumimusu
      @matsumimusu 6 месяцев назад

      *[這是從底下複製上來的]*
      在主程式裡把它改成像這樣 :
      import asyncio
      async def main():
      for Filename in os.listdir("./cmds"):
      if Filename.endswith("py"):
      await bot.load_extension(f"cmds.{Filename[:-3]}")
      await bot.start(setting["TOKEN"])
      if __name__=="__main__":
      asyncio.run(main())
      _-主程式原始參考 :-_
      _-for Filename in os.listdir("./cmds"):-_
      _-if Filename.endswith(".py"):-_
      _-bot.load_extension(f"cmds.{Filename[:-3]}")-_
      _-if __name_-_- == "_-_-main__":-_
      _-bot.run(setting["TOKEN"])-_
      -I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=-
      還有在每個cog extension裡都要把setup加上async和await
      範例 :
      async def setup(bot):
      await bot.add_cog(Main(bot))
      _-原始參考 :-_
      _-def setup(bot):-_
      _-bot.add_cog(Main(bot))-_

  • @鯊鯊想睡睡
    @鯊鯊想睡睡 11 месяцев назад +1

    大大我不知道你還會不會回但是我問問看
    d:\user\Documents\GitHub\Goodbot\bot.py:38: RuntimeWarning: coroutine 'BotBase.load_extension' was never awaited
    bot.load_extension(f"cmds.{Filename[:-3]}")
    RuntimeWarning: Enable tracemalloc to get the object allocation traceback
    在執行之後出現這個錯誤
    機器人可以正常回應,但是Cog完全沒有載入
    拜託了QwQ

  • @Sunny-kb7wb
    @Sunny-kb7wb Год назад +1

    老師好,我想問一下,照打程式也都能運作但就是bot一開的時候,他不會自動全部load進來,是不是寫法有改

  • @joshuachan6317
    @joshuachan6317 4 года назад +5

    只有我聽得這麼污嗎,我一直吧cog聽成cock...

  • @nutronstar45
    @nutronstar45 4 года назад +3

    發生例外狀況: ExtensionNotFound
    Extension 'command/img' could not be loaded.

    • @777-e4q5b
      @777-e4q5b 2 года назад

      我也遇到這個問題QAQ 請問有甚麼解決方法嗎?

  • @Nyiou
    @Nyiou 2 года назад +1

    想請問一下,我的程式寫:
    for filename in os.listdir('./cmds'):
    if filename.endswith('.py'):
    bot.load_extension(f'cmds.{filename[:-3]}')
    結果按F5它跳出:
    發生例外狀況: KeyError
    'cmds.main'
    請問怎麼處理?

  • @clay2717
    @clay2717 5 лет назад +6

    讚! 最近很忙沒辦法常來捧場

  • @AXiangYT
    @AXiangYT 2 года назад +2

    我不知道為甚麼我的react和bot.py裡的程式都沒辦法在help裡顯示出來,也沒辦法用,大大求解。

    • @wdw781
      @wdw781 2 года назад

      +1

    • @arontao9308
      @arontao9308 2 года назад +5

      discord.py 2.0版本以後 Bot.load_extension 變成協程了 所以在load unload reload都要加await 然後最下面的for 迴圈 上面也要async一個load_extension(): 最下面的bot.load.extension(f'cmds.{Filenamep[:-3]}')前面也要await

    • @雷吾-p4r
      @雷吾-p4r 2 года назад

      @@arontao9308 感謝補充 雖然是解決了 可是卻load不進去 沒看到報錯 會有什麼問題導致這樣嗎

    • @鄭宇辰-q9d
      @鄭宇辰-q9d Год назад +6

      在main裡把它改成像這樣
      import asyncio
      async def main():
      for filename in os.listdir("./cmds"):
      if filename.endswith("py"):
      await bot.load_extension(f"cmds.{filename[:-3]}")
      await bot.start(setups["token"])
      if __name__=="__main__":
      asyncio.run(main())
      還有在每個cog extension裡都要把setup加上async和await
      例:
      async def setup(bot):
      await bot.add_cog(your_cog(bot))

    • @LukeYou
      @LukeYou Год назад

      @@鄭宇辰-q9d 感謝👍

  • @曾琮育
    @曾琮育 3 года назад +2

    from core.classes import Cog_Extension
    這行是不是不能用了

  • @na..5303
    @na..5303 2 года назад

    發生例外狀況: ExtensionFailed
    Extension 'cmds.main' raised an error: ModuleNotFoundError: No module named 'core'
    File "C:\Users\kukah\OneDrive\文件\python\disocrd bot\cmds\main.py", line 3, in
    from core.classes import Cog_Extension
    The above exception was the direct cause of the following exception:
    File "C:\Users\kukah\OneDrive\文件\python\disocrd bot\bot.py", line 32, in
    bot.load_extension(f'cmds.{Filename[:-3]}')
    這樣要怎麽辦

  • @lucy5219
    @lucy5219 4 года назад +1

    Traceback (most recent call last):
    File "C:\Users\XXX\Desktop\2BOT\bot.py", line 9, in
    with open('setting.json', 'r' , encoding='utf8') as jFile:
    jdata = json.load(jFile)
    error
    對?

    • @Proladon
      @Proladon  4 года назад

      這報錯看不出什麼.... 你這個報錯因該是只貼一半而已吧...
      目前只看到 第9行 有問題而已

  • @fungfung6420
    @fungfung6420 2 года назад

    希望大大解答
    for filename in os.listdir("C:\\Users\\user\\Desktop\\discord bot\\tut_bot\\cmds"):
    if filename.endswith(".py"):
    bot.load_extension(f"cmds.{filename[:-3]}") 在這一行出錯
    Exception has occurred: ExtensionFailed
    Extension 'cmds.main' raised an error: ModuleNotFoundError: No module named 'tut_bot'
    File "C:\Users\user\Desktop\discord bot\tut_bot\cmds\main.py", line 3, in
    from tut_bot.classes import Cog_Extension
    The above exception was the direct cause of the following exception:
    File "C:\Users\user\Desktop\discord bot\tut_bot\bot.py", line 38, in
    bot.load_extension(f"cmds.{filename[:-3]}")

  • @aimeewells8784
    @aimeewells8784 2 года назад +2

    老師教的很棒 讓我獲益匪淺

  • @11305205219
    @11305205219 Месяц назад

    *不太懂類別這部分...QQ只好先照著做*

  • @GranDpaTW
    @GranDpaTW 2 года назад +1

    不好意思
    目前其他指令都能正常運行,但就是load這些是無法執行的
    想問一下這會是錯在哪裡呢?
    Ignoring exception in command reload:
    Traceback (most recent call last):
    File "C:\Users\Justin\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke
    await ctx.command.invoke(ctx)
    File "C:\Users\Justin\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 855, in invoke
    await self.prepare(ctx)
    File "C:\Users\Justin\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 789, in prepare
    await self._parse_arguments(ctx)
    File "C:\Users\Justin\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 697, in _parse_arguments
    transformed = await self.transform(ctx, param)
    File "C:\Users\Justin\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 542, in transform
    raise MissingRequiredArgument(param)
    discord.ext.commands.errors.MissingRequiredArgument: extension is a required argument that is missing.

    • @wdw781
      @wdw781 2 года назад

      沒加extension參數

  • @ilovesakuramiko
    @ilovesakuramiko 4 года назад +1

    我寫好全部之後,我的ping指令沒有用,大大該如何解決呢?

  • @尼古-r3q
    @尼古-r3q 2 года назад +1

    受益良多 沒有任何問題 感謝耐心教學

  • @unknown-ym8hm
    @unknown-ym8hm 5 лет назад +2

    希望可以常出片>< 受益匪淺!

  • @darkmoon8219
    @darkmoon8219 4 года назад

    for Filename in os.listdir('./cmds'):
    if filename.endswith('.py'):
    bot.load_extension(f'cmds.{Filename[:-3]}')
    if __name__ = "__main__":
    bot.run(jdata['token'])
    vscode顯示
    invalid syntax(name那邊)

  • @stormz4861
    @stormz4861 4 года назад

    大大我有問題,classes.py中def出現了紅色波浪底線錯誤,然後說The special method '__int__' expects 0 param(s), 1 was given,請問一下是甚麽問題

  • @Bread_sk8
    @Bread_sk8 3 года назад +1

    講解的超詳細,大感謝!
    值得溫習好幾遍

  • @LittleShibaUwU
    @LittleShibaUwU 2 года назад

    如果我想把发出来的列表变成message_quote该怎么做?

  • @ngocluongpham4201
    @ngocluongpham4201 2 года назад

    发生异常: FileNotFoundError
    [WinError 3] 系統找不到指定的路徑。: './cmds'
    怎麼辦

  • @劉哲瑋-m8j
    @劉哲瑋-m8j Год назад

    d:\python-training\Lcw_Bot-main\bot.py:33: RuntimeWarning: coroutine 'BotBase.load_extension' was never awaited
    bot.load_extension(f'cmds.{extension}')
    RuntimeWarning: Enable tracemalloc to get the object allocation
    traceback
    請問該怎麼解?
    @bot.command()
    async def load(ctx,extension):
    bot.load_extension(f'cmds.{extension}')
    await ctx.send(f'Loaded {extension} done.')

  • @tofu10012
    @tofu10012 Год назад

    我的是斜線指令無法正常unloadㄟ

  • @我德寶-n1u
    @我德寶-n1u 2 года назад

    哥 想請問下
    for Filename in os.listdir('../cmds'):
    if Filename.endswith('.py'):
    bot.load_extension(F'cmds.{Filename[:-3]}') #總是問題出在這行
    發生例外狀況: ModuleNotFoundError
    No module named 'cmds'
    File "D:\Vscode file\pythondc\pic\bot.py", line 46, in
    bot.load_extension(F'cmds.{Filename[:-3]}')
    我看了您的影片不下十次
    可以確定 main react 裡面都建置正確 from core.classes import cog_Extension也有正確導入
    classes內容更是絲毫不差
    目錄編排也是照您所編排
    在ttt.py文件中
    for filename in os.listdir('../cmds'):
    if filename.endswith('.py'):
    print(filename)
    是能正確運行的 會印出 main.py react.py
    可回到bot.py主檔案運行時 bot.load_extension(F'cmds.{Filename[:-3]}')就是抓不到檔案
    如果可以還請麻煩幫我解惑下

    • @ackbl8723
      @ackbl8723 2 года назад

      '../cmds' 是因為多一個點嗎 刪掉如果還是錯誤可以用複製全部路徑試試看

    • @DaiDai32768
      @DaiDai32768 2 года назад

      我也遇到類似的問題
      main react classes 皆照著影片裡打
      在ttt.py中是能正確運行的 也會印出main.py react.py
      但在bot.py中運行時卻抓不到檔案
      想請問解決的方式

    • @Proladon
      @Proladon  2 года назад

      './cmds' 不是 '../cmds' 你多打一個.
      shelter-zone.github.io/Discord_Bot_FAQ/python/#load-extension-找不到-cmds

    • @DaiDai32768
      @DaiDai32768 2 года назад

      @@Proladon 您好~ 請問有discord或其他的聯絡方式嗎? 想把程式碼的照片傳給您 請教一些問題

  • @夙玥-u5y
    @夙玥-u5y 3 года назад

    python能不能有縮排沒對好的時候會報錯阿
    搞了好幾小時 一直在重複慢慢看指令 還以為是版本不同
    結果縮排縮一縮程式就會跑了 c的if end if沒對好就一直跳錯了..

    • @Proladon
      @Proladon  3 года назад

      是你的linter沒裝到吧
      VSC安裝python的插件一般來說右下角會跳對話框問你要不要裝linter
      你可以在VSC裡按F1然後打 linter
      就會有一些linter的選項
      其中有一個選擇linter的選項 如果你沒有他應該又會問你要不要裝

    • @夙玥-u5y
      @夙玥-u5y 3 года назад

      @@Proladon 我照你打的方式 選了一個 Disable Linting 他有自動新增了一個setting.json 不知道是不是我之前沒新增到
      圖片在這裡: cdn.discordapp.com/attachments/868420889430093844/871737083608305754/unknown.png

  • @Chuen666
    @Chuen666 8 месяцев назад

    14:20 "應"該

  • @sim_ye
    @sim_ye 3 года назад

    @proladon 我想問一下,為什麼你vscode新增檔案那麼快?

    • @Proladon
      @Proladon  3 года назад

      這跟你電腦的HDD或SSD有關
      但跟VSCode一點關係都沒有 lol

    • @sim_ye
      @sim_ye 3 года назад

      @@Proladon 2:21 我的vscode沒有出現紅線,然後Barket的模組的括號也都不見了,這會跟機器人檔案有移動過有關嗎?

  • @onigiri_exe7191
    @onigiri_exe7191 3 года назад

    請問大大os 的定義是什麼 因為os.listdir 之後我就沒看懂

    • @andongni0723
      @andongni0723 2 года назад

      os 是python 內的一個模組,和random 一樣
      os.listdir("A路徑") 的意思就是 取得A路徑 中所有的檔案

  • @夜影-jacky
    @夜影-jacky 5 лет назад

    打得跟你一樣卻無法從core.classes輸入東西

    • @Proladon
      @Proladon  5 лет назад

      很多人都說打得跟我一樣 然後每次傳圖來 都一堆打錯字跟縮排錯誤的 或是資料夾結構不一樣的…
      所以你沒有提供你的程式碼或圖片我無法幫你解答哦~

  • @sugpotz7989
    @sugpotz7989 4 года назад

    如何像 help 那樣 後面有說明指令解釋

  • @shiroki9979
    @shiroki9979 4 года назад

    受益良多

  • @teablack5894
    @teablack5894 5 лет назад

    受益匪淺

  • @Uooip
    @Uooip 5 лет назад +1

    我全部都跟你打的一樣,但他跟我說👇🏻,然後就不能開,有沒有辦法解決?
    發生例外狀況: FileNotFoundError
    [WinError 3] 系統找不到指定的路徑。: './cmds'
    File "E:\UooiP\Project_1\bot.py", line 31, in
    for Filename in os.listdir('./cmds'):

    • @張凱淇-m6j
      @張凱淇-m6j 5 лет назад

      可能是你沒有資料夾 在你的Project_1資料夾裡面沒有叫cmds的資料夾

  • @weilysusanto9218
    @weilysusanto9218 2 года назад +1

    我已经按照视频了的,但是为什么在bot.load_extension那一行会报错

    • @ackbl8723
      @ackbl8723 2 года назад

      是因為沒在if內嗎tab的空格要注意看看

  • @laude94wuo
    @laude94wuo 2 года назад

    很清楚!!! 但麥克風有點小回音好困擾www

  • @151.04黃品綸
    @151.04黃品綸 4 года назад +1

    請問要如何自定義help?

    • @Proladon
      @Proladon  4 года назад

      再寫一個command 直接取名叫 help 就會覆蓋原本的help了

    • @151.04黃品綸
      @151.04黃品綸 4 года назад

      所以要加上面那一行嗎 還是不用??

    • @Proladon
      @Proladon  4 года назад +3

      抱歉忘記回
      你可以remove掉
      或是在最一開始的 bot=commands.Bot(prefix='-', help_command=None)
      加上 help_command = None
      就可以自定義help

    • @151.04黃品綸
      @151.04黃品綸 4 года назад

      @@Proladon 謝謝,但是我還是有一個問題。如果要關閉私人聊天指令的話,需要每一個指令都加If判斷式嗎?

    • @joshuachan6317
      @joshuachan6317 3 года назад

      @@151.04黃品綸 不需要。你可以上網搜尋一下 syntactic sugar 還有 decorator. 做起來會比每個指令加一個 if 好很多

  • @GaGa._.
    @GaGa._. 2 года назад +1

    您好,雖然影片有點久了,但還是很有幫助
    也有在一開始就進行intents的調整
    但是我在最後一步出了問題,希望您能替我解惑,終端機的錯誤如下:
    >>Bot is online

    • @Proladon
      @Proladon  2 года назад +1

      你的碼能貼上來嗎?

    • @GaGa._.
      @GaGa._. 2 года назад +1

      @@Proladon
      from ast import For
      from email.policy import default
      from fileinput import filename
      import discord
      from discord.ext import commands
      import json
      import os
      with open('setting.json', mode='r', encoding='utf8') as jfile:
      jdata = json.load(jfile)
      intents = discord.Intents.all()
      bot = commands.Bot(command_prefix='%',intents = intents)
      #機器人啟動訊息
      @bot.event
      async def on_ready():
      print(">>Bot is online

    • @GaGa._.
      @GaGa._. 2 года назад

      @@Proladon 修好了,發現是忘記打底線,謝謝

  • @YUIOO1748
    @YUIOO1748 3 года назад +1

    請問我在今天做完練習後我的ping功能壞掉該怎麼辦呢?,'Main' object has no attribute 'bot' ,他是顯示我的main裡面沒有bot的這個錯誤。(已經解決)

    • @YUIOO1748
      @YUIOO1748 3 года назад

      @commands.command()
      async def ping(self, ctx):
      await ctx.send(f"{round(self.bot.latency*1000)} (ms)")

    • @YUIOO1748
      @YUIOO1748 3 года назад

      原來是我在classes.py裡面的定義有打錯字