본문 바로가기

Python/파이썬 프로젝트

[모듈 2-13] 파이썬 웹크롤링(급식정보 디스코드 봇 만들기)

1. 서울시교육청 나이스 급식 정보

 

stu.sen.go.kr/sts_sci_md01_001.do?schulCode=B100000579&schulCrseScCode=4&schulKndScCode=04&schMmealScCode=2&schYmd=20201218

 

주간식단

 

stu.sen.go.kr

 

2. 정확한 학교 급식 접근 URL 구조

 

http://stu.sen.go.kr/sts_sci_md01_001.do?schulCode=B100000579&schulCrseScCode=4&schulKndScCode=04&schMmealScCode=2&schYmd=2020.12.18

 

나의생활 > 학교안내 > 기본정보 에서 자신의 학교를 검색하고

해당 페이지의 쿠키값을 확인하면 우리에게 필요한 값들을 얻을 수 있습니다.

 

schulCode=B100000579    #우리가 검색한 학교의 고유 코드이다. // 현재 경기기계공업고등학교

schulKndScCode=04    #01은 유치원, 02는 초등학교, 03은 중학교, 04는 고등학교를 의미한다.

schulCrseScCode=4    #1은 유치원, 2는 초등학교, 3은 중학교, 4는 고등학교를 의미한다.

 

 

 

 

3. 경기기계공업고등학교 학교 코드 확인

import requests
import json
url = 'https://schoolmenukr.ml/code/api?q=경기기계공업고등학교'
response = requests.get(url)
school_infos = json.loads(response.text)
print(school_infos)

 

 

 

4. 급식정보 받아오기

import requests
from bs4 import BeautifulSoup
import datetime
import re

now = str(datetime.datetime.now())
day = now[:4] + now[5:7] + now[8:10]

print(day)

req = requests.get("http://stu.sen.go.kr/sts_sci_md01_001.do?schulCode=B100000579&schulCrseScCode=4&schulKndScCode=04&schMmealScCode=2&schYmd=20201218")
#print(req.text)
soup = BeautifulSoup(req.text, "html.parser")
#print(soup)
element = soup.find_all("tr")
#print(element[2])
element = element[2].find_all('td')

element = element[5]  # num
element = str(element)
element = element.replace('[', '')
element = element.replace(']', '')
element = element.replace('<br/>', '\n')
element = element.replace('<td class="textC last">', '')
element = element.replace('<td class="textC">', '')
element = element.replace('</td>', '')
element = element.replace('(h)', '')
element = element.replace('.', '')
element = re.sub(r"\d", "", element)

print(element)

 

 

 

5. 디스코드 봇 파이썬 서버 코드

# discord 라이브러리 사용 선언
import discord
import requests
from bs4 import BeautifulSoup
import datetime
import re

class chatbot(discord.Client):
    # 프로그램이 처음 실행되었을 때 초기 구성
    async def on_ready(self):
        # 상태 메시지 설정
        # 종류는 3가지: Game, Streaming, CustomActivity
        game = discord.Game("내용")

        # 계정 상태를 변경한다.
        # 온라인 상태, game 중으로 설정
        await client.change_presence(status=discord.Status.online, activity=game)

        # 준비가 완료되면 콘솔 창에 "READY!"라고 표시
        print("READY")

    # 봇에 메시지가 오면 수행 될 액션
    async def on_message(self, message):
        # SENDER가 BOT일 경우 반응을 하지 않도록 한다.
        if message.author.bot:
            return None

        # message.content = message의 내용
        if message.content == "바보":
            # 현재 채널을 받아옴
            channel = message.channel
            # 답변 내용 구성
            msg =  "너도 바보"
            # msg에 지정된 내용대로 메시지를 전송
            await channel.send(msg)
            return None


# 프로그램이 실행되면 제일 처음으로 실행되는 함수
if __name__ == "__main__":
    # 객체를 생성
    client = chatbot()
    # TOKEN 값을 통해 로그인하고 봇을 실행
    client.run("Nzg5NDQ5ODI2MjczMTk4MTAw.X9yOcQ.GYQVzKRp4ezVi54Qg2l4JsgOCZk")

 

 

디스코드 봇 만들기 추가 자료

blog.naver.com/wpdus2694/221192640522

 

[디스코드] 디스코드 봇 만들기 - [1] 앱 등록

요즘 스카이프라는 인터넷 통화 프로그램이 디스코드라는 프로그램으로 대체되는 듯하다. 이 디스코드라는 ...

blog.naver.com

 

 

 

6. 급식 정보 제공 디스코드 봇 파이썬 서버 코드

# discord 라이브러리 사용 선언
import discord
import requests
from bs4 import BeautifulSoup
import datetime
import re
now = str(datetime.datetime.now())
day = now[:4] + now[5:7] + now[8:10]

print(day)

req = requests.get("http://stu.sen.go.kr/sts_sci_md01_001.do?schulCode=B100000579&schulCrseScCode=4&schulKndScCode=04&schMmealScCode=2&schYmd=2020.12.18")
#print(req.text)
soup = BeautifulSoup(req.text, "html.parser")
#print(soup)
element = soup.find_all("tr")
#print(element[2])
element = element[2].find_all('td')

element = element[5]  # num
element = str(element)
element = element.replace('[', '')
element = element.replace(']', '')
element = element.replace('<br/>', '\n')
element = element.replace('<td class="textC last">', '')
element = element.replace('<td class="textC">', '')
element = element.replace('</td>', '')
element = element.replace('(h)', '')
element = element.replace('.', '')
element = re.sub(r"\d", "", element)

print(element)

class chatbot(discord.Client):
    # 프로그램이 처음 실행되었을 때 초기 구성
    async def on_ready(self):
        # 상태 메시지 설정
        # 종류는 3가지: Game, Streaming, CustomActivity
        game = discord.Game("내용")

        # 계정 상태를 변경한다.
        # 온라인 상태, game 중으로 설정
        await client.change_presence(status=discord.Status.online, activity=game)

        # 준비가 완료되면 콘솔 창에 "READY!"라고 표시
        print("READY")

    # 봇에 메시지가 오면 수행 될 액션
    async def on_message(self, message):
        # SENDER가 BOT일 경우 반응을 하지 않도록 한다.
        if message.author.bot:
            return None

        # message.content = message의 내용
        if message.content == "오늘급식":
            # 현재 채널을 받아옴
            channel = message.channel
            # 답변 내용 구성
            msg =  element
            # msg에 지정된 내용대로 메시지를 전송
            await channel.send(msg)
            return None


# 프로그램이 실행되면 제일 처음으로 실행되는 함수
if __name__ == "__main__":
    # 객체를 생성
    client = chatbot()
    # TOKEN 값을 통해 로그인하고 봇을 실행
    client.run("Nzg5NDQ5ODI2MjczMTk4MTAw.X9yOcQ.GYQVzKRp4ezVi54Qg2l4JsgOCZk")

 

 

7. 동작 확인

서울시교육청 나이스 -> 파이썬 서버 피씨

 

 

파이썬 서버 피씨 -> 디스코드 봇