본문 바로가기
파이썬

인스타그램 좋아요 봇 만들기 2 : 해시태그 지정

by fecu 2022. 4. 6.
728x90

이번 글은 이전의 '인스타그램 좋아요 봇 만들기 1'에 이어지는 글이다. 이전의 글은 단순하게 하나의 태그만을 지정하여 좋아요를 누르는 방식이었다. 이번 글에서는 여러개의 태그를 돌아가면서, 하나의 태그당 20~30개의 좋아요를 누르도록 만들어볼 예정이다. 이전의 글을 보지 못했다면 아래 글을 읽고 오기를 바란다.

 

인스타그램 좋아요 봇 만들기(2022.02.19. 업데이트)

인스타그램을 공개로 하다 보면 가끔씩 내 피드에 들어와 글과 전혀 상관없는 댓글을 남기거나, 내 피드에 전혀 모르는 사람이 들어와 좋아요만 여러개 남기고 사라지는 사람들이 있는 것을 볼

fecu.tistory.com


2022.06.08. 업데이트

좋아요, 다음 버튼의 xpath를 모두 상대경로로 변경하였다. 앞으로 쓰는 글들의 xpath는 상대 경로로 지정해 볼 예정이다.


1. 함수 정의하기

1) 로그인 함수 만들기

 

파이썬의 함수는 아래와 같은 기본적인 구조를 가진다. 

 

def 함수명(변수) : 
    실행할 명령
    .....
    return 결과값

 

이러한 방식으로 로그인 과정을 변수로 정의해보자. 함수명은 login이며, 변수로 yourid, password를 받는다.

 

def login(yourid, password):
    btn= driver.find_elements_by_tag_name('button')[1]
    btn.click()
    inputbox = driver.find_elements_by_tag_name('input')[0]
    inputbox.click()
    inputbox.send_keys(yourid)
    inputbox = driver.find_elements_by_tag_name('input')[1]
    inputbox.click()
    inputbox.send_keys(password)
    inputbox.send_keys(Keys.ENTER)
    time.sleep(4)

 

2) 좋아요 버튼을 누르는 과정을 함수로 만들기

 

이번에는 좋아요 버튼을 누르는 과정을 함수로 만들어보았다. 함수 명은 likey이며, 변수로 insta_tag를 받는다. 좋아요를 누르는 게시물의 개수가 이전에는 100개였으나, 이번에는 램던하게 20~40개 사이의 게시물을 누르도록 램던 함수를 이용해 수정해 보았다.

 

def likey(insta_tag) :
    like_cnt = random.randrange(20,40)
    driver.get('https://www.instagram.com/explore/tags/{}/'.format(insta_tag))
    time.sleep(10)

    new_feed=driver.find_elements_by_class_name('eLAPa')[9] 
    new_feed.click()

    numoflike = 0
    for i in range(like_cnt): 
        time.sleep(3)
        span = driver.find_element_by_xpath('//*[@aria-label="좋아요" or @aria-label="좋아요 취소"]//ancestor :: span[2]')  
        like_btn = span.find_element_by_tag_name('button')
        btn_svg = like_btn.find_element_by_tag_name('svg') 
        svg = btn_svg.get_attribute('aria-label') 
        
        if svg == '좋아요' : 
            like_btn.click() 
            numoflike += 1
            print('좋아요를 {}번째 눌렀습니다.'.format(numoflike))
            time.sleep(random.randrange(50,60))
        else :
            print('이미 작업한 피드입니다.')               
            time.sleep(random.randrange(5))        

        if i < like_cnt-1 : 
            next_feed_xpath = driver.find_element_by_xpath('//*[@aria-label="다음" and @height="16"]//ancestor :: div[2]')
            next_feed = next_feed_xpath.find_element_by_tag_name('button') 
            next_feed.click() 
            time.sleep(random.randrange(5))

 

2. while문을 통해 반복하기

 

이제 로그인 함수와 좋아요 버튼을 누르는 함수가 완성되었으니, 이를 반복하면 된다. 순서는 '로그인->태그 설정->태그 검색->좋아요 누르기->태그 변경->태그 검색->좋아요 누르기...' 의 무한 반복이다.

 

login('자신의 아이디','자신의 비밀번호')
while True :
    tags = ['원하는', '태그를', '리스트 형태로', '넣어주세요']
    random.shuffle(tags)
    for tag in tags:
        print(f'작업 태그는 {tag} 입니다.')
        likey(tag)
        print(f'{tag} 태그 작업이 끝났습니다. 다음 태그로 넘어갑니다.')

 

while문 내부의 과정을 순서대로 설명해주면 아래와 같다.

 

1) 로그인을 한다.

2) 원하는 태그를 설졍한다. 이 부분은 이 글을 읽는 사람들이 리스트 형태로 작성해주면 된다.
3) 설정된 태그의 순서를 무작위로 섞는다.

4) 설정된 태그를 하나씩 꺼내서, 좋아요 작업을 한다. 작업하기 전에 작업 태그가 무엇인지 알려주고, 작업 후에는 태그 작업이 끝났다는 문구가 나오도록 만들었다.

 

3. while문 없이 반복하기

 

만약 해시태그를 무한으로 돌아가면서 작업하기를 원하지 않고, 원하는 태그 몇 개만을 누른 뒤 종료하기를 원한다면 굳이 while문을 활용할 필요는 없다. 그렇다면 코드는 아래와 같을 것이다.

 

login('자신의 아이디','자신의 비밀번호')
tags = ['원하는', '태그를', '리스트 형태로', '넣어주세요']
random.shuffle(tags)
for tag in tags:
    print(f'작업 태그는 {tag} 입니다.')
    likey(tag)
    print(f'{tag} 태그 작업이 끝났습니다. 다음 태그로 넘어갑니다.')
    
print("좋아요 작업이 끝났습니다. 프로그램을 종료합니다.")
driver.quit()

 

4. 코드 실행

 

이번 글은 그림도 없이 코드만 잔득 있어서 코딩이 잘 되었는지 확인하는 과정을 찍어보았다. 실행해보니 잘 작동한다. 지난 글에는 보니 전체 코드 중에 콤마가 하나 더 있어서 어떤 분은 안되었던듯 하다. 앞으로 잘 살펴보아야 할 것 같다.

 

인스타 좋아요 봇

 

5. 전체코드

 

함수를 이용하면 코딩을 하는 시간을 비약적으로 줄여준다. 아래 함수를 활용해보기를 바란다. 다음 글에서는 try 구문을 활용하여 간혹 생길 수 있는 오류를 처리하는 방법에 대해 글을 써보려고 한다. 그럼 끝.


 

인스타그램 좋아요 봇 만들기 3 : 오류 처리하기

좋아요 봇을 실행하다 보면 오류를 내면서 멈춰버리는 경우가 많다. 이럴 경우 오류를 예외처리하고 좋아요를 계속 누르도록 만들 수 있다. 이전 글을 보지 않았던 사람은 아래의 글들을 참고하

fecu.tistory.com


from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
import time
import random

options = webdriver.ChromeOptions()

options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25")
options.add_argument("--start-maximized")

driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get('https://instagram.com')
time.sleep(10)
print('로그인 진행중...')

def login(yourid, password):
    btn= driver.find_elements_by_tag_name('button')[1]
    btn.click()
    inputbox = driver.find_elements_by_tag_name('input')[0]
    inputbox.click()
    inputbox.send_keys(yourid)
    inputbox = driver.find_elements_by_tag_name('input')[1]
    inputbox.click()
    inputbox.send_keys(password)
    inputbox.send_keys(Keys.ENTER)
    time.sleep(4)

def likey(insta_tag) :
    like_cnt = random.randrange(10,20)
    driver.get('https://www.instagram.com/explore/tags/{}/'.format(insta_tag))
    time.sleep(10)

    new_feed=driver.find_elements_by_class_name('eLAPa')[9] 
    new_feed.click()

    numoflike = 0
    for i in range(like_cnt): 
        time.sleep(3)
        span = driver.find_element_by_xpath('//*[@aria-label="좋아요" or @aria-label="좋아요 취소"]//ancestor :: span[2]')  
        like_btn = span.find_element_by_tag_name('button')
        btn_svg = like_btn.find_element_by_tag_name('svg') 
        svg = btn_svg.get_attribute('aria-label') 
        
        if svg == '좋아요' : 
            like_btn.click() 
            numoflike += 1
            print('좋아요를 {}번째 눌렀습니다.'.format(numoflike))
            time.sleep(random.randrange(50,60))
        else :
            print('이미 작업한 피드입니다.')               
            time.sleep(random.randrange(5))        

        if i < like_cnt-1 : 
            next_feed_xpath = driver.find_element_by_xpath('//*[@aria-label="다음" and @height="16"]//ancestor :: div[2]')
            next_feed = next_feed_xpath.find_element_by_tag_name('button') 
            next_feed.click() 
            time.sleep(random.randrange(5))

login('자신의 아이디','자신의 비밀번호')
while True :
    tags = ['원하는', '태그를', '리스트 형태로', '넣어주세요']
    random.shuffle(tags)
    for tag in tags:
        print(f'작업 태그는 {tag} 입니다.')
        likey(tag)
        print(f'{tag} 태그 작업이 끝났습니다. 다음 태그로 넘어갑니다.')

print("좋아요 작업이 끝났습니다. 프로그램을 종료합니다.")
driver.quit()
728x90