반응형
파이썬 인스타그램 자동화 - 자동 팔로우하기
드디어 마지막! 인스타그램 자동 팔로우 기능 구현입니다. 좋아요, 댓글과 마찬가지로 팔로우 하기 전 이미 팔로우를 한 상태인지 확인한 후에 팔로우 버튼을 클릭하도록 구현하겠습니다.
이전 강의 - 인스타그램 자동 좋아요, 자동 댓글
지난번에 작성한 소스코드에 이어서 작성했으니 아래의 링크에서 지난 강의를 참고해주세요.
작업환경
윈도우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()
다음 포스팅
파이썬 셀레니움으로 인스타그램 이미지 수백개 수집하기
공감과 댓글은 작성자에게 많은 힘이됩니다. 감사합니다😄
반응형
'인스타그램 자동화' 카테고리의 다른 글
인스타그램 무료 자동 좋아요 댓글 팔로우 프로그램 (2021/02/09 업데이트) (15) | 2022.03.01 |
---|---|
[파이썬(Python)] 인스타그램 자동 프로그램 만들기 - 자동 댓글 (2) (1) | 2021.02.27 |
[파이썬(Python)] 인스타그램 자동 프로그램 만들기 - 자동 댓글 (1) (2) | 2021.02.27 |
인스타그램 자동 좋아요 프로그램 만들기 - 파이썬(python), 셀레니움(selenium) - 기능 강화 및 예외 처리 (5) | 2021.02.02 |
인스타그램 자동 좋아요 프로그램 만들기 - 파이썬(python), 셀레니움(selenium) - 로그인, 원하는 횟수만큼 좋아요 작업 (8) | 2021.02.02 |
댓글