๐ค ๋์ค์ฝ๋ ๋ด ๊ฐ๋ฐ์ผ์ง - 3
๐ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์ฝ๋์ ๋ฆฌ, ์นํฌ๋กค๋ง
์์ง์ ๋ด์ ๋ง์ ๊ธฐ๋ฅ์ด ์๊ธด๊ฑด ์๋์ง๋ง ๋์ค์ ์ํด์๋ ์ฝ๋๋ฅผ ์ ๋ฆฌํ๋๊ฒ ๋์๊ฑฐ๊ฐ๋ค๊ณ ์๊ฐํด์ ์ฐพ์๋ณด๋ค๊ฐ Cog๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฆฌํ ์ ์๋คํด์ ํด๋ดค๋๋ฐ
์ด๋ค ์์ผ๋ก ํ ์ง ์ฌ๋ฌ ์๋ฃ๋ค์ ์ฐพ๋ค๊ฐ event๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์ ์ธ ์ฝ๋๋ฐ์ ๋ชป ์ง๊ธฐ ๋๋ฌธ์ ์ด๋์ ๋ ์๋ จ๋๋ค๋ฉด event๋ฅผ ๋ฒ๋ฆฌ๋ผ๋ ์กฐ์ธ์ ๊ธ์ ๋ณด์๋ค.
์ง๊ธ๊น์ง ์ง ์ฝ๋์๋ event๊ฐ ํฌ์ฑ์ด์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์ ๋ฆฌํ๋ ๊น์ ๊ฐ์์๊ธฐ๋ก ๊ฒฐ์ ํ์๋ค.
#run.py
#run.py
import discord, asyncio, datetime, pytz, os
from discord.ext import commands
import os
client = commands.Bot(command_prefix="!") # ์ ๋์ฌ๋ฅผ ์ค์ ํด์ค๋ค.
for filename in os.listdir("basics"):
if filename.endswith(".py"):
client.load_extension(f"basics.{filename[:-3]}")
@client.event
async def on_ready():
print("๊ณ ๋จ๋ฏธ ๋ด์ด ์คํ๋ฉ๋๋ค.")
await client.change_presence(status=discord.Status.online, activity=discord.Game("๊ณ ๋จ๋ฏธ ๋ด์ " + str(len(client.guilds)) + "๊ฐ์ ์๋ฒ์ ์ ์ํ๊ณ ์์ด์!")) # ๋ด์ ์ํ๋ฉ์ธ์ง๋ฅผ ์ค์ ํ๋ค.
# ๋ด์ ์คํ์ํค๊ธฐ ์ํด์ ๋ด์ ํ ํฐ์ ์์ฑํ๋ ๊ณณ
client.run("ํ ํฐ ๊ฐ")
๋ฉ์ธ ์ฝ๋๋ ์ด๋ฐ์์ผ๋ก ์งฐ๋ค.
์ด์ฐจํผ ์ด๋ฏธ ์ง๋์ ์ฝ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ธ๋ฐฉ ์งค ์ค ์์๋๋ฐ, ํ์ด์ฌ์ ์ํ์ง๋ ์ค๋๋๊ณ ์๋ฃ๋ค์ ์ฐพ๋๋ค๊ณ ๋ค์ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
#simple.py
import discord, asyncio, datetime, pytz
from discord.ext import commands
from discord.utils import get
from discord import Member
client = commands.Bot(command_prefix='!')
class simple(commands.Cog):
def __init__(self, app):
self.app = app
@commands.command(name="์ธ์ฌ") # '!์ธ์ฌ' ๋ฅผ ์
๋ ฅํ๋ค๋ฉด
async def hi(self, ctx):
await ctx.send("{} | {} ๋ ์๋
ํ์ธ์!".format(ctx.author, ctx.author.mention)) # ์์ฑ๋ ์ฑ๋์ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
await ctx.author.send("{} | {} ๋ ์๋
ํ์ธ์!".format(ctx.author, ctx.author.mention)) # ์์ฑํ ์ ์ ์๊ฒ DM์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
@commands.command(name="์ ๋ณด") # '!์ ๋ณด'๋ฅผ ์
๋ ฅํ๋ค๋ฉด
async def information(self,ctx):
embed = discord.Embed(title="๊ณ ๋จ๋ฏธ", description="ํ๋ก์ ํธ์ฉ์ผ๋ก ๊ฐ๋ฐ์ค์ธ ๋ด",timestamp=datetime.datetime.now(pytz.timezone('UTC')), color=0x4c2896)
embed.add_field(name="๋ค์ํ ๊ธฐ๋ฅ๋ค ์ถ๊ฐ ์์ ", value="์๊ฐ๋ ๋๋ง๋ค ์ถ๊ฐํ ์์ ์
๋๋ค.", inline=False)
embed.add_field(name="GitHub", value="https://github.com/eastminn", inline=False)
embed.set_footer(text="Bot Made by ๊น๋๋ฏผ#0026, ๋ฌธ์๋ DM์ผ๋ก ๋ถํ๋๋ฆฝ๋๋ค ๐ฌ", icon_url="https://cdn.discordapp.com/attachments/955360993729449987/955392163158569021/IMG_20220320_042000_013.jpg")
embed.set_thumbnail(url="https://cdn.discordapp.com/attachments/794866894615085087/956481187780644935/99pk9saw36t7q8t3o0gt.jpg")
await ctx.send(embed=embed)
๋์ถฉ ์ด๋ฐ์์ผ๋ก ์ง๊ธ์ ๊ฐ๋จํ ๊ธฐ๋ฅ๋ง ์์ด์ ํ ํ์ผ์ ์ฝ๋๋ฅผ ๋ค ์ ์๋ค.
์ค๊ฐ์ ๊ฐ๋จํ๊ฒ ํด๊ฒฐ๋ ๋ฌธ์ ์ธ๋ฐ ๊ณ์ ์ก๊ณ ์์ด์ ๋๋ต 4์๊ฐ ์ ๋ ๊ฑธ๋ฆฐ๊ฑฐ๊ฐ๋ค.
๋ค๋ฅธ ๋ถ๋ถ์ ๊ฑฐ์ ๋๊ฐ์ด ๋ง๋ค๊ณ , ์ธ์ฆ ๊ธฐ๋ฅ ๋ถ๋ถ๋ง ์ด๋์ ๋ ์์ ์ ํ๋ค. ์๋๋ ๊ถํ์ ๋ฐ๋ผ ์ค๋ฅ๋ฉ์ธ์ง๋ ์ถ๋ ฅํ๊ฒ ํ๋ คํ๋๋ฐ
๊ณ์ ๋งํ์ ๋ค๋ฅธ ๋ถ๋ถ๋ถํฐ ๋ง๋ค๊ณ ๋์ค์ ์์ ๋ด์ผํ ๊ฑฐ ๊ฐ๋ค.
์๋ก์ด ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ์ถ์ด์ ์ต๊ทผ์ ๋ง์ด ๋ณธ ์นํฌ๋กค๋ง์ ํ์ฉํด์ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ๋ก ํ๋ค.
๋ฌด๋ํ ์ฃผ์ ๋ฅผ ์ฐพ๋ค๊ฐ ์ฝ๋ก๋ 19์ ๋ํ ์ ๋ณด๋ฅผ ํฌ๋กค๋งํด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.
์ฌ๊ธฐ์ ๋ฐ์ํํฉ์ ์๋ ์ผ์ผ ํ์ง, ์ฌ์ ์์ค์ฆ, ์ ๊ท ์ ์, ์ผ์ผ ์ฌ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์๋ค. ๊ฐ์ ธ์ค๊ณ ์ถ์ ์ ๋ณด์ ๋ง์ฐ์ค๋ฅผ ๋๊ณ ์ฐํด๋ฆญ์ ํด์ ๊ฒ์ฌ๋ฅผ ๋๋ฅด๊ณ ๊ฒ์ฌ์ฐฝ์ ๋ณด๊ณ ์ฝ๋๋ฅผ ์ง๋ฉด ๋๋ค.
@commands.command(name="์ฝ๋ก๋")
async def crawl(self, ctx):
url = "https://search.naver.com/search.naver?where=nexearch&sm=tab_etc&qvt=0&query=%EC%BD%94%EB%A1%9C%EB%82%9819"
response = requests.get(url) # get ๋ฐฉ์์ผ๋ก ์น ์ ๋ณด ๋ฐ์์ค๊ธฐ
response_code = int(response.status_code) # ์๋ต ์ฝ๋ ๋ฐ๊ธฐ
if response_code == 200: # ์ ์ ์๋(์ฝ๋ 200 ๋ฐํ) ์
soup = BeautifulSoup(response.content, 'lxml')
else: # ์ค๋ฅ ๋ฐ์
await ctx.send("์น ํ์ด์ง ์ค๋ฅ์
๋๋ค.")
# element
new = soup.find("div", {"class":"status_info"}).findAll("p", {"class":"info_num"})
today_infection = new[0].text # ์ผ์ผ ๊ฐ์ผ์
critical_condition = new[1].text # ์ฌ์ ์์ค์ฆ
new_Hospitalization = new[2].text # ์ ๊ท ์
์
today_died = new[3].text # ์ผ์ผ ์ฌ๋ง์
# ๊ฐ๋
์ฑ์ ์ํ ์๋ฒ ๋
embed = discord.Embed(title="๐งฌ ์ฝ๋ก๋ 19", description="http://ncov.mohw.go.kr/ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.",timestamp=datetime.datetime.now(pytz.timezone('UTC')), color=0x4c2896)
embed.set_author(name="์ฝ๋ก๋ ๋ฐ์ด๋ฌ์ค ๊ฐ์ผ์ฆ - 19 (COVID-19)", url="http://ncov.mohw.go.kr/", icon_url="https://cdn.discordapp.com/attachments/779326874026377226/789094221533282304/Y5Tg6aur.png")
embed.add_field(name="๋์ ํ์ง์", value="{}๋ช
".format(cumulative_infection), inline=True)
embed.add_field(name="์ผ์ผ ํ์ง์", value="{}๋ช
".format(today_infection), inline=True)
embed.add_field(name="์ฌ์ ์์ค์ฆ", value="{}๋ช
".format(critical_condition), inline=True)
embed.add_field(name="์ ๊ท ์
์", value="{}๋ช
".format(new_Hospitalization), inline=True)
embed.add_field(name="์ผ์ผ ์ฌ๋ง์", value="{}๋ช
".format(today_died), inline=True)
embed.set_thumbnail(url="https://cdn.discordapp.com/attachments/956550003755741245/956610477184659486/9068ce115fb4499b9fc404664274e95e.png")
embed.set_footer(text="์์ธํ ์ ๋ณด๋ ์์ ํ๋กํ ๋ฒํผ์ ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํด์ฃผ์ธ์.", icon_url="https://cdn.discordapp.com/attachments/779326874026377226/789098688315654164/Flag_of_South_Korea.png")
await ctx.send(embed=embed)
๋์ถฉ ์ฝ๋๋ BeautifulSoup ๋ชจ๋์ ์ฌ์ฉํด์ ์งฐ๊ณ ๋๋ฌด ์ด์ฌํผ์ ๋์ค์ ์ถ๊ฐํ ๊ฒ ์์ผ๋ฉด ์ถ๊ฐํ ์์ ์ด๋ค.
ํฌ๋กค๋ง ์ฝ๋๋ ์นํ์ด์ง๊ฐ ๋ฐ๋ ๋๋ง๋ค ์ฝ๋๊ฐ ์ ๋๋ก ์๋ํ์ง ์์ ์ ์์ผ๋ฏ๋ก ์ง์์ ์ผ๋ก ์ ์ง๋ณด์๋ฅผ ํด์ค์ผํ๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ค ๋์ค์ฝ๋ ๋ด ๊ฐ๋ฐ์ผ์ง - 3), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@eastminn/discrod-3์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค