목차
개요
디스코드를 사용하는데 솔직히 가장 많이 사용 할 때에는 게임을 할 때이다. 그런 우리들에게 서버에 접속을 할 때마다 명언을 날려주어 정신을 차리게 해주는 기능을 집어 넣으면 어떨까?
Beautiful Soup로 파싱해오기
명언을 랜덤으로 제공하는 온라인 사이트의 구조를 확인하여 명언이 들어있는 부분을 가져오게 하였다.
http://munit.co.kr/lucky/today_proverb.php <<< 사용한 홈페이지
BS4와 원하는 부분 가져오는 방법에 대해서 더 자세히 알아보기 ⬇⬇⬇
위의 포스팅과 다른 점은 이 사이트가 .php 의 형식으로 이루어져 있기 때문에 가져올때 그냥 html 로 가져오게 되면 str 형식으로 들어와서 한글 형식이 깨지게 된다. 따라서 utf-8 형식으로 파싱을 시도해야한다.
디스코드 봇에 적용하기
위에서 테스트를 했을 때 잘 작동되는 것이 확인 되면 이전 포스팅에서 입력하였던 '안녕' 대신에 명령어를 출력부에는 파싱하여 받아온 명언을 집어넣으면 된다.
import discord
import requests
from bs4 import BeautifulSoup
client = discord.Client()
def get_myeongan():
response = requests.get("http://munit.co.kr/lucky/today_proverb.php")
soup = BeautifulSoup(response.content.decode(
'utf-8', 'replace'), 'html.parser')
main = soup.find("div").text
return (main)
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('!명언'):
quote = get_myeongan()
await message.channel.send(quote)
client.run('토큰 삽입')
함수 get_myeongan 을 삽입하여 웹에서 랜덤한 명언을 가져오게 하였다.
디버깅 및 여러 조건 넣어주기
위의 코드를 실행하여 보면
항상 뒤에 필요없는 글이 나오는것이 보인다. 항상 refresh 가 나오는 것을 보아 bs4로 파싱한 div 내에 refresh 버튼에 대한 텍스트도 포함 되었던것 같다.
main = soup.find("div").text
return (main)
main = soup.find("p").text
return (main)
div 내의 <p> 만 불러오게 바꿔주었다.
import requests
from bs4 import BeautifulSoup
def get():
response = requests.get("http://munit.co.kr/lucky/today_proverb.php")
soup = BeautifulSoup(response.content.decode(
'utf-8', 'replace'), 'html.parser')
main = soup.find("p").text
if len(main) <= 100:
print(main)
else:
print('repeat')
get()
get()
테스트 코드에서 명언의 길이가 100을 넘어가면 또 다시 get을 호출하여 새로운 명언을 가져오게 하였다.
else 문의 repeat를 출력하라고 한 이유는 홈페이지 내에 있는 명언의 대부분이 100자가 넘어가게 되면 엄청난 시간지연이 발생할 것이기 때문에 테스트를 해보기 위해 출력을 해보았다.
'미사용 > Discord bot' 카테고리의 다른 글
디스코드 봇 만들기 :: 음악 재생 기능추가 (1) - lavalink 세팅 (0) | 2022.08.30 |
---|---|
디스코드 봇 만들기 :: API 사용법 및 연결 테스트 (0) | 2022.08.05 |
디스코드 봇 만들기 :: 봇 생성 및 개발환경 세팅 (0) | 2022.08.03 |