소프트웨어/Python

학식 데이터를 크롤링하는 파이썬코드로 디스코드 학식 봇 만들기 (2/3)

충무로술겜마 2020. 3. 20. 04:03

https://sheepjin99.tistory.com/21

이 포스트를 읽기 이전에 읽어두시면 좋은 1편입니다.

 

학식 데이터를 크롤링하는 파이썬코드로 디스코드 학식 봇 만들기 (1/3)

오랜만입니다! 요즘 온 나라가 코로나 바이러스 때문에 힘드네요 ㅠㅠ 저도 학교 개강이 미뤄지고 싸이버강의를 들으며 공부하고 있습니다. 원래는 개강하기 전에 완성하려고 했던 디스코드 학식봇을 지금 완성해..

sheepjin99.tistory.com

저번편에 이어서 디스코드 봇을 만들어보겠습니다.

 

저희가 사용할 디스코드 봇 모듈은 Discord.py라는 패키지로 여기서 확인하실 수 있습니다. https://github.com/Rapptz/discord.py

 

일단 디스코드 봇의 뼈대를 만들어보겠습니다. 

https://discordapp.com/developers/

 

Discord Developer Portal — API Docs for Bots and Developers

Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.

discordapp.com

에 들어가서 새로운 프로젝트를 만들고, 봇을 만들어줍니다. 

프로젝트를 만들면 이런 화면이 나올텐데요, 이건 프로젝트 화면입니다.

우리는 봇을 만들어야하니 옆에 있는 Bot 항목에 들어갑니다.

여기서 봇의 이름과 아이콘을 정할 수 있고, 저기 보이는 'Click to Reveal Token'은 봇의 고유 토큰입니다. 아무한테도 알려져서는 안되는 중요한 정보이니, 각별히 주의해주세요! (깃헙에 실수로 올라가면 디스코드측에서 알아서 바꿔주긴 합니다만, 조심해야죠.)

 

이후 OAuth2 항목에 들어가서

SCOPES에서 'bot'선택하면 밑에 봇 권한을 줄 수 있습니다.

우리는 명령어를 듣고, 메세지를 쓸 수 있으면 되니깐 'Send Messages'와 'Read Message History'를 선택하면 위에 우리 그리고 다른 사람들이 내 봇을 추가할 수 있는 URL이 생성됩니다!

 

https://discordapp.com/api/oauth2/authorize?client_id=686581468901802035&permissions=67584&scope=bot

 

Discord - Free voice and text chat for gamers

Step up your game with a modern voice & text chat app. Crystal clear voice, multiple server and channel support, mobile apps, and more. Get your free server now!

discordapp.com

이런식으로요.

이제 이 봇을 나만의 채널에 추가하면 봇의 틀이 생겼습니다.

그런데 이 친구는 아무것도 못하는 깡통같은 존재에요. 안에 아무런 정보도 들어있지 않기 때문이죠.

 

 

이제 우리는 다시 파이썬으로 돌아와서, Discord.py를 사용하여 코딩을 해보겠습니다.

저번에 크롤링 코딩했던 파일에 쓰셔도 되고, 따로 만들어서 관리하셔도 됩니다. (나중에 import를 통해 크롤링 모듈로 불러와주세요.)

import discord
client = discord.Client()

@client.event
async def on_ready():
   print('Logged in as')
   print(client.user.name)
   print(client.user.id)
   print('------')

@client.event
async def on_message(message):
   if message.content.startswith('!안녕'):
      await message.channel.send('안녕하세요.')
   elif message.content.startswith('!반가워요'):
      await message.channel.send('저도 반가워요.')

client.run('봇 토큰')

일단 가장 기본적인 틀은 이런식입니다. 

아까 홈페이지에 있던 봇 토큰을 복사해서 client.run() 안에 넣어주면 실행이되고, 메세지 채널에서 !안녕 이라는 명령을 치면 안녕하세요. 라는 답변이 오고 !반가워요 라는 명령을 치면 저도 반가워요라는 메세지를 답장할 것입니다.

 

정말 간단하죠? 저희가 디스코드 봇에게 바라는건 명령을 듣고, 원하는 데이터를 보내주는것이니, 전에 했던 크롤링 데이터를 적절한 명령어에 따라 적절하게 보내주기만 하면 됩니다!

 

예를 들어, 저번에 sangrok_3f라는 함수를 통해 웹사이트의 데이터를 크롤링했죠? 

그럼 우리는 !상록원3층 이라는 명령어가 들어오면 그 데이터를 보내주기로 합시다.

 

sangrokwon3flunch = discord.Embed(title="상록원 3층 중식메뉴", description="\n----- 상록원 집밥 -----\n" + sangrok_3f_jipbab_lunch + '\n----- 상록원 한그릇 -----\n' + sangrok_3f_hangurut_lunch + '\n----- 상록원 채식당 -----\n' + sangrok_3f_vegeterian, color=0x00ff00)


@client.eventasync def on_message(message):
if message.content.startswith('!상록원3층'):
   if hour >= 14: # 오후 2시 이후에는 석식 메뉴를 보여줌
      await message.channel.send(embed=MenuCollection.sangrokwon3fdinner)
   else:
      await message.channel.send(embed=MenuCollection.sangrokwon3flunch)

이런식으로 구현하면, !상록원3층 이라는 명령이 들어오면 2시 전에는 중식메뉴, 2시 이후에는 석식메뉴를 메세지채널에 보냅니다.

 

이를 응용하면 모든 메뉴에 적용이 가능하겠죠?

지금은 이해가 안될 코드부분도 있는데요, embed 같이 부가적인 내용은 3편에서 조금 다루도록 하겠습니다.

 

다음 3편은 이 서비스를 24시간 7일 내내 동작하게끔하는 서버단의 내용과, 이 디스코드 봇을 꾸미는 방법, 그리고 로그 파일 만드는 방법에 대해 다루겠습니다!

 

(부족한 부분이 있거나 문제가 있는 부분이 있으면 알려주세요! 급하게 작성하여 차차 수정해 나가겠습니다.)