인스타그램 자동화

인스타그램 자동 좋아요 프로그램 만들기 - 파이썬(python), 셀레니움(selenium) - 기능 강화 및 예외 처리

abfc 2021. 2. 2.
반응형

 


구현 기능 - 인스타그램 자동 좋아요 기능 강화

작업환경 - 윈도우10, VS Code, Python3


 

이번 포스트에서는 이전에 구현했던 인스타그램 자동 로그인 & 좋아요 기능을 더 추가하고, 다음 피드로 이동시 예외 처리를 하도록 하겠습니다.

 

 

프로그램 구동 화면


이미 좋아요한 작업 스킵, 피드 개수 부족한 태그 작업 종료

 

인기게시물 or 최근게시물 선택하기


#게시물 순서 선택을 위한 변수 추가
insta_sort = input('0 : 인기게시물, 1 : 최근게시물')


... 중략 ...


# 5. 인기게시물 혹은 최근게시물 첫번째 피드 선택
if insta_sort == '0':
  #인기게시물 첫번째 피트 선택
  hot_first_feed = driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[1]/div/div/div[1]/div[1]/a/div/div[2]')
  hot_first_feed.click()
else:
  #최근게시물 첫번째 피드 선택
  new_first_feed = driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[2]/div/div[1]/div[1]/a/div[1]/div[2]')
  new_first_feed.click()
  
 time.sleep(1)

어떤 순서의 피드를 작업할 것인지 선택한 값을 저장하기 위해서 변수를 추가해줍니다. 0을 입력할 경우 인기게시물을, 1을 입력할 경우 최근게시물을 대상으로 작업하게 됩니다.

 

5. if을 이용해 위에서 선택한 값에 맞게 인기게시물 혹은 최근게시물을 찾도록 수정해줍니다.

 

좋아요 중복 작업 방지


for idx in range(insta_cnt):
  div = driver.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div')
  div = div.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div[3]')
  like_btn = div.find_element_by_tag_name('button') #좋아요 버튼

  btn_svg = like_btn.find_element_by_tag_name('svg')
  svg_txt = btn_svg.get_attribute('aria-label')

  if svg_txt != '좋아요':
  	print('이미 좋아요 작업한 피드')
  else:
    like_btn.click() #좋아요 클릭
    print('{}번째 피드 좋아요 작업 완료'.format(idx + 1))
    
    
.... 생략 ....

 

이전 포스트에서 작성한 6. 좋아요 작업의 내용을 수정해주세요. 

버튼에 있는 svg태그의 텍스트를 찾은 뒤 텍스트가 '좋아요'라면 이미 좋아요가 되어있는 피드기때문에 이미 작업했다는 는 내용만 출력하고 다음 작업으로 넘어갑니다. 반대로 '좋아요'가 아니라면 좋아요 작업을 하게됩니다.

 

 

 

다음 피드 예외 처리


if idx < insta_cnt:
  try:
    next_feed = driver.find_element_by_link_text('다음')
    next_feed.click()
  except NoSuchElementException as n:
    print('피드 개수 부족으로 작업이 종료됩니다.')
    break

설정한 태그의 피드수가 입력한 작업횟수보다 더 적을수도 있습니다. 그럴경우 다음 피드가 없는데 다음 피드 버튼을 찾게되면 에러가 나겠죠? 에러를 방지하기 위해 NoSuchElementException을 사용합니다.

프로젝트 상단에 from selenium.common.exceptions import NoSuchElementException 를 작성해준뒤 다음 피드 찾는 부분의 소스를 변경해줍니다.

피드개수가 부족할 경우 피드 개수 부족으로 작업이 종료된다는 멘트 출력 후 break를 통해 for문을 빠져나와 프로그램이 종료됩니다.

 

 

전체 소스코드


# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import inspect, os, platform, time


def bot():
    #필요한 변수 정의
    insta_id = input('인스타그램 아이디 : ')
    insta_pw = input('인스타그램 패스워드 : ')
    insta_tag = input('작업할 해시태그 : ')
    insta_cnt = int(input('작업횟수(숫자만) : '))
    insta_sort = input('0 : 인기게시물, 1 : 최근게시물')


    #크롬드라이버 로딩
    options = webdriver.ChromeOptions()
    options.add_argument('--disable-gpu')
    options.add_argument('user-agent=Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')

    current_folder = os.path.realpath(
                os.path.abspath(os.path.split(inspect.getfile(inspect.currentframe()))[0]))

    if platform.system() == 'Windows':
        driver_path = os.path.join(current_folder, 'chromedriver.exe')
    else:
        driver_path = os.path.join(current_folder, 'chromedriver')

    driver = webdriver.Chrome(driver_path, options=options)
    driver.implicitly_wait(10)

    
    ### 인스타그램 자동 좋아요 작업 ###
    
    # 1. 인스타그램 로그인 페이지로 이동
    driver.get('https://www.instagram.com/?hl=ko')
    print('로그인중....')
    time.sleep(3)

    # 2. 아이디 입력창을 찾아서 위에서 입력받은 아이디(insta_id)값 입력
    id_input = driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[1]/div/label')
    id_input.click() #입력창 클릭
    id_input.send_keys(insta_id) #아이디 입력


    # 2-1. 패스워드 입력창을 찾아서 위에서 입력받은 패스워드(insta_pw)값 입력
    pw_input = driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[2]/div/label')
    pw_input.click()
    pw_input.send_keys(insta_pw)

    # 3. 로그인 버튼 클릭
    login_btn = driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[3]/button')
    login_btn.click()


    # 잠시 대기
    time.sleep(3)


    # 4. 작업할 해시태그 검색 결과 페이지로 이동
    driver.get('https://www.instagram.com/explore/tags/{}/'.format(insta_tag))
    time.sleep(2)

    # 5. 인기게시물 혹은 최근게시물 첫번째 피드 선택
    if insta_sort == '0':
        #인기게시물 첫번째 피트 선택
        hot_first_feed = driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[1]/div/div/div[1]/div[1]/a/div/div[2]')
        hot_first_feed.click()
    else:
        #최근게시물 첫번째 피드 선택
        new_first_feed = driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[2]/div/div[1]/div[1]/a/div[1]/div[2]')
        new_first_feed.click()
    
    time.sleep(1)

    # 6. 좋아요 작업 - 입력한 횟수만큼 반복 작업
    for idx in range(insta_cnt):
        div = driver.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div')
        div = div.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div[3]')
        like_btn = div.find_element_by_tag_name('button') #좋아요 버튼

        btn_svg = like_btn.find_element_by_tag_name('svg')
        svg_txt = btn_svg.get_attribute('aria-label')

        if svg_txt != '좋아요':
            print('이미 좋아요 작업한 피드')
        else:
            like_btn.click() #좋아요 클릭
            print('{}번째 피드 좋아요 작업 완료'.format(idx + 1))

        # 너무 빠르게 작업을 할 경우 많은 양의 작업을 하게 되어 인스타그램측에서 계정 정지나 경고를 할 수 있으니
        # 작업과 다음 작업 사이의 속도를 조절하기 위해 20초 이상을 설정해주세요.
        time.sleep(5)

        # 7. 좋아요 작업 - 다음 피드로 이동
        if idx < insta_cnt:
            try:
                next_feed = driver.find_element_by_link_text('다음')
                next_feed.click()
            except NoSuchElementException as n:
                print('피드 개수 부족으로 작업이 종료됩니다.')
                break


    print('모든 작업 완료')
    driver.quit()


bot()



 

 

 

다음 포스트에는 어떤 기능이?


인스타그램 자동 좋아요 기능이 완성되었습니다. 다음 포스트에서는 자동 댓글을 작성하는 기능을 추가하도록 하겠습니다. 광고 클릭은 포스트를 작성하는데 큰 힘이 됩니다!

 

  • 인스타그램 자동 댓글 등록

 

반응형

댓글

💲 추천 글