Semplice script in python che permette di commentare in tempo reale l'ultimo video uscito(negli ultimi 5 minuti) per ogni canale di una lista passata. E' scritto in python3(ci vuole poco ad adattarlo per il 2.7) e si può utilizzare su qualsiasi OS. Ottimo se si vuole sponsorizzare il proprio canale con utenti veri.
Dipendenze:
1)Selenium
2)PhantomJS
Funzionamento:
1)Inserire una lista di canali nel file channels.txt
2)Inserire una lista di commenti nel file comments.txt separati da: [BREAK]
3)Creare un file videos.log(dove vengono salvati i video già commentati)
4)Avviare il bot da linea di comando con nome utente, password e percorso PhantomJS(obbligatorio su Windows e facoltativo su altri sistemi)
Dipendenze:
1)Selenium
2)PhantomJS
Funzionamento:
1)Inserire una lista di canali nel file channels.txt
2)Inserire una lista di commenti nel file comments.txt separati da: [BREAK]
3)Creare un file videos.log(dove vengono salvati i video già commentati)
4)Avviare il bot da linea di comando con nome utente, password e percorso PhantomJS(obbligatorio su Windows e facoltativo su altri sistemi)
Python:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Prerequisites
# 1]https://pypi.python.org/pypi/selenium
# 2]http://phantomjs.org/download.html
#browser.save_screenshot('screen.png')
import os
import time
import random
import argparse
from urllib.parse import urlparse
try:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
except ImportError:
print('Install selenium!')
def read_log():
try:
f = open('videos.log', 'r', encoding="utf-8")
urls = f.read().split('@')
f.close()
return urls
except IOError:
print('File videos.log not exists!')
quit()
def write_log(video_id):
try:
f = open('videos.log', 'a', encoding="utf-8")
f.write(video_id + '@')
f.close()
except IOError:
print('File videos.log not exists!')
quit()
def get_comments():
try:
f = open('comments.txt', 'r', encoding="utf-8")
comments = f.read()
f.close()
return comments.split('[BREAK]')
except IOError:
print('File comments.txt not exists!')
quit()
def get_urls():
try:
f = open('channels.txt', 'r', encoding="utf-8")
urls = f.read().splitlines()
f.close()
return urls
except IOError:
print('File channels.txt not exists!')
quit()
def last_video(browser, url):
try:
browser.get(url + '/videos?sort=dd&view=0&flow=list')
last_time = browser.find_element_by_css_selector('.yt-lockup-meta-info > li:nth-child(1)').text
if 'second' in last_time or ('minut' in last_time and int(last_time.split(' ')[0]) <= 5):
video_id = browser.find_element_by_class_name('yt-lockup-video').get_attribute('data-context-item-id')
return video_id
else:
return None
except Exception:
return None
def check_exists_by_id(browser, id):
try:
browser.find_element_by_id(id)
except NoSuchElementException:
return False
return True
def post_comment(browser, email, password, video_id, comment):
try:
browser.get('https://accounts.google.com/ServiceLogin?continue=http%3A%2F%2Fwww.youtube.com%2Fsignin%3Fnext%3D%252Fwatch%253Fv%253D' + video_id + '%26app%3DNone%26action_handle_signin%3Dtrue%26hl%3Dit&passive=true&service=youtube&uilel=3&hl=it#identifier')
parsed = urlparse(browser.current_url)
if parsed.hostname == 'accounts.google.com':
browser.find_element_by_id('Email').send_keys(email)
browser.find_element_by_id('next').click()
WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.ID, "Passwd")))
browser.find_element_by_id('Passwd').send_keys(password)
browser.find_element_by_id('signIn').click()
return post_comment(browser, email, password, video_id, comment)
else:
if not check_exists_by_id(browser, 'movie_player'):
return None
if check_exists_by_id(browser, 'comments-disabled-message'):
return None
browser.set_window_size(1280, 930)
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'comment-simplebox-renderer')))
browser.find_element_by_class_name('comment-simplebox-renderer-collapsed-content').click()
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'comment-simplebox-text')))
browser.find_element_by_class_name('comment-simplebox-text').send_keys(comment)
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "comment-simplebox-submit")))
browser.find_element_by_class_name('comment-simplebox-submit').click()
WebDriverWait(browser, 10).until(EC.invisibility_of_element_located((By.CLASS_NAME, 'comment-simplebox-loading')))
return True
return None
except Exception:
return None
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('email', help='Google username/email')
parser.add_argument('password', help='Google password')
if os.name == 'nt':
parser.add_argument('browser', help='Browser driver path')
else:
parser.add_argument('-b', '--browser', help='Browser driver path')
args = parser.parse_args()
email = args.email
password = args.password
browser = args.browser
if browser != None:
browser = webdriver.PhantomJS(browser)
#browser = webdriver.Firefox('PATH')
else:
browser = webdriver.PhantomJS()
#browser = webdriver.Firefox()
browser.implicitly_wait(1)
print('########################')
print('# COMMENT BOT by Notte #')
print('########################')
print('Loading urls')
urls = get_urls()
print('Loading comments')
comments = get_comments()
print('Loading videos')
videos = read_log()
print('Scanning urls...')
while True:
for url in urls:
video_id = last_video(browser, url)
if video_id != None:
if not video_id in videos:
comment = random.choice(comments)
result = post_comment(browser, email, password, video_id, comment)
print('Video found: ' + video_id)
if result != None:
videos.append(video_id)
write_log(video_id)
print('Video commented: ' + video_id)
time.sleep(1)
time.sleep(3)