-
-
Save maxpoletaev/0037fff3be1fbdb889bb to your computer and use it in GitHub Desktop.
| """ | |
| Automatic migration of subscriptions to another | |
| YouTube account with Python and Selenium. | |
| Tested with: | |
| - selenium 3.0 | |
| - firefox 49.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. | |
| 4. Run script, enter your credentials 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 time | |
| import re | |
| def main(): | |
| driver = webdriver.Firefox() | |
| sign_in(driver) | |
| for channel in load_subcribtions(): | |
| subscribe(driver, channel) | |
| driver.close() | |
| def sign_in(driver): | |
| email, password = input('Email: '), input('Password: ') | |
| driver.get('https://www.youtube.com') | |
| driver.find_element_by_css_selector('.signin-container button').click() | |
| time.sleep(1) | |
| 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() | |
| time.sleep(1) | |
| 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') | |
| is_subscribed = button.get_attribute('data-is-subscribed') | |
| if not is_subscribed: | |
| button.click() | |
| print('{:.<50}{}'.format(channel.title, 'skip' if is_subscribed else 'done')) | |
| time.sleep(1) | |
| if __name__ == '__main__': | |
| main() |
Thanks for the code!
In addition, I had a lot of trouble with the script trying to subscribe me to channels that I was already subscribed to. So I figured out I could subtract the destination channel list from the source. Of course, that meant I had to also import my subscription list for my destination account.
Terminated accounts and VEVO accounts are something you want to consider. Apparently a lot of VEVO accounts apparently hide the subscribe button completely if you are subscribed(!). I also added some exception handling in case the script could not scroll the subscribe button into view.
Now, I just have to wait a couple hours for the rest of my subscriptions...
Hey. Any new update? Still need this :(
@thdung002 Sorry but wrote this for one-time use and have no plans for supporting each change youtube is making. Check out the forks—if this one doesn’t, some of the forks still might work.
Thanks a lot for this code! Works like a charm with the couple of changes mentioned previously.