인스타그램 자동화

[파이썬(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

 

프로그램 구동 화면

 

팔로우 기능 추가

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

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



다음 포스팅

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

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

반응형

댓글

💲 추천 글