如何用 ChatGPT 寫一個 Discord 內容收藏書籤機器人?架設在 NAS DSM 7.2 Container Manager

本文作者:侯智薰(雷蒙)

雷蒙三十・生活黑客社群主理人
中文世界最完整的 Notion 課程講師
數位工具、生產力專家

雷蒙三十・生活黑客社群主理人 中文世界最完整的 Notion 課程講師 數位工具、生產力專家

<aside> <img src="/icons/user-circle-filled_green.svg" alt="/icons/user-circle-filled_green.svg" width="40px" /> 讓每一個人從工具中獲得力量,享受科技的樂趣,找到生活的掌握感

自由工作者經歷:


更多關於雷蒙,請至:關於雷蒙

傳送門 - 雷蒙三十 x 柚智夫妻 - 社群媒體與聯絡我們

</aside>

剪刀分隔線左.png

bot.py

import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.messages = True
intents.reactions = True
intents.members = True
intents.message_content = True

bot = commands.Bot(command_prefix="!", intents=intents)

BOOKMARK_EMOJI = "🔖"# 定義書籤表情符號

@bot.event
async def on_ready():
	print(f"{bot.user} 已經成功登入!")

@bot.event
async def on_raw_reaction_add(payload):
    print("Reaction detected.")
    print(f"Emoji: {payload.emoji}")

    if str(payload.emoji) == BOOKMARK_EMOJI:
        print("Bookmark emoji detected.")

        guild = bot.get_guild(payload.guild_id)
        channel = bot.get_channel(payload.channel_id)

        if channel is None:
            print("Channel not found.")
            return

        message = await channel.fetch_message(payload.message_id)
        print(f"Message content: {message.content}")

        user = await bot.fetch_user(payload.user_id)
        bookmark_message = f"這是你在「 {channel.name} 」收藏的內容 by {message.author}\\n\\n{message.content}\\n\\n查看原始訊息:{message.jump_url}\\n------\\n"
        
        try:
            await user.send(content=bookmark_message)
        except Exception as error:
            error_message = f"無法給用戶 {user} 發送書籤私人訊息。錯誤信息:{error}"
            print(error_message)
            await notify_admin_on_error(error_message)

@bot.event
async def on_thread_join(thread):
    @bot.event
    async def on_raw_reaction_add_in_thread(payload):  # 修改函數名稱和參數
        print("Reaction detected.")
        print(f"Emoji: {payload.emoji}")

        if str(payload.emoji) == BOOKMARK_EMOJI:
            print("Bookmark emoji detected.")

            guild = bot.get_guild(payload.guild_id)
            channel = bot.get_channel(payload.channel_id)

            if channel is None:
                print("Channel not found.")
                return

            message = await channel.fetch_message(payload.message_id)

            if payload.member.bot:  # 使用 payload.member 判斷是否為機器人
                return

            bookmark_message = f"這是你在「 {channel.name} 」收藏的內容 by {message.author}\\n\\n{message.content}\\n\\n查看原始訊息:{message.jump_url}\\n------\\n"
            await payload.member.send(content=bookmark_message)  # 使用 payload.member 發送私人訊息

import traceback

# 將 YOUR_DISCORD_USER_ID 替換為您的用戶 ID(必須是數字)
YOUR_DISCORD_USER_ID = 

async def notify_admin_on_error(error_message):
    admin_user = await bot.fetch_user(YOUR_DISCORD_USER_ID)
    await admin_user.send(content=f"機器人遇到錯誤:\\n{error_message}")

@bot.event
async def on_error(event, *args, **kwargs):
    exc_info = sys.exc_info()
    error_message = ''.join(traceback.format_exception(*exc_info))
    await notify_admin_on_error(error_message)

# 將 BOT TOKEN 換成你在 Discord Developer Portal 取得的 BOT API
bot.run("BOT_TOKEN")

"""
此 Discord 內容收藏機器人的 python 程式碼製作 by 侯智薰(雷蒙)
Python code for this Discord bookmarker Bot, made by Raymond Hou

完整教學和說明:<https://raymondhouch.com/discord-bot-bookmarker>
Full tutorial and explanation: <https://raymondhouch.com/discord-bot-bookmarker>
"""

requirements.txt

discord.py

在 Container Manager 建立專案時的 yaml

version: '3.8'
services:
  discord_bot:
    image: python:latest
    command: /bin/bash -c "pip install -r /app/requirements.txt && python /app/bot.py"
    volumes:
      - {你存放 bot.py 程式碼的資料夾路徑}:/app
    restart: unless-stopped