Ejemplo n.º 1
0
class Netflix(object):
    """docstring for Netflix"""
    def __init__(self, driver, logger):
        super(Netflix, self).__init__()
        self.driver = driver
        self.r = Randomizer('netflix')
        self.logger = logger

    def login(self):
        try:
            self.driver.get("https://www.netflix.com/browse")
            user, password = open("credentials.txt", "r").read().splitlines()
            user_xp = '//*[@id="appMountPoint"]/div/div[2]/div/div/form[1]/label/input'
            self.driver.find_element_by_xpath(user_xp).send_keys(user)
            pass_xp = '//*[@id="appMountPoint"]/div/div[2]/div/div/form[1]/div[1]/label/input'
            self.driver.find_element_by_xpath(pass_xp).send_keys(password)
            sign_xp = '//*[@id="appMountPoint"]/div/div[2]/div/div/form[1]/button'
            self.driver.find_element_by_xpath(sign_xp).click()
            hassan_xp = '//*[@id="appMountPoint"]/div/div/div[2]/div/div/ul/li[3]/div/a/div/div'
            self.driver.find_element_by_xpath(hassan_xp).click()
        except:
            self.logger.log("Netflix: Login Failed")
            time.sleep(2)
            self.login()
        time.sleep(4)

    def play_random_video(self):
        self.driver.get("https://www.netflix.com/browse")
        time.sleep(3)
        pane_num = random.randint(1, 4)
        vid_num = random.randint(1, 4)
        vid_xp = '//*[@id="title-card-%d-%d"]/div/div[1]' % (pane_num, vid_num)
        try:
            self.driver.find_element_by_xpath(vid_xp).click()
            time.sleep(2)
            div = self.driver.find_element_by_class_name('jawBone')
            a_tag = div.find_elements_by_tag_name('a')[1]
            a_tag.click()
        except:
            self.logger.log("Netflix: Video playing Failed")
            self.driver.get("https://www.netflix.com/browse")
            time.sleep(3)
            self.play_random_video()
        play_time = self.r.get_play_time()
        time_str = "%dm,%ds" % (play_time / 60, play_time % 60)
        self.logger.write('Netflix', time_str, 'Auto')
        self.logger.log("Netflix: Playing video with resolution Auto for %s" %
                        time_str)
        time.sleep(play_time)

    def random_play(self):
        self.login()
        while 1:
            self.play_random_video()
            wait_time = self.r.get_wait_time()
            self.driver.get("chrome://settings/")
            self.logger.log("Netflix: Waiting for %dm,%ds" %
                            (wait_time / 60, wait_time % 60))
            time.sleep(wait_time)
class Youtube(object):
    """docstring for Youtube"""
    def __init__(self, driver, logger):
        super(Youtube, self).__init__()
        self.driver = driver
        self.logger = logger
        self.r = Randomizer('youtube')
        self.recursion_depth = 5

    def get_random_channel(self):
        #tech_users = ["marquesbrownlee","duncan33303","unboxtherapy","LinusTechTips"]
        pydata = ["PyDataTV", "jacobschwarz"]
        user = random.choice(pydata)
        y = "https://www.youtube.com/user/%s/videos" % user
        return y

    def get_time_in_sec(self, time_string):
        tup = map(int, time_string.split(':'))
        if len(tup) == 2:
            return tup[0] * 60 + tup[1]
        else:
            return tup[0] * 3600 + tup[1] * 60 + tup[2]

    def get_video_url_time_list(self):
        channel_url = self.get_random_channel()
        soup = get_soup(channel_url)
        try:
            vid_grid = soup.find('ul', id='channels-browse-content-grid')
            vid_panes = vid_grid.find_all('li')
        except:
            if self.recursion_depth == 0:
                return ["https://m.youtube.com/watch?v=2MpUj-Aua48"]
            self.get_video_url_time_list()

        urls_times = []
        youtube_prefix = "https://www.youtube.com"
        for li in vid_panes:
            a = li.find('a')
            if a is None:
                continue
            href = a['href']
            time_string = li.find('span', {'class': 'video-time'}).get_text()
            url = youtube_prefix + href
            t = self.get_time_in_sec(time_string)
            urls_times.append((url, t))
        return urls_times

    def disable_autoplay(self, driver):
        xpath = '//*[@id="autoplay-checkbox"]'
        self.driver.find_element_by_xpath(xpath).click()
        return

    def get_quality_button(self):
        elems = self.driver.find_elements_by_class_name('ytp-menuitem')
        elems = [
            x for x in elems if x.get_attribute('aria-haspopup') == 'true'
        ]
        for elem in elems:
            x = elem.find_element_by_class_name('ytp-menuitem-label').text
            if x == 'Quality':
                return elem

    def select_resolution(self, res_level):
        try:
            sb = self.driver.find_element_by_css_selector(
                '.ytp-button.ytp-settings-button')
            sb.click()
            time.sleep(1)
            qual = self.get_quality_button()
            actions = webdriver.ActionChains(self.driver)
            actions.move_to_element(qual)
            actions.click()
            for i in range(res_level + 1):
                actions.send_keys(Keys.UP)
            actions.send_keys(Keys.RETURN)
            actions.perform()
        except:
            if self.recursion_depth == 0:
                self.random_play()
            self.logger.log("Youtube: Resolution selection Failed")
            self.recursion_depth -= 1
            time.sleep(5)
            self.select_resolution(res_level)
        return

    def fetch_current_resolution(self):
        try:
            sb = self.driver.find_element_by_css_selector(
                '.ytp-button.ytp-settings-button')
            sb.click()
            time.sleep(1)
            qual = self.get_quality_button()
            res = qual.find_element_by_class_name('ytp-menuitem-content').text
            print "Resolution:", res
            # res = self.driver.find_element_by_xpath('//*[@id="movie_player"]/div[21]/div/div/div[5]/div[2]/div/span').text
            sb = self.driver.find_element_by_css_selector(
                '.ytp-button.ytp-settings-button')
            sb.click()
            return res
        except:
            if self.recursion_depth == 0:
                self.random_play()
            self.logger.log("Youtube: Resolution fetch Failed")
            self.recursion_depth -= 1
            time.sleep(3)
            self.fetch_current_resolution()

    def check_ad(self):
        try:
            self.driver.find_element_by_class_name('videoAdUiBottomBar')
        except:
            return
        # Get ad time
        try:
            time_elem = self.driver.find_element_by_class_name(
                'ytp-time-duration')
            ts = time_elem.text
            self.logger.write('YoutubeAd', ts, 'Auto')
            self.logger.log("Youtube: Playing Ad with resolution Auto for %s" %
                            ts)
            time.sleep(self.get_time_in_sec(ts))
        except:
            if self.recursion_depth < 0:
                self.random_play()
            time.sleep(2)
            self.recursion_depth -= 1
            self.check_ad()

    def play_video(self, url, time_sec, res_level):
        self.driver.get(url)
        time.sleep(3)
        self.check_ad()
        #self.disable_autoplay(self.driver)
        self.select_resolution(res_level)
        time.sleep(2)
        res = self.fetch_current_resolution()
        play_time = min(self.r.get_play_time(), time_sec)
        time_str = "%dm,%ds" % (play_time / 60, play_time % 60)
        self.logger.write('Youtube', time_str, res)
        self.logger.log("Youtube: Playing video with resolution %s for %s" %
                        (res, time_str))
        time.sleep(play_time)

    def random_play(self):
        self.urls_times = self.get_video_url_time_list()
        while 1:
            self.recursion_depth = 5
            if random.random() < 0.2:
                self.urls_times = self.get_video_url_time_list()
            url, time_sec = random.choice(self.urls_times)
            self.play_video(url, time_sec, self.r.get_resolution())
            self.driver.get('chrome://settings/')
            wait_time = self.r.get_wait_time()
            self.logger.log("Youtube: Waiting for %dm,%ds" %
                            (wait_time / 60, wait_time % 60))
            time.sleep(wait_time)
class Facebook(object):
    """docstring for Facebook"""
    def __init__(self, driver, logger):
        super(Facebook, self).__init__()
        self.driver = driver
        self.int_to_res = {1: '240p', 2: '360p', 3: '480p', 4: '720p'}
        self.r = Randomizer('facebook')
        self.logger = logger
        self.error_count = 0

    def get_random_url(self):
        prefix = 'https://www.facebook.com/facebook/videos/'
        vid_ids = [
            '10155484162461729/', '10155656407651729/', '10155278547321729/',
            '10154835146021729/', '10154729016861729/', '10154553970951729/',
            '10154249775416729/'
        ]
        return prefix + random.choice(vid_ids)

    # def select_resolution(self,res):
    # 	xp = '//*[@id="u_0_d"]/div/div[2]/div/div/div[3]/div[3]/button'
    # 	elem = self.driver.find_element_by_xpath(xp)
    # 	actions = webdriver.ActionChains(self.driver)
    # 	actions.move_to_element(elem)
    # 	xpath = '//*[@id="u_0_d"]/div/div[2]/div/div/div[3]/div[3]/div/div/div[1]/a[%d]' % (6-res)
    # 	res_elem = self.driver.find_element_by_xpath(xpath)
    # 	# res_elem.click()
    # 	actions.move_to_element(res_elem)
    # 	actions.click()
    # 	actions.perform()

    def get_video_length(self):
        time.sleep(1)
        xp = '//*[@id="u_0_d"]/div/div[2]/div/div/div[2]/div/div/div'
        try:
            elem = self.driver.find_element_by_xpath(xp)
            val = elem.get_attribute("aria-valuemax")
        except:
            self.logger.log("Facebook: Video length fetch failed")
            val = 9999
        return int(float(val))

    def play_video(self, url):
        try:
            self.driver.get(url)
            try:
                time.sleep(4)
                self.driver.find_element_by_id('u_0_7').click()
            except:
                pass
            time.sleep(1)
            self.driver.find_element_by_id('u_0_f').click()
        except:
            self.logger.log("Facebook: Video playing Failed")
            if self.recursion_depth == 0:
                self.random_play()
            self.recursion_depth -= 1
            time.sleep(2)
            self.play_video(self.get_random_url())
        time.sleep(1)
        #self.select_resolution(res)
        vid_len = self.get_video_length()
        rn_pl_tm = self.r.get_play_time()
        play_time = min(vid_len, rn_pl_tm)
        time_str = "%dm,%ds" % (play_time / 60, play_time % 60)
        self.logger.write('Facebook', time_str, 'Auto')
        self.logger.log("Facebook: Playing video with resolution Auto for %s" %
                        time_str)
        time.sleep(play_time)

    def random_play(self):
        while 1:
            self.recursion_depth = 5
            url = self.get_random_url()
            #res = self.r.get_resolution()
            self.play_video(url)
            self.driver.get('chrome://settings/')
            wait_time = self.r.get_wait_time()
            self.logger.log("Facebook: Waiting for %dm,%ds" %
                            (wait_time / 60, wait_time % 60))
            time.sleep(wait_time)