Instagram评论机器人异常:读取TXT时崩溃且无评论输出
Instagram评论机器人崩溃问题的修复方案
问题说明
机器人可成功登录Instagram并访问目标帖子,但尝试读取txt文件提取评论内容时程序崩溃,无评论发布。经排查,实际报错为instaloader登录时触发Instagram的Checkpoint验证要求,并非评论模块本身的问题。
原代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from time import sleep import instaloader import random import os.path driver = webdriver.Chrome(r"C:\\Users\\Windows\\Downloads\\chromedriver.exe") def sorteioInstagram(): abrindo_instagram("inspiracaobiel", "biel123", "https://www.instagram.com/p/CoI52RJOqnT/") if os.path.isfile('seguidores.txt'): print("Arquivo de Seguidores já carregado...") else: pegar_seguidores('bielbibiel') comentandoPost() def abrindo_instagram(username,password, url): print("Abrindo Instagram...") driver.get("https://www.instagram.com/") sleep(2) print("Fazendo Login no Instagram...") driver.find_element(By.XPATH,"//input[@name='username']").send_keys(username) driver.find_element(By.XPATH,"//input[@name='password']").send_keys(password) driver.find_element(By.XPATH,"//button[@type='submit']").click() sleep(10) print("Negando Solicitação de Segurança Instagram...") driver.find_element(By.XPATH,"//button[text()='Agora não']").click() sleep(5) driver.find_element(By.XPATH,"//button[text()='Agora não']").click() sleep(4) print("Acessando o Post do sorteio...") driver.get(url) def pegar_seguidores(usuario): L = instaloader.Instaloader() L.login('inspiracaobiel', 'biel123') profile = instaloader.Profile.from_username(L.context, usuario) print(f"Salvando Seguidores de {usuario}...") #Salvando Seguidores em Arquivo .TXT file = open("seguidores.txt", "a+") for followee in profile.get_followers(): username = "@" + followee.username file.write(username + "\n") file.close() def comentandoPost(): z = 0 while 1 == 1: cmt = driver.find_element(By.XPATH,'//*[@id="react-root"]/section/main/div/div[1]/article/div[3]/section[3]/div/form/textarea') cmt.click() comment = lendo_arquivo() driver.find_element(By.XPATH,'//*[@id="react-root"]/section/main/div/div[1]/article/div[3]/section[3]/div/form/textarea').send_keys(comment) driver.find_element(By.XPATH,'//*[@id="react-root"]/section/main/div/div[1]/article/div[3]/section[3]/div/form/textarea').send_keys(' ') sleep(10) driver.find_element(By.XPATH,'//*[@id="react-root"]/section/main/div/div[1]/article/div[3]/section[3]/div/form/textarea').send_keys(Keys.ENTER) sleep(10) driver.find_element(By.XPATH,'//*\*[@id="react-root"]/section/main/div/div[1]/article/div[3]/section[3]/div/form/textarea').send_keys(Keys.ENTER) z += 1 print(f"{z}") sleep(60) def lendo_arquivo(): with open("seguidores.txt", "r") as file: allText = file.read() words = list(map(str, allText.split())) return random.choice(words) sorteioInstagram()
报错信息
Traceback (most recent call last): File "c:\Users\gabri\Downloads\Codigo Comentarios\venv\Scripts\main.py", line 76, in <module> sorteioInstagram() File "c:\Users\gabri\Downloads\Codigo Comentarios\venv\Scripts\main.py", line 17, in sorteioInstagram pegar_seguidores('bielbibiel') File "c:\Users\gabri\Downloads\Codigo Comentarios\venv\Scripts\main.py", line 41, in pegar_seguidores L.login('inspiracaobiel', 'biel123') File "C:\Users\gabri\AppData\Local\Programs\Python\Python311\Lib\site-packages\instaloader\instaloader.py", line 634, in login self.context.login(user, passwd) File "C:\Users\gabri\AppData\Local\Programs\Python\Python311\Lib\site-packages\instaloader\instaloadercontext.py", line 239, in login raise ConnectionException("Login: Checkpoint required. Point your browser to " instaloader.exceptions.ConnectionException: Login: Checkpoint required. Point your browser to https://www.instagram.com/challenge/action/AXG6u8rHRprRccgzcgLKpQNJzv0wH2s1vajDDBvJi2xj-ypRREOtDgZK3e5Ee8HekhTocA0/AfxgQISXQXjHI8kasJEBP020fZ1GKKqFXXJGeaFzdDei1KKj2Pc3OVuZl5K_J3Og2Mxa0Yx64gubOg/ffc_XxXKP7ukaNEpowIhzsecXIF8lbX5oShdPs03HikkaCikTbJ50ZWn38x98bzTC5ZI/ - follow the instructions, then retry.
修复步骤
1. 处理Instaloader的Checkpoint验证
- 用已登录该Instagram账号的浏览器打开报错提示的验证链接,完成短信/邮箱等验证步骤,验证后重新运行程序。
- 优化:使用会话文件避免重复验证,修改
pegar_seguidores函数:def pegar_seguidores(usuario): L = instaloader.Instaloader() # 尝试加载已保存的会话 try: L.load_session_from_file('inspiracaobiel') except FileNotFoundError: # 无会话文件则登录,验证后自动保存会话 L.login('inspiracaobiel', 'biel123') L.save_session_to_file() profile = instaloader.Profile.from_username(L.context, usuario) print(f"Salvando Seguidores de {usuario}...") with open("seguidores.txt", "a+") as file: for followee in profile.get_followers(): username = "@" + followee.username file.write(username + "\n")
2. 修复评论模块的潜在问题
- 减少元素重复定位:缓存评论框元素,避免重复查找:
def comentandoPost(): z = 0 while True: comment_box = driver.find_element(By.XPATH,'//*[@id="react-root"]/section/main/div/div[1]/article/div[3]/section[3]/div/form/textarea') comment_box.click() comment = lendo_arquivo() comment_box.send_keys(comment) comment_box.send_keys(' ') sleep(10) comment_box.send_keys(Keys.ENTER) sleep(10) # 修正原XPATH的多余*符号 comment_box.send_keys(Keys.ENTER) z += 1 print(f"已发布 {z} 条评论") sleep(60) - 优化文件读取逻辑:一次性读取粉丝列表并缓存,减少IO操作:
# 全局缓存粉丝列表 followers_list = [] def lendo_arquivo(): global followers_list if not followers_list: with open("seguidores.txt", "r") as file: # 过滤空行 followers_list = [line.strip() for line in file if line.strip()] return random.choice(followers_list)
3. 避免重复登录触发安全机制
当前代码同时用Selenium和Instaloader登录同一账号,易触发风控。可通过Selenium获取会话Cookie传递给Instaloader,避免二次登录:
def abrindo_instagram(username,password, url): print("Abrindo Instagram...") driver.get("https://www.instagram.com/") sleep(2) print("Fazendo Login no Instagram...") driver.find_element(By.XPATH,"//input[@name='username']").send_keys(username) driver.find_element(By.XPATH,"//input[@name='password']").send_keys(password) driver.find_element(By.XPATH,"//button[@type='submit']").click() sleep(10) print("Negando Solicitação de Segurança Instagram...") driver.find_element(By.XPATH,"//button[text()='Agora não']").click() sleep(5) driver.find_element(By.XPATH,"//button[text()='Agora não']").click() sleep(4) print("Acessando o Post do sorteio...") driver.get(url) # 获取Cookie传递给Instaloader cookies = driver.get_cookies() global L L = instaloader.Instaloader() L.context.session.cookies.update({c['name']: c['value'] for c in cookies}) # 修改pegar_seguidores函数,不再重复登录 def pegar_seguidores(usuario): global L profile = instaloader.Profile.from_username(L.context, usuario) print(f"Salvando Seguidores de {usuario}...") with open("seguidores.txt", "a+") as file: for followee in profile.get_followers(): username = "@" + followee.username file.write(username + "\n")
内容的提问来源于stack exchange,提问作者Luiz Gabriel
相关产品推荐
相关产品推荐

