정구리의 우주정복
Python Project 05. 디스코드 봇 "Manta" - (1) 롤 전적검색 본문
반응형
op.gg 웹사이트를 크롤링 해서 유저의 정보를 가져오는 소스코드
솔로랭크와 자유랭크 점수와 승률, 티어를 가져오게 된다.
또한 존재하지 않는 유저인 경우와
랭크 게임을 하지 않는 유저인 경우에 대한 처리도 해주었다.
crawling.p
#op.gg 크롤링 후 정보 가져오기
import requests
from bs4 import BeautifulSoup
def get_UserInfo(soup): #유저 정보 가져오는 코드 (Try Except)
try:
#유저 정보 (이름 , 소환사 아이콘)
user_name = soup.select_one('body > div.l-wrap.l-wrap--summoner > div.l-container > div > div > div.Header > div.Profile > div.Information > span').text
user_profile = soup.select_one('body > div.l-wrap.l-wrap--summoner > div.l-container > div > div > div.Header > div.Face > div > img')
user_profile = 'https:'+ str(user_profile['src'])
USER_INFO = [user_name,user_profile]
try:
#솔랭 정보 (티어 사진, 티어, 점수, 승,패,승률)
solo_img = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.TierBox.Box > div.SummonerRatingMedium > div.Medal > img')
solo_img = 'https:' + str(solo_img['src'])
solo_tear = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.TierBox.Box > div > div.TierRankInfo > div.TierRank').text
solo_point = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.TierBox.Box > div > div.TierRankInfo > div.TierInfo > span.LeaguePoints').text
solo_point = solo_point.replace('\n','')
solo_point = solo_point.replace('\t','')
solo_win = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.TierBox.Box > div > div.TierRankInfo > div.TierInfo > span.WinLose > span.wins').text
solo_lose = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.TierBox.Box > div > div.TierRankInfo > div.TierInfo > span.WinLose > span.losses').text
solo_winratio = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.TierBox.Box > div > div.TierRankInfo > div.TierInfo > span.WinLose > span.winratio').text
SOLO_INFO = [solo_img,solo_tear,solo_point,solo_win,solo_lose,solo_winratio]
except:
SOLO_INFO='NONE'
try:
#자랭 정보 (티어 사진, 티어, 점수 승패, 승률)
sub_img = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.sub-tier > img')
sub_img = 'https:'+str(sub_img['src'])
sub_tear = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.sub-tier > div > div.sub-tier__rank-tier').text
sub_tear = sub_tear.replace('\n','')
sub_tear = sub_tear[18:-14]
sub_point = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.sub-tier > div > div.sub-tier__league-point').text
sub_winratio = soup.select_one('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-summary > div.SideContent > div.sub-tier > div > div.sub-tier__gray-text').text
sub_winratio = sub_winratio.replace('\n','')
sub_winratio = sub_winratio[10:-8]
SUB_INFO = [sub_img,sub_tear,sub_point,sub_winratio]
except:
SUB_INFO='NONE'
TOTAL_INFO = [USER_INFO,SOLO_INFO,SUB_INFO]
return TOTAL_INFO
except:
return "존재하지 않는 사용자입니다."
def do_crawl(username):
URL = "https://www.op.gg/summoner/userName="
finalName = username.replace(" ","")
NEW_URL = URL + finalName
response = requests.get(NEW_URL,headers={'User-Agent': 'Mozilla/5.0'})
if response.status_code == 200: #접속 성공 시
html = response.text
soup = BeautifulSoup(html,'html.parser')
TOTAL_INFO = get_UserInfo(soup)
return TOTAL_INFO
else: #접속 실패 시
print(response.status_code)
main.py
#봇 실행
import discord
from discord.ext import commands
from tokens import Token
import crawling
import socket
import ladders
bot = commands.Bot(command_prefix = '!', help_command = None)
@bot.event
async def on_ready():
print("===================")
print("LOGIN INFO")
print(bot.user.name)
print("CONNECT SUCCESS")
print("===================")
game = discord.Game("널 생각")
await bot.change_presence(status=discord.Status.online,activity=game)
@bot.command()
async def help(ctx):
help_embed = discord.Embed(title="",color=0x191970)
help_embed.set_author(name="Hello I'm Manta!")
help_embed.set_thumbnail(url='https://static.wikia.nocookie.net/pokemon/images/d/dd/%EB%A7%8C%ED%83%80%EC%9D%B8_%EA%B3%B5%EC%8B%9D_%EC%9D%BC%EB%9F%AC%EC%8A%A4%ED%8A%B8.png/revision/latest?cb=20170409105418&path-prefix=ko')
help_embed.add_field(name="롤 티어 검색(!tear)",value="!tear 롤닉네임",inline="False")
help_embed.add_field(name="사다리 타기(!ladder)",value="!ladder 이름1 이름2 이름3 / 꽝 꽝 당첨 (/와 띄어쓰기로 구분)",inline="False")
help_embed.add_field(name="조원일 놀리기(!조원일)",value="!조원일",inline="False")
help_embed.set_footer(text="Manta v1.0 Copyright in Jungry")
await ctx.send(embed=help_embed)
@bot.command()
async def tear(ctx):
username= ctx.message.content[6:len(ctx.message.content)]
if username =="":
await ctx.send("닉네임을 입력해주세요")
else:
username = username.replace(" ","")
TOTAL_INFO = crawling.do_crawl(username)
if type(TOTAL_INFO) == str: #존재하지 않는 사용자인 경우
await ctx.send("존재하지 않는 사용자입니다 ! 닉네임을 확인해주세요")
else: #존재하는 사용자인 경우
if TOTAL_INFO[1] =="NONE": #솔랭 기록 없는경우
if TOTAL_INFO[2]=="NONE":
await ctx.send(str(TOTAL_INFO[0][0])+"님의 랭크게임 기록이 존재하지 않습니다.")
if TOTAL_INFO[2] != "NONE": #자랭 기록이 있는 경우
tear_embed = discord.Embed(title="",description="",color=0xFFB6C1)
tear_embed.set_author(name=TOTAL_INFO[0][0],url="https://www.op.gg/summoner/userName="+str(username),icon_url=TOTAL_INFO[0][1])
tear_embed.set_thumbnail(url=TOTAL_INFO[2][0])
tear_embed.add_field(name="자유랭크 "+str(TOTAL_INFO[2][1]),value=str(TOTAL_INFO[2][2])+' '+str(TOTAL_INFO[2][3]))
await ctx.send(embed=tear_embed)
else:
if TOTAL_INFO[2]=="NONE": #솔랭은 하고 자랭은 안하는 경우:
tear_embed = discord.Embed(title="",description="",color=0xFFB6C1)
tear_embed.set_author(name=TOTAL_INFO[0][0],url="https://www.op.gg/summoner/userName="+str(username),icon_url=TOTAL_INFO[0][1])
tear_embed.set_thumbnail(url=TOTAL_INFO[1][0])
tear_embed.add_field(name="솔로랭크 "+str(TOTAL_INFO[1][1])+" "+str(TOTAL_INFO[1][2]),value=str(TOTAL_INFO[1][3])+' '+str(TOTAL_INFO[1][4])+' '+str(TOTAL_INFO[1][5]))
await ctx.send(embed=tear_embed)
else:
tear_embed = discord.Embed(title="",description="",color=0xFFB6C1)
tear_embed.set_author(name=TOTAL_INFO[0][0],url="https://www.op.gg/summoner/userName="+str(username),icon_url=TOTAL_INFO[0][1])
tear_embed.set_thumbnail(url=TOTAL_INFO[1][0])
tear_embed.add_field(name="솔로랭크 "+str(TOTAL_INFO[1][1])+" "+str(TOTAL_INFO[1][2]),value=str(TOTAL_INFO[1][3])+' '+str(TOTAL_INFO[1][4])+' '+str(TOTAL_INFO[1][5]))
tear_embed.add_field(name="자유랭크 "+str(TOTAL_INFO[2][1]),value=str(TOTAL_INFO[2][2])+' '+str(TOTAL_INFO[2][3]))
await ctx.send(embed=tear_embed)
!help 명령어와 !tear 라는 명령어에 대한 처리 부분이다.
우선 봇이 동작할때 채팅이 ! 로 시작이 되면 명령어로 입력을 받았다 ex) !!tear 라고 하면 명령어가 !tear 로 들어오게 되어서 동작하지 않고 !tear 라고 입력하면 tear가 명령어로 들어오게 되며 동작하는 방식이다
전적검색시
1. 계정이 있는가 ? 없는가 ?
2. 있다면 랭크기록이 있는가 ? 없는가 ?
3. 랭크 기록이 있다면 자유랭크 , 솔로랭크 둘다 했는가 안했는가 ?
를 분기로 삼아서 if문을 만들어줬다
반응형
'PYTHON > PROJECT' 카테고리의 다른 글
인공지능을 활용한 악성파일 탐지 시스템 소스코드 (서정우 작성 부분) (0) | 2023.01.30 |
---|---|
Python Project 05. 디스코드 봇 "Manta" - (2) 사다리타기 (2) | 2021.12.31 |
Python Project 05. 디스코드 봇 "Manta" - 구상 (0) | 2021.12.31 |
Python Project 04. 영화리뷰 긍정부정 예측하기 - (3) 전처리 , 학습 (0) | 2020.12.21 |
Python Project 04. 영화리뷰 긍정부정 예측하기 -(2) 간단한 전처리 (0) | 2020.12.21 |
Comments