인스타그램 자동화

[파이썬(Python)] 인스타그램 자동 프로그램 만들기 - 자동 댓글 (1)

abfc 2021. 2. 27.
반응형

파이썬 인스타그램 자동화 - 자동 댓글 작성하기

파이썬으로 인스타그램 자동 프로그램 만들기! 드디어 댓글 기능 구현입니다.

자동 프로그램이 좋아요만 해주면 의미가 없겠죠? 댓글에 이어 팔로우 구현도 포스팅할 예정이니 조금만 기다려주세요 :D

 

이전 강의 - 인스타그램 자동 좋아요

자동 댓글 기능은 지난번에 구현한 자동 좋아요 코드에 이어서 작성했으니 아래의 링크에서 인스타그램 자동 좋아요 기능 구현을 참고해주세요.

 

자동 좋아요 1편

 

인스타그램 자동 좋아요 프로그램 만들기 - 파이썬(python), 셀레니움(selenium) - 로그인, 원하는 횟

구현 기능 - 인스타그램 로그인, 설정한 횟수만큼 자동 좋아요 작업 작업환경 - 윈도우10, VS Code, Python3 오늘 구현해 볼 기능은 아주 간단한 인스타그램 로그인과 설정한 횟수만큼 자동으로 좋아

private.tistory.com

자동 좋아요 2편

 

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

구현 기능 - 인스타그램 자동 좋아요 기능 강화 작업환경 - 윈도우10, VS Code, Python3 이번 포스트에서는 이전에 구현했던 인스타그램 자동 로그인 & 좋아요 기능을 더 추가하고, 다음 피드로 이동시

private.tistory.com

 

작업환경

윈도우10, VS Code, Python3, Chrome88

 

프로그램 구동 화면

 

선언한 변수 수정

기능을 구현하기전에 지난 포스팅때 등록한 사용할 변수들 기억하시나요? input을 사용해 입력을 받았었는데 수정했습니다. 실행할때마다 입력해야 하는게 너무 귀찮아서.....

 

수정하는김에 댓글 목록도 추가할게요. 댓글은 list에 여러개 작성해줍니다. 하나의 댓글로 여러번 반복해서 등록하게 되면 인스타그램 작업정지 당하기 딱 좋습니다. ㅎㅎ

#필요한 변수 정의
insta_id = '인스타그램아이디'
insta_pw = '인스타그램패스워드'
insta_tag = '원하는 해시태그(# 제외하고)'
insta_cnt = int(input('작업횟수(숫자만) : '))
insta_sort = '1' # '0' = 인기게시물에 작업, '1' = 최근게시물에 작업
## 댓글
insta_comm = ['넘 귀여워요!', '꺄 귀여워요! 잘 보고갑니다!', '귀염귀염 :)']

* 저는 실사용 목적이 아니기때문에 입력값들을 선언했지만, 실사용 목적인 분들은 해시태그나 작업횟수 등은 input을 사용해 그때그때 입력받아도 되겠죠?

 

 

댓글 영역을 찾은 후 댓글 작성

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import random

댓글 작성에 필요한 모듈을 import 해주세요.

  • ActionChains : 여러개의 동작을 체인으로 묶어서 저장, 실행할 수 있는 기능입니다. (마우스 이동, 클릭, 키보드 입력, 드래그 앤 드롭 등)
  • Keys : 셀레니움에서 키보드 키를 사용하기 위한 모듈입니다.

 

#8. 댓글 작성 영역 찾기
div = driver.find_element_by_xpath('/html/body/div[5]/div[2]')
div1 = div.find_element_by_xpath('/html/body/div[5]/div[2]/div')
article = div1.find_element_by_xpath('/html/body/div[5]/div[2]/div/article')
div2 = article.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div[3]')
section = div2.find_element_by_css_selector('div.eo2As > section.sH9wk._JgwE') 
ta = section.find_element_by_tag_name('textarea')

time.sleep(2)

#8-1. 댓글 작성 영역으로 이동해 댓글창 클릭
ac = ActionChains(driver) 
ac.move_to_element(ta) 
ac.click() 
ac.pause(2) 

#8-2. 여러개의 댓글 중 랜덤으로 선택
choice_comm = (random.choice(insta_comm))
comm = choice_comm.split('\n')

#8-3. 댓글 작성
for i, c in enumerate(comm):
  c = c.replace("\n", "")
  ac.send_keys(c)        
  i += 1
  #8-4. 댓글이 여러줄일 경우 Shift + Enter로 다음 줄 이동
  if i < len(comm):
  	ac.key_down(Keys.SHIFT).send_keys(Keys.ENTER).key_up(Keys.SHIFT)

ac.pause(2) 
ac.send_keys(Keys.ENTER)

#8-5. 등록한 ac 실행
ac.perform() 

print('댓글 작성 성공 - {}'.format(choice_comm))
time.sleep(5)

8. 댓글을 작성할 영역을 찾습니다. 한 번에 찾으면 NoSuchElementException 이 발생해서 한 단계 한 단계 찾았습니다. ㅠㅠ

8-1. 위에서 import한 ActionChains를 이용해 8에서 찾은 댓글 영역으로 이동(move_to_element(ta))한 후 댓글 영역을 클릭합니다.

8-2. random.choice 로 댓글 리스트 중 하나의 댓글을 선택합니다. split('\n')은 8-3, 4를 참고하세요.

8-3, 8-4. 댓글이 한 줄일 수도 있지만 여러줄 일수도 있겠죠? 여러줄 댓글 작성을 위해 선택된 댓글을 split('\n') 하여 줄바꿈 기준으로 또! 리스트로 변경하였습니다. 변경된 댓글(리스트)를 for문으로 작성해줍니다.

ac.send_keys(c)로 댓글을 입력한 후 if 조건문을 통해 댓글이 여러 줄일경우 shift + enter로 아랫줄로 이동한 후 나머지 댓글을 작성합니다.

8-5. 마지막 엔터까지 입력하고, perform()을 통해 등록한 ActionChains 실행해줍니다.

 

다음 피드 기능 위치 변경

이전 포스팅에서는 좋아요 완료 후 다음 피드로 이동을 했는데, 우리는 댓글 기능까지 추가하였으니 좋아요 작업만 하고 다음 피드로 이동해버리면 안되겠죠?😅

다음 피드 이동 기능을 방금 구현한 댓글 기능 아래로 이동해주세요. (전체 소스 참고)

 

 

전체 소스코드

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

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import inspect, os, platform, time, random

def bot():
    #필요한 변수 정의
    insta_id = '인스타그램아이디'
    insta_pw = '인스타그램패스워드'
    insta_tag = '원하는 해시태그 #제외'
    insta_cnt = int(input('작업횟수(숫자만) : '))
    insta_sort = '1' # '0' = 인기게시물에 작업, '1' = 최근게시물에 작업
    ## 댓글
    insta_comm = ['넘 귀여워요!', '꺄 귀여워요! 잘 보고갑니다!', '귀염귀염 :)']


    #크롬드라이버 로딩
    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. 좋아요 작업 - 다음 피드로 이동 -> 댓글 작성 아래로...


        #8. 댓글 작성 영역 찾기
        div = driver.find_element_by_xpath('/html/body/div[5]/div[2]')
        div1 = div.find_element_by_xpath('/html/body/div[5]/div[2]/div')
        article = div1.find_element_by_xpath('/html/body/div[5]/div[2]/div/article')
        div2 = article.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div[3]')
        section = div2.find_element_by_css_selector('div.eo2As > section.sH9wk._JgwE') 
        ta = section.find_element_by_tag_name('textarea')

        time.sleep(2)

        #8-1. 댓글 작성 영역으로 이동해 댓글창 클릭
        ac = ActionChains(driver) 
        ac.move_to_element(ta) 
        ac.click() 
        ac.pause(2) 

        #8-2. 여러개의 댓글 중 랜덤으로 선택
        choice_comm = (random.choice(insta_comm))
        comm = choice_comm.split('\n')

        #8-3. 댓글 작성
        for i, c in enumerate(comm):
            c = c.replace("\n", "")
            ac.send_keys(c)        
            i += 1
            #8.4. 댓글이 여러줄일 경우 Shift + Enter로 다음 줄 이동
            if i < len(comm):
                ac.key_down(Keys.SHIFT).send_keys(Keys.ENTER).key_up(Keys.SHIFT)

        ac.pause(2) 
        ac.send_keys(Keys.ENTER) 

        #8-5. 등록한 ac 실행
        ac.perform()

        print('댓글 작성 성공 - {}'.format(choice_comm))
        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()



 

다음 포스팅에서 구현할 기능

  • 이미 댓글을 작성한 피드(게시물)인지 확인 후 댓글 작성하는 기능

 

공감과 댓글은 작성자에게 많은 힘이됩니다. 감사합니다😄

반응형

댓글

💲 추천 글