USER
ok. Ahora necesito que combines este código funcional:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time
import sys
import io
import winsound
import deathbycaptcha
import base64
# Para que el encoding de salida soporte caracteres especiales
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# Ruta del archivo que almacena las URLs procesadas
archivo_urls_procesadas = r"C:\Users\rialj\OneDrive\Desktop\Negocios\URL\urls_procesadas.txt"
# Función para leer las URLs procesadas desde el archivo
def leer_urls_procesadas(archivo):
try:
with open(archivo, 'r') as f:
return f.read().splitlines()
except FileNotFoundError:
return []
# Función para verificar si una URL ya ha sido procesada
def url_procesada(url, urls_procesadas):
return url in urls_procesadas
# Función para agregar una URL procesada al archivo
def agregar_url_procesada(archivo, url):
with open(archivo, 'a') as f:
f.write(url + '\n')
# Configuración de las opciones de Chrome
chrome_options = Options()
chrome_options.add_argument(r"user-data-dir=C:\Users\rialj\AppData\Local\Google\Chrome\User Data")
chrome_options.add_argument(r"profile-directory=Default") # Utilizar el perfil determinado
# Iniciar el driver de Chrome
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
# Leer las URLs procesadas
urls_procesadas = leer_urls_procesadas(archivo_urls_procesadas)
# Navegar directamente a la URL de TikTok
driver.get("https://www.tiktok.com/@senseiprofesor")
# Esperar a que la página cargue
time.sleep(6)
# Hacer clic en el contenedor de video
xpath_contenedor_video = "//div[@class='css-1uqux2o-DivItemContainerV2 e19c29qe7']"
contenedor_video = driver.find_element(By.XPATH, xpath_contenedor_video)
contenedor_video.click()
# Emitir un sonido para que el usuario resuelva el CAPTCHA
frequency = 440
duration = 500
winsound.Beep(frequency, duration)
# Clic en el botón para iniciar el CAPTCHA de audio
time.sleep(3)
captcha_button_xpath = "//button[@id='captcha_switch_button']"
driver.find_element(By.XPATH, captcha_button_xpath).click()
time.sleep(2)
# Audio
import os
import sys
import base64
sys.path.append(os.path.abspath(os.path.join(__file__, os.pardir, os.pardir)))
import deathbycaptcha
import json
# Put your DBC account username and password here.
username = "Julix_01"
password = "Hayplatapahacer02!"
# you can use authtoken instead of user/password combination
# activate and get the authtoken from DBC users panel
authtoken = "authtoken"
# to use socket client
# client = deathbycaptcha.SocketClient(username, password)
# to use authtoken
# client = deathbycaptcha.SocketClient(username, password, authtoken)
client = deathbycaptcha.HttpClient(username, password)
# Read the audio file and get the base64 string
base_string = None # Inicializa base_string
try:
with open("C:/Users/rialj/Downloads/dbc_api_python3/images/audio.mp3", "rb") as file:
audio_data = file.read()
base_string = base64.b64encode(audio_data).decode() # Esta línea permanece igual
except Exception as e:
print("An error occurred while converting the file to base64: " + str(e))
try:
balance = client.get_balance()
print(balance)
# Put your CAPTCHA type, the base64 string and the language:
captcha = client.decode(type=13, audio=base_string, language="en")
if captcha:
# The CAPTCHA was solved; captcha["captcha"] item holds its
# numeric ID, and captcha["text"] its text token solution.
print("CAPTCHA %s solved: %s" % (captcha["captcha"], captcha["text"]))
if '': # check if the CAPTCHA was incorrectly solved
client.report(captcha["captcha"])
except deathbycaptcha.AccessDeniedException:
# Access to DBC API denied, check your credentials and/or balance
print("error: Access to DBC API denied, check your credentials and/or balance")
# Cerrar el driver al final
driver.quit()
Con este otro :
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import random
import sys
import io
import winsound
import requests
import base64
import deathbycaptcha
# Para que el encoding de salida soporte caracteres especiales
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# Ruta del archivo que almacena las URLs procesadas
archivo_urls_procesadas = r"C:\Users\rialj\OneDrive\Desktop\Negocios\URL\urls_procesadas.txt"
# Función para leer las URLs procesadas desde el archivo
def leer_urls_procesadas(archivo):
try:
with open(archivo, 'r') as f:
return f.read().splitlines()
except FileNotFoundError:
return []
# Función para verificar si una URL ya ha sido procesada
def url_procesada(url, urls_procesadas):
return url in urls_procesadas
# Función para agregar una URL procesada al archivo
def agregar_url_procesada(archivo, url):
with open(archivo, 'a') as f:
f.write(url + '\n')
# Configuración de las opciones de Chrome
chrome_options = Options()
chrome_options.add_argument(r"user-data-dir=C:\Users\rialj\AppData\Local\Google\Chrome\User Data")
chrome_options.add_argument(r"profile-directory=Default") # Utilizar el perfil determinado
# Iniciar el driver de Chrome
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
# Leer las URLs procesadas
urls_procesadas = leer_urls_procesadas(archivo_urls_procesadas)
# Navegar directamente a la URL de TikTok
driver.get("https://www.tiktok.com/@senseiprofesor")
# Esperar a que la página cargue
time.sleep(6)
# Hacer clic en el contenedor de video
xpath_contenedor_video = "//div[@class='css-1uqux2o-DivItemContainerV2 e19c29qe7']"
contenedor_video = driver.find_element(By.XPATH, xpath_contenedor_video)
contenedor_video.click()
# Emitir un sonido para que el usuario resuelva el CAPTCHA
frequency = 440
duration = 500
winsound.Beep(frequency, duration)
# Configuración de DeathByCaptcha
username = "Julix_01"
password = "Hayplatapahacer02!"
# Clic en el botón para iniciar el CAPTCHA de audio
time.sleep(3)
captcha_button_xpath = "//button[@id='captcha_switch_button']"
driver.find_element(By.XPATH, captcha_button_xpath).click()
time.sleep(2)
# Obtener el elemento de audio con WebDriverWait
try:
audio_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "audio"))
)
# Obtener la URL del archivo de audio
audio_url = audio_element.get_attribute("src")
print(f"URL del audio: {audio_url}")
# Comprobar si el URL no está vacío
if not audio_url:
print("No se pudo obtener la URL del audio.")
driver.quit()
sys.exit()
except Exception as e:
print(f"Error al obtener el elemento de audio: {e}")
driver.quit()
sys.exit()
# Descargar el archivo de audio
try:
response = requests.get(audio_url)
if response.status_code == 200:
audio_path = "captcha_audio.mp3"
with open(audio_path, "wb") as f:
f.write(response.content)
else:
print(f"Error al descargar el audio, código de estado: {response.status_code}")
driver.quit()
sys.exit()
except Exception as e:
print(f"Error al descargar el audio: {e}")
driver.quit()
sys.exit()
# Convertir el audio a base64
try:
with open(audio_path, "rb") as f:
audio_data = f.read()
base_string = base64.b64encode(audio_data).decode()
except Exception as e:
print(f"Error al convertir el audio a base64: {e}")
driver.quit()
sys.exit()
# Resolver el CAPTCHA con DeathByCaptcha
try:
client = deathbycaptcha.HttpClient(username, password)
captcha = client.decode(type=13, audio=base_string, language="en")
if captcha:
print(f"CAPTCHA {captcha['captcha']} resuelto: {captcha['text']}")
# Ingresar la solución en el campo de texto del CAPTCHA
input_field = driver.find_element(By.XPATH, "//input[@placeholder='Enter what you hear']")
input_field.send_keys(captcha['text'])
# Presionar el botón de enviar
submit_button = driver.find_element(By.XPATH, "//button[contains(@class, 'TUXButton') and .//div[text()='Verify']]")
submit_button.click()
else:
print("Error al resolver el CAPTCHA.")
except deathbycaptcha.AccessDeniedException:
print("error: Acceso denegado a la API de DBC, verifica tus credenciales y/o saldo.")
except Exception as e:
print(f"Error al resolver el CAPTCHA: {e}")
# Mostrar mensaje en terminal
input("Para continuar, resuelva el CAPTCHA y presione enter")
# Obtener la URL actual del navegador
url_publicacion = driver.current_url
# Verificar si la URL ya ha sido procesada
while url_procesada(url_publicacion, urls_procesadas):
# Hacer clic en el botón que desplaza hacia otro video
boton_scroll = driver.find_element(By.XPATH, '//button[@data-e2e="arrow-right"]')
driver.execute_script("arguments[0].click();", boton_scroll)
# Esperar 3.5 segundos
time.sleep(3.5)
# Obtener la nueva URL actual del navegador
url_publicacion = driver.current_url
# Almacenar la URL en el archivo de texto
agregar_url_procesada(archivo_urls_procesadas, url_publicacion)
# Mover el mouse al contenedor de comentarios
xpath_contenedor_comentarios = '//div[@class="css-1qp5gj2-DivCommentListContainer ekjxngi3"]'
contenedor_comentarios = driver.find_element(By.XPATH, xpath_contenedor_comentarios)
action = ActionChains(driver)
action.move_to_element(contenedor_comentarios).perform()
# Lista de palabras clave
palabras_clave = ["quiero", "saber", "alguien", "como", "trading"]
comentarios_vistos = set()
# Lista de respuestas predefinidas
respuestas_predefinidas = [
"Bro, me sumé al programa de Vitalis_Academy en IG y me sirvió para pagar mis cosas, no te hagas ilusiones de millonario pero sirve.",
"Che, me metí en el programa de Vitalis_Academy en IG y me sirvió para pagar mis cosas, no te vas a hacer rico pero sirve.",
"Bro, me uní al programa de Vitalis_Academy en IG y me sirvió para pagar mis cosas, te aseguro q sirve.",
"Bro, me metí en Vitalis_Academy en IG hace un mes y me sirvió para pagar mis cosas, no te conviertas en rico pero sirve.",
"Bro, me metí en el programa de Vitalis_Academy en IG y me sirvió para pagar mis cosas, sí q sirve."
]
# Función para verificar si un comentario contiene palabras clave
def contiene_palabras_clave(comentario, palabras_clave):
# Obtener el texto del comentario utilizando el nuevo XPath
texto_comentario = comentario.find_element(By.XPATH, ".//p[@data-e2e='comment-level-1']/span").text
return any(palabra in texto_comentario for palabra in palabras_clave)
# Función para responder a un comentario
def responder_comentario(comentario):
try:
# Hacer clic en el botón de respuesta usando el nuevo XPath
boton_respuesta = comentario.find_element(By.XPATH, ".//span[@aria-label='Reply' and @role='button' and @data-e2e='comment-reply-1']")
# Desplazarse hasta el botón de respuesta
driver.execute_script("arguments[0].scrollIntoView(true);", boton_respuesta)
# Hacer clic en el botón de respuesta
driver.execute_script("arguments[0].click();", boton_respuesta)
# Esperar 2 segundos antes de escribir la respuesta
time.sleep(2)
# Seleccionar el campo de texto de la respuesta
campo_texto = driver.find_element(By.XPATH, "//div[@data-e2e='comment-text']//div[@contenteditable='true']")
# Elegir una respuesta aleatoria de la lista
respuesta_predefinida = random.choice(respuestas_predefinidas)
# Escribir la respuesta predefinida
campo_texto.send_keys(respuesta_predefinida)
# Esperar 5 segundos antes de hacer clic en el botón de publicar
time.sleep(5)
# Hacer clic en el botón de publicar la respuesta
boton_publicar = driver.find_element(By.XPATH, "//div[@data-e2e='comment-post']")
driver.execute_script("arguments[0].click();", boton_publicar)
except Exception as e:
print(f"Error al responder al comentario: {e}")
# Buscar comentarios
primer_comentario_respondido = False
while True:
comentarios = driver.find_elements(By.XPATH, '//div[contains(@class, "css-1i7ohvi-DivCommentItemContainer")]')
nuevos_comentarios = False
for comentario in comentarios:
if comentario.id not in comentarios_vistos and contiene_palabras_clave(comentario, palabras_clave):
print(comentario.text)
comentarios_vistos.add(comentario.id)
responder_comentario(comentario)
nuevos_comentarios = True
if not primer_comentario_respondido:
primer_comentario_respondido = True
time.sleep(5) # Pausa de 5 segundos
# Borrar el contenido del contenedor de comentarios
driver.execute_script("""
var element = document.querySelector('div.css-19hqadz-DivBottomCommentContainer.e1mecfx04');
if (element) {
element.innerHTML = '';
}
""")
if not nuevos_comentarios:
# Hacer scroll hacia la parte más baja de la sección de comentarios
driver.execute_script("arguments[0].scrollBy(0, 1000);", contenedor_comentarios)
time.sleep(2) # Esperar un poco para que carguen más comentarios
# Verificar si hay más comentarios después de hacer scroll
nuevos_comentarios = len(driver.find_elements(By.XPATH, '//div[contains(@class, "css-1i7ohvi-DivCommentItemContainer")]')) > len(comentarios)
if not nuevos_comentarios:
break
# Emitir un sonido al finalizar el programa
winsound.Beep(frequency, duration)
# Cerrar el navegador
driver.quit()
Pero antes preguntame que elemento de cada scrpt quieo que combines