인스타그램 자동화

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

dev109 2021. 3. 17.
반응형

 

파이썬 인스타그램 자동화 - 자동 팔로우하기

드디어 마지막! 인스타그램 자동 팔로우 기능 구현입니다. 좋아요, 댓글과 마찬가지로 팔로우 하기 전 이미 팔로우를 한 상태인지 확인한 후에 팔로우 버튼을 클릭하도록 구현하겠습니다.

 

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

지난번에 작성한 소스코드에 이어서 작성했으니 아래의 링크에서 지난 강의를 참고해주세요.

 

인스타그램 자동 좋아요 1편

 

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

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

private.tistory.com

인스타그램 자동 좋아요 2편

 

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

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

private.tistory.com

인스타그램 자동 댓글 1편

 

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

파이썬 인스타그램 자동화 - 자동 댓글 작성하기 파이썬으로 인스타그램 자동 프로그램 만들기! 드디어 댓글 기능 구현입니다. 자동 프로그램이 좋아요만 해주면 의미가 없겠죠? 댓글에 이어 팔...

private.tistory.com

인스타그램 자동 댓글 2편

 

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

파이썬 인스타그램 자동화 - 자동 댓글 작성하기 이전 포스팅에서 인스타그램 자동 댓글 작성 기능을 구현했습니다. 그런데 내 프로그램이 이미 댓글 작성한 피드에 중복으로 댓글을 작성한다...

private.tistory.com

작업환경

윈도우10 VS Code, Python3, Chrome89

 

프로그램 구동 화면

[파이썬(Python)] 인스타그램 자동 프로그램 만들기 - 자동 팔로우 - undefined - undefined - 프로그램 구동 화면

 

팔로우 기능 추가

이전 포스팅에서 구현한 자동 좋아요와 자동 댓글까지 작성하셨으면 아래의 위치에 팔로우를 구현하면 되겠습니다.

[파이썬(Python)] 인스타그램 자동 프로그램 만들기 - 자동 팔로우 - undefined - undefined - 팔로우 기능 추가

#10. 팔로우 기능 추가
#10-1. 팔로우 버튼 찾기
div = driver.find_element_by_xpath('/html/body/div[5]')
header = div.find_element_by_tag_name('header')
follow_btn = header.find_element_by_tag_name('button')
follow_btn_txt = follow_btn.text

#10-2. 버튼의 텍스트가 팔로우인 경우에만 팔로우 버튼 클릭
if follow_btn_txt == '팔로우':
	time.sleep(2)
	follow_btn.click()

	print('{}번째 피드 팔로우 성공'.format(idx + 1))
	time.sleep(5) #빠른 작업 방지를 위한 대기시간 설정
elif follow_btn_txt == '팔로잉':
	print('이미 팔로우한 계정입니다.')

그동안 작성했던 코드들에 비하면 굉장히 간단하네요. 설명도 간단하게 하겠습니다. 팔로우 버튼을 찾은 후 버튼의 텍스트가 '팔로우' 인 경우에만 팔로우 작업을 하도록 작성했습니다. 그래야 팔로워에게 중복 팔로우를 하지 않겠죠?ㅎㅎ

 

혹시나해서! 주의사항

인스타그램은 정해진 시간동안 볼 수 있는 데이터(피드, 댓글, 팔로워 등)양이 정해져 있습니다. 이 정해진 양을 넘기게 되면 해당 데이터는 일정시간동안 보여지지 않고 무한로딩이 되어버립니다. 그렇기때문에 댓글 목록을 확인할때 댓글 로딩도 기다릴겸 time.sleep으로 약간의 대기시간을 설정해두었습니다.

혹시나 대기시간을 제거하실 분들은 참고하시길 바랍니다.

전체 소스코드

# -*- 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 = '0' # '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. 좋아요 작업 - 다음 피드로 이동 -> 댓글 작성 아래로...


        #9. 이미 댓글을 작성했는지 확인
        div = driver.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div[3]')
        comm_area = div.find_element_by_tag_name('div')
        ul = div.find_element_by_tag_name('ul')
        ul1 = ul.find_elements_by_class_name('Mr508') #9-1. 현재보여지는 댓글개수
        try:
            if len(ul1) >= 12:
                while True:
                    #9-2. 보여지는 댓글개수가 11개가 넘으면 끝까지 스크롤
                    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", ul)
                    time.sleep(random.randint(500, 1000)/1000)

                    try:
                        before_comm_cnt = len(ul1)#9-3. 더보기 버튼 클릭 하기 전 보여지는 댓글개수
                        time.sleep(2)
                        #댓글 더 보기 버튼
                        add_btn = ul.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div[3]/div[1]/ul/li')
                        add_btn.click()
                        time.sleep(2)

                        div = driver.find_element_by_xpath('/html/body/div[5]/div[2]/div/article/div[3]')
                        comm_area = div.find_element_by_tag_name('div')
                        ul = div.find_element_by_tag_name('ul')
                        ul1 = ul.find_elements_by_class_name('Mr508') # 9-4. 더보기 버튼 클릭 한 후 보여지는 댓글개수
                        after_comm_cnt = len(ul1)#현재보여지는 댓글개수
                        
                        #9-5. 이전 댓글과 현재 댓글수가 같으면 정지, 같지 않으면 이전 댓글수에 입력
                        if before_comm_cnt == after_comm_cnt:
                            break
                        else:
                            before_comm_cnt += after_comm_cnt 
                    except NoSuchElementException as ne:
                            break
            # 9-6. 댓글 목록에 내 아이디가 있는지 확인
            user = ul.find_element_by_link_text(insta_id)
            print('이미 댓글을 작성한 피드입니다.')
        except NoSuchElementException as n:
            #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)

        #10. 팔로우 기능 추가
        #10-1. 팔로우 버튼 찾기
        div = driver.find_element_by_xpath('/html/body/div[5]')
        header = div.find_element_by_tag_name('header')
        follow_btn = header.find_element_by_tag_name('button')
        follow_btn_txt = follow_btn.text

        #10-2. 버튼의 텍스트가 팔로우인 경우에만 팔로우 버튼 클릭
        if follow_btn_txt == '팔로우':
            time.sleep(2)
            follow_btn.click()

            print('{}번째 피드 팔로우 성공'.format(idx + 1))
            time.sleep(5) #빠른 작업 방지를 위한 대기시간 설정
        elif follow_btn_txt == '팔로잉':
            print('이미 팔로우한 계정입니다.')

        # 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()



[파이썬(Python)] 인스타그램 자동 프로그램 만들기 - 자동 팔로우 - undefined - undefined - 전체 소스코드

다음 포스팅

파이썬 셀레니움으로 인스타그램 이미지 수백개 수집하기

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

반응형

댓글