일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Tkinter
- array
- gas
- SQL
- google apps script
- 파이썬
- PostgreSQL
- string
- Java
- hive
- Redshift
- Kotlin
- PANDAS
- Excel
- Google Spreadsheet
- c#
- numpy
- Github
- Google Excel
- Mac
- matplotlib
- math
- dataframe
- Python
- list
- PySpark
- Apache
- django
- GIT
- Today
- Total
달나라 노트
Python Discord : message 작성자 정보 불러오기, message author, discord 사람 태그하기 (Python Discord API) 본문
Python Discord : message 작성자 정보 불러오기, message author, discord 사람 태그하기 (Python Discord API)
CosmosProject 2022. 2. 21. 23:10
Python discord API를 사용할 때 어떤 메세지의 작성자를 불러오는 방법이 있습니다.
먼저 discord.ext.commands를 사용하는 경우입니다.
from discord.ext import commands
discord_token = 'token_string'
client = commands.Bot(command_prefix='/')
@client.event
async def on_ready():
print('{} logged in.'.format(client))
print('Bot: {}'.format(client.user))
print('Bot name: {}'.format(client.user.name))
print('Bot ID: {}'.format(client.user.id))
@client.command(name='작성자')
async def author_test(ctx):
author = ctx.message.author
author_id = ctx.message.author.id
author_name = ctx.message.author.name
message_contents = ctx.message.content
str_result = '''
author = {author}
author ID = {author_id}
author name = {author_name}
message contents = {message_contents}
<@{author_id}>
'''.format(author=author,
author_id=author_id,
author_name=author_name,
message_contents=message_contents)
await ctx.send(str_result)
client.run(discord_token)
명령어를 통해 /작성자 라는 명령어를 discord에 입력하면 그 명령어를 보낸 작성자 정보를 return해주는 discord bot code입니다.
async def author_test(ctx):
author = ctx.message.author
author_id = ctx.message.author.id
author_name = ctx.message.author.name
message_contents = ctx.message.content
가장 중요한건 이 부분입니다.
discord.ext.commands를 사용할 때 모든 코루틴 함수가 첫 번째 인자로 받는 ctx(context 객체)는 discord와 소통하기 위한 많은 정보를 포함하고있습니다.
그 중 하나가 바로 명령어를 입력한 작성자 정보입니다.
작성자는 ctx.message.author~~ 로 알 수 있습니다.
val_message_contents = ctx.message.content
그리고 참고용으로 이 부분도 써놨는데 ctx.message.content는 메세지의 내용을 담고있습니다.
제가 위 명령어를 호출할 때 /작성자 라는 명령어를 discord에 입력했으니 ctx.message.content는 /작성자 라는 텍스트를 그대로 담고있을겁니다.
각 값들에 대한 결과는 아래와 같습니다.
async def author_test(ctx):
author = ctx.message.author # test_id#5613
author_id = ctx.message.author.id # 68406436219813598413
author_name = ctx.message.author.name # test_id
message_contents = ctx.message.content # /작성자
여기서 author.id는 discord API에서 사용자를 구분할 때 사용합니다.
따라서 이렇게 명령어를 입력한 작성자의 author.id를 알면 많은 것을 할 수 있습니다.
위 예시를 다시 봅시다.
from discord.ext import commands
discord_token = 'token_string'
client = commands.Bot(command_prefix='/')
@client.event
async def on_ready():
print('{} logged in.'.format(client))
print('Bot: {}'.format(client.user))
print('Bot name: {}'.format(client.user.name))
print('Bot ID: {}'.format(client.user.id))
@client.command(name='작성자')
async def author_test(ctx):
author = ctx.message.author
author_id = ctx.message.author.id
author_name = ctx.message.author.name
message_contents = ctx.message.content
str_result = '''
author = {author}
author ID = {author_id}
author name = {author_name}
message contents = {message_contents}
<@{author_id}>
'''.format(author=author,
author_id=author_id,
author_name=author_name,
message_contents=message_contents)
await ctx.send(str_result)
client.run(discord_token)
author_test 함수를 보면 ctx.message.author 로부터 작성자 정보를 불러낸 후,
그것을 str_result에 입력을 해서 그 결과를 discord에 보냅니다.
str_result를 보면 <@{author_id}> 라는 부분이 있습니다.
discord에서는 @를 입력한 후 채널에 있는 누군가의 id를 입력하면 태그가 되며 상대방에게 알림이 갑니다.
우리가 discord 채팅창에서 직접 사용할 때에는 그냥 @를 적은 후 상대방의 discord id를 적으면 태그 목록이 뜨면서 태그가 됩니다.
하지만 실제 이 태그는 <@author_id>의 형식으로 이뤄져있으며 예를들면 아래와 같습니다.
<@103765028374105>
따라서 명령어를 입력한 작성자 ID(ctx.message.author.id)를 얻어와서 그 작성자를 discord bot이 태그하여 알림을 주도록 할 수 있는 것이죠.
다음은 discord.ext.commands가 아니라 일반 discord 모듈을 사용하는 경우 author를 불러오는 예시입니다.
import discord
discord_token = 'token_string'
client = discord.Client()
@client.event
async def on_ready():
print('{} logged in.'.format(client))
print('Bot: {}'.format(client.user))
print('Bot name: {}'.format(client.user.name))
print('Bot ID: {}'.format(client.user.id))
@client.event
async def on_message(message):
if message.author == client.user:
return
elif message.content.startswith('hello'):
author = message.author
author_id = message.author.id
author_name = message.author.name
message_contents = message.content
str_result = '''
author = {author}
author ID = {author_id}
author name = {author_name}
message contents = {message_contents}
<@{author_id}>
'''.format(author=author,
author_id=author_id,
author_name=author_name,
message_contents=message_contents)
await message.channel.send(str_result)
client.run(discord_token)
맥락은 처음에 봤던 예시와 거의 동일합니다.