iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0

昨天原本我也打算用身份組及join time但兩者都遇到了一點問題,後來發現是思路上的問題,我把問題想得太複雜了

1.身份組

一開始我以為可以用取得ID一樣的方式用fetch_member,後來我查了一些資料,如果要取得身份組就一定要先取得伺服器ID(Guild ID),後來嘗試了幾次也問過GPT但是GPT都給我怪怪得解法且無法解決,後來我想到可以用跟取得User ID一樣的思路,先取得伺服器ID再透過伺服器ID取得伺服器成員然後再取的成員資訊,這樣就可以取得成員的身份組

程式碼

from discord.ext import commands 
import discord

intents = discord.Intents.all()

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

import re


@bot.command()  
async def userinfo(ctx, user_mention):

    user_id = re.search(r'\d+', user_mention).group()
  
    user = await bot.fetch_user(user_id)
    guild = ctx.guild
    member = await guild.fetch_member(user_id)
    roles = member.roles
    roles = roles[1:]  

    await ctx.send(f"User name: {user.name}\n, ID: {user.id}\n, 身份組:{[r.name for r in roles]}")

bot.run(‘token’)

程式碼說明

  1. 導入需要的模塊re: 正則表達式
  2. 使用@bot.command()創建一個userinfo命令
  3. 從傳入的參數user_mention(標記的人)中用正則表達式提取出用戶ID
  4. 透過上下文獲取伺服器ID
  5. 將提取出的用戶ID傳入bot.fetch_user()獲取對應的User對象
  6. 用guild.fetch_member()獲取該伺服器內的成員
  7. 取得身份組並跳過第一個預設的身份組(everyone)
  8. 通過User取用name和id屬性獲取使用者資訊,取用member所有的role name(不寫這個會連role ID都印出來)
  9. 使用ctx.send()將獲取的使用者資訊傳送出去

執行結果
https://ithelp.ithome.com.tw/upload/images/20230917/20161116DqkNCRiCWT.png

錯誤寫法

@bot.command()
async def userinfo(ctx, user_mention):

role_names = re.findall(r'\| (\w+)', user_mention)
  
await ctx.send(f"Roles: {', '.join(role_names)}")

這個事GPT給我的解法她會遇到的問題是印不出身份組,如下圖

https://ithelp.ithome.com.tw/upload/images/20230917/20161116CA7FJEeeYt.png

2.join time

原本不取得join_time是因為我以為如果要用join_time就一定要用到guild在輸入指令時一定要輸入guild ID,這就需要使用者先知道guild ID
後來我發現可以用跟查看身份組一樣的寫法來解決

程式碼

from discord.ext import commands 
import discord
import re

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

@bot.command()  
async def userinfo(ctx, user_mention):

    user_id = re.search(r'\d+', user_mention).group()
  
    user = await bot.fetch_user(user_id)
    guild = ctx.guild
    member = await guild.fetch_member(user_id)
    roles = member.roles
    roles = roles[1:]  
    joined_at = member.joined_at


    await ctx.send(f"User name: {user.name}\n, ID: {user.id}\n, 身份組:{[r.name for r in roles]}\n, Join time{joined_at}")

bot.run(‘token’)

程式碼解釋
跟身份組的是一樣的,只是多了取用join time

執行結果
https://ithelp.ithome.com.tw/upload/images/20230917/20161116lnQd9tngTa.png


上一篇
[Day10]用ctx來查看username、id及Guild資訊
下一篇
[Day12]警告成員
系列文
使用discord.py開發自己的機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言