""" Automatic migration of subscriptions to another YouTube account with Python and Selenium. Tested with: - selenium 2.52 - firefox 45.0 - python 3.5 1. Install selenium from pypi: $ pip install selenium 2. Go to the down of page https://www.youtube.com/subscription_manager and download your current subscriptions feed. Save file as subscription_manager.xml. 3. Enter your credentials into constants GOOGLE_EMAIL and GOOGLE_PASSWORD 4. Run script and go to drink coffee. It will take some time. Note YouTube will temporary block you if you have more that 80 subscriptions. Just restart the script in a few hours. """ from collections import namedtuple from selenium import webdriver from xml.dom import minidom import pickle import time import re import os GOOGLE_EMAIL = 'googleaccount@gmail.com' GOOGLE_PASSWORD = 'securepassword' def sign_in(driver, credentials): cookies_file = 'cookies.bin' if os.path.isfile(cookies_file): driver.get('http://www.youtube.com') cookies = pickle.load(open(cookies_file, 'rb')) for cookie in cookies: driver.add_cookie(cookie) driver.refresh() return email, password = credentials driver.get('https://www.google.com/accounts/Login?continue=http://www.youtube.com') driver.find_element_by_id('Email').send_keys(email) driver.find_element_by_id('next').click() time.sleep(1) driver.find_element_by_id('Passwd').send_keys(password) driver.find_element_by_id('signIn').click() pickle.dump(driver.get_cookies(), open(cookies_file, 'wb')) def load_subcribtions(): xmldoc = minidom.parse('subscription_manager.xml') itemlist = xmldoc.getElementsByTagName('outline') channel_id_regexp = re.compile('channel_id=(.*)$') Channel = namedtuple('Channel', ['id', 'title']) subscriptions = [] for item in itemlist: try: feed_url = item.attributes['xmlUrl'].value channel = Channel(id=channel_id_regexp.findall(feed_url)[0], title=item.attributes['title'].value) subscriptions.append(channel) except KeyError: pass return subscriptions def subscribe(driver, channel): channel_url = 'https://www.youtube.com/channel/' + channel.id driver.get(channel_url) time.sleep(1) button = driver.find_element_by_css_selector('.channel-header-subscription-button-container > button') skip = button.get_attribute('data-is-subscribed') if not skip: button.click() print('{:.<50}{}'.format(channel.title, 'skip' if skip else '✔')) time.sleep(1) def main(): driver = webdriver.Firefox() sign_in(driver, (GOOGLE_EMAIL, GOOGLE_PASSWORD)) for channel in load_subcribtions(): subscribe(driver, channel) driver.close() if __name__ == '__main__': main()