iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
AI/ ML & Data

AI 學習紀錄系列 第 29

Day 29: Discord Bot + Gemini

  • 分享至 

  • xImage
  •  

繼續測試前,一樣先沿用最簡單的範例,新增接接收訊息、收影像跟傳送影像這三個功能。
參考以下程式。

  • import urllib.request,用來透過 url 取得影像
  • Echo 中,從 ctx.message.content 中取得使用者輸入的整串內容,再把指令後的訊息取出回復。
  • getImg 用來傳送影像給使用者,with open 開啟要傳送的影像後,用 discord.File 包起來,就可以用 send 傳送出去了。
  • sendImg 用來接收使用者傳送的影像。
  • 用 add_header 加上 header,避免 403 forbidden
  • 透過 write 把取得的 content 寫出成影像。
import discord
from discord.ext import commands
import urllib.request

intents = discord.Intents.default()
intents.message_content = True

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

@bot.event
async def on_ready():
    print(f"目前登入身份 --> {bot.user}")

@bot.command()
async def Hello(ctx):
    await ctx.send("Hello, world!")
    
@bot.command()
async def Echo(ctx):
    message = ' '.join(str(ctx.message.content).split(' ')[1:])
    await ctx.send(message)

@bot.command()
async def getImg(ctx):
    with open('testImg.png', 'rb') as f:
        img = discord.File(f)
        await ctx.send(file=img)

@bot.command()
async def sendImg(ctx):
  request = urllib.request.Request(ctx.message.attachments[0].url)
  request.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64)')
  content = urllib.request.urlopen(request).read()
  output = open(f"{ctx.message.author.id}.png", "wb")
  output.write(content)
  output.close()
  await ctx.send("work")

bot.run("your discord token")

結果:
https://ithelp.ithome.com.tw/upload/images/20240914/201683180DVZb4qcNT.png

接下來串串 Gemini,照之前的方式處理環境、設定、提問的方式等可以參考 Day 3。
其他參考以下程式。

  • 加了一個 cacheChat,用來存不同使用者的 chat。
  • Hello 回覆稍微調整過,改成回覆傳訊息的使用者的顯示名稱與帳號。
  • magicConch 用來與 Gemini 對話,discord 有回覆的長度限制,訊息過長會有 Must be 2000 or fewer in length 的錯誤,所以我直接改用 stream 的方式來回傳訊息。
  • isThisPigeon 用來處理圖片訊息。加上點行程式,用來確認使用者上傳圖片時,有沒有加上問題。
  • 回傳時多使用了一個 discord.Embed,一樣是為了要避免回覆過長。當然 Embed 也有限制,只是展示不同的功能供參考。https://discordjs.guide/popular-topics/embeds.html#embed-preview
import google.generativeai as genai
import discord
from discord.ext import commands
import urllib.request
import PIL.Image

genai.configure(api_key = 'your Gemini token')
model = genai.GenerativeModel('gemini-1.5-flash')

cacheChat = {}

intents = discord.Intents.default()
intents.message_content = True

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

@bot.event
async def on_ready():
    print(f"目前登入身份 --> {bot.user}")

@bot.command()
async def Hello(ctx):
    await ctx.send(f"Hello, {ctx.message.author.global_name}({ctx.message.author.name}).")

@bot.command()
async def magicConch(ctx):
    global cacheChat

    message = ' '.join(str(ctx.message.content).split(' ')[1:])
    if ctx.message.author.id not in cacheChat.keys():
        cacheChat[ctx.message.author.id] = model.start_chat(history = [])

    response = cacheChat[ctx.message.author.id].send_message(message, stream = True)
    for chunk in response:
        await ctx.send(chunk.text)

@bot.command()
async def isThisPigeon(ctx):
    request = urllib.request.Request(ctx.message.attachments[0].url)
    request.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64)')
    content = urllib.request.urlopen(request).read()

    output = open(f"{ctx.message.author.id}.png", "wb")
    output.write(content)
    output.close()

    image = PIL.Image.open(f'{ctx.message.author.id}.png')
    
    message = ' '.join(str(ctx.message.content).split(' ')[1:])
    if(len(message) == 0):
        response = model.generate_content(image)
    else:
        response = model.generate_content([message, image])

    embed = discord.Embed(title = f"Gemini", description = f"{response.text}")
    await ctx.send(embed = embed)

bot.run("your discord token")

結果:
https://ithelp.ithome.com.tw/upload/images/20240914/20168318BkDaVZOVNj.png
阿財鍋貼在台北,也沒看到有賣麵,老牌張豬腳賣的是豬腳飯,也沒有麵線或酸辣湯,已讀亂回耶 Gemini。

回覆影像相對正常不少。
https://ithelp.ithome.com.tw/upload/images/20240914/20168318KrTbTU0vvC.png
https://ithelp.ithome.com.tw/upload/images/20240914/20168318eJCeg11IlS.png


上一篇
Day 28 : Discord Bot + LLM
下一篇
Day 30: Discord Bot + Stable Diffusion or Stable Cascade
系列文
AI 學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言