정구리의 우주정복

Python Project 05. 디스코드 봇 "Manta" - (1) 롤 전적검색 본문

PYTHON/PROJECT

Python Project 05. 디스코드 봇 "Manta" - (1) 롤 전적검색

Jungry_ 2021. 12. 31. 13:37
반응형

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문을 만들어줬다

반응형
Comments