如何用 ChatGPT 寫一個 Discord 內容收藏書籤機器人?架設在 NAS DSM 7.2 Container Manager
雷蒙三十・生活黑客社群主理人 中文世界最完整的 Notion 課程講師 數位工具、生產力專家
<aside> <img src="/icons/user-circle-filled_green.svg" alt="/icons/user-circle-filled_green.svg" width="40px" /> 讓每一個人從工具中獲得力量,享受科技的樂趣,找到生活的掌握感
自由工作者經歷:
- Medium 平台寫文(Top Writer in Productivity),成為自由講師,TEDx 演講和知識春晚萬人直播
- 到主持 雷蒙三十 Podcast 播客節目(創業分類第一),經營個人網站&電子報訂閱(7000+ 人)
- 2022 年開始裝修智能工作宅後,和老婆柚子踏入影片創作的行列,嘗試各種不同的創作載體
更多關於雷蒙,請至:關於雷蒙
</aside>
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