├── .gitignore ├── requirements.txt ├── .env ├── Provider.py ├── .github └── FUNDING.yml ├── README.md ├── app.py ├── Netflix.py └── Ocs.py /.gitignore: -------------------------------------------------------------------------------- 1 | .env.dev -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | selenium==3.141.0 2 | faker==1.0.5 3 | python-dotenv==0.8.2 4 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | CARD_LAST_NAME= 2 | CARD_FIRST_NAME= 3 | CARD_NUMBER= 4 | CARD_EXPIRE_MONTH= 5 | CARD_EXPIRE_YEAR= 6 | CARD_CVV= -------------------------------------------------------------------------------- /Provider.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | 3 | class Provider(object): 4 | 5 | def __init__(self, browser): 6 | self.browser = browser 7 | 8 | def quit(self): 9 | self.browser.quit() 10 | 11 | def scrollToDown(self): 12 | self.browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | custom: # Replace with a single custom sponsorship URL 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OneFreeMonth 2 | Get free month from Netflix, OCS... 3 | 4 | ## Installation 5 | 6 | Tested with Python 3.7. 7 | 8 | `pip install -r requirements.txt` 9 | 10 | `py app.py --help` 11 | 12 | ## TODO 13 | 14 | - [x] Generate account for free month 15 | - [ ] Generate virtual credit card with amount for Netflix 16 | - [ ] Close account before the end of free month 17 | - [x] Support OCS 18 | - [x] Support Netflix 19 | - [ ] Support Hulu 20 | - [ ] Support Amazon Prime Video 21 | - [ ] Support Spotify 22 | - [ ] Support Deezer 23 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from Netflix import Netflix 2 | from Ocs import Ocs 3 | from uuid import uuid4 4 | import os 5 | from dotenv import load_dotenv 6 | import argparse 7 | 8 | if __name__ == "__main__": 9 | ap = argparse.ArgumentParser() 10 | 11 | ap.add_argument("--env", type=str, required=False, help="Select .env file") 12 | ap.add_argument("--netflix", type=bool, required=False, help="Create Netflix account") 13 | ap.add_argument("--ocs", type=bool, required=False, help="Create Ocs account") 14 | 15 | args = vars(ap.parse_args()) 16 | 17 | if args['env']: 18 | load_dotenv(args['env']) 19 | else: 20 | load_dotenv('.env') 21 | 22 | if args['netflix']: 23 | print('Selected provider: Netflix') 24 | provider = Netflix() 25 | if args['ocs']: 26 | print('Selected provider: Ocs with three screen plan') 27 | provider = Ocs(threeScreen=True) 28 | 29 | email = str(uuid4())[:8] + "@yopmail.com" 30 | password = str(uuid4()) + '@//*' 31 | cardLastName = os.getenv('CARD_LAST_NAME') 32 | cardFirstName = os.getenv('CARD_FIRST_NAME') 33 | cbNumber = os.getenv('CARD_NUMBER') 34 | expireMonth = os.getenv('CARD_EXPIRE_MONTH') 35 | expireYear = os.getenv('CARD_EXPIRE_YEAR') 36 | cvv = os.getenv('CARD_CVV') 37 | 38 | print('email: ' + email, 'password: ' + password) 39 | 40 | try: 41 | account = provider.register(email, password, cbNumber, expireMonth, expireYear, cvv, cardLastName, cardFirstName) 42 | except Exception as e: 43 | provider.quit() 44 | raise e 45 | -------------------------------------------------------------------------------- /Netflix.py: -------------------------------------------------------------------------------- 1 | from Provider import Provider 2 | from selenium import webdriver 3 | from time import sleep 4 | 5 | class Netflix(Provider): 6 | 7 | def __init__(self): 8 | self.base_url = 'https://www.netflix.com/signup/regform' 9 | 10 | options = webdriver.ChromeOptions() 11 | options.add_argument("--headless") 12 | 13 | self.browser = webdriver.Chrome(options=options) 14 | super().__init__(browser=self.browser) 15 | 16 | def register(self, email, passwd, cbNumber, expireMonth, expireYear, cvv, cardLastName, cardFirstName): 17 | expireDate = str(expireMonth) + str(expireYear)[2:4] 18 | self.browser.get(self.base_url) 19 | sleep(1) 20 | self.scrollToDown() 21 | 22 | # First step 23 | centerContainer = self.browser.find_elements_by_css_selector('div.centerContainer')[0] 24 | container = centerContainer.find_elements_by_css_selector('div.submitBtnContainer')[0] 25 | button = container.find_elements_by_css_selector('button.nf-btn')[0] 26 | button.click() 27 | sleep(1) 28 | 29 | # Select plan 30 | self.scrollToDown() 31 | centerContainer = self.browser.find_elements_by_css_selector('div.centerContainer')[0] 32 | container = centerContainer.find_elements_by_css_selector('div.submitBtnContainer')[0] 33 | button = container.find_elements_by_css_selector('button.nf-btn')[0] 34 | button.click() 35 | sleep(1) 36 | 37 | # Go to create account page 38 | self.scrollToDown() 39 | centerContainer = self.browser.find_elements_by_css_selector('div.centerContainer')[0] 40 | container = centerContainer.find_elements_by_css_selector('div.submitBtnContainer')[0] 41 | button = container.find_elements_by_css_selector('button.nf-btn')[0] 42 | button.click() 43 | sleep(1) 44 | 45 | # Create account 46 | # Find and input user and password 47 | username = self.browser.find_element_by_name("email") 48 | username.send_keys(email) 49 | 50 | password = self.browser.find_element_by_name("password") 51 | password.send_keys(passwd) 52 | 53 | # Send create account 54 | self.scrollToDown() 55 | container = self.browser.find_elements_by_css_selector('div.submitBtnContainer')[0] 56 | button = container.find_elements_by_css_selector('button.nf-btn')[0] 57 | button.click() 58 | sleep(1) 59 | 60 | # Select card payement 61 | self.scrollToDown() 62 | centerContainer = self.browser.find_elements_by_css_selector('div.paymentContainer')[0] 63 | link = centerContainer.find_elements_by_css_selector('a.nfTabSelection--active')[0] 64 | link.click() 65 | sleep(1) 66 | 67 | # Add credit card information 68 | firstName = self.browser.find_element_by_name("firstName") 69 | firstName.send_keys(cardFirstName) 70 | 71 | lastName = self.browser.find_element_by_name("lastName") 72 | lastName.send_keys(cardLastName) 73 | 74 | creditCard = self.browser.find_element_by_name("creditCardNumber") 75 | creditCard.send_keys(cbNumber) 76 | 77 | creditExpiration = self.browser.find_element_by_name("creditExpirationMonth") 78 | creditExpiration.send_keys(expireDate) 79 | 80 | creditCardCode = self.browser.find_element_by_name("creditCardSecurityCode") 81 | creditCardCode.send_keys(cvv) 82 | 83 | self.scrollToDown() 84 | container = self.browser.find_elements_by_css_selector('div.submitBtnContainer')[0] 85 | button = container.find_elements_by_css_selector('button.nf-btn')[0] 86 | button.click() 87 | self.browser.quit() 88 | 89 | def cancelSubscription(self): 90 | accountUrl = 'https://www.netflix.com/CancelPlan' 91 | self.browser.get(accountUrl) 92 | cancelContainer = self.browser.find_elements_by_css_selector('div.cancelContainer')[0] 93 | cancelContainer.find_elements_by_css_selector('button.btn')[0].click() -------------------------------------------------------------------------------- /Ocs.py: -------------------------------------------------------------------------------- 1 | from Provider import Provider 2 | from selenium import webdriver 3 | from selenium.webdriver.support.ui import Select 4 | from time import sleep 5 | from faker import Faker 6 | 7 | class Ocs(Provider): 8 | 9 | def __init__(self, threeScreen): 10 | two_screen = 'https://www.ocs.fr/souscription/creation?offer=999' 11 | three_screen = 'https://www.ocs.fr/souscription/creation?offer=1199' 12 | 13 | if threeScreen: 14 | self.base_url = three_screen 15 | else: 16 | self.base_url = two_screen 17 | 18 | self.faker = Faker() 19 | 20 | options = webdriver.ChromeOptions() 21 | options.add_argument("--headless") 22 | self.browser = webdriver.Chrome(options=options) 23 | super().__init__(browser=self.browser) 24 | 25 | def register(self, email, passwd, cbNumber, expireMonth, expireYear, cvv, cardLastName, cardFirstName): 26 | name = self.faker.name() 27 | firstname = name.split(' ')[0] 28 | lastname = name.split(' ')[1] 29 | 30 | self.browser.get(self.base_url) 31 | sleep(1) 32 | 33 | # Create account 34 | self.scrollToDown() 35 | 36 | firstNameEl = self.browser.find_element_by_name("firstname") 37 | firstNameEl.send_keys(firstname) 38 | lastNameEl = self.browser.find_element_by_name("name") 39 | lastNameEl.send_keys(lastname) 40 | 41 | emailEl = self.browser.find_element_by_name("email") 42 | emailEl.send_keys(email) 43 | emailConfEl = self.browser.find_element_by_name("email-confirmation") 44 | emailConfEl.send_keys(email) 45 | 46 | password = self.browser.find_element_by_name("password") 47 | password.send_keys(passwd) 48 | 49 | # Remove cookie overlay 50 | try: 51 | self.browser.find_elements_by_css_selector('button.eu-cookie-compliance-secondary-button')[0].click() 52 | sleep(1) 53 | except Exception as e: 54 | print("Failed to remove cookie overlay") 55 | 56 | # Send create account 57 | container = self.browser.find_elements_by_css_selector('div.action')[0] 58 | button = container.find_elements_by_css_selector('button.btn--fill')[0] 59 | button.click() 60 | 61 | # Switch to credit card iframe 62 | sleep(2) 63 | iframeContainer = self.browser.find_elements_by_css_selector('div.iframe')[0] 64 | iframe = iframeContainer.find_element_by_id('ocs-activation') 65 | self.browser.switch_to.frame(iframe) 66 | 67 | # Fill cb owner name 68 | inputCbOwner = self.browser.find_element_by_name('pai_nom') 69 | inputCbOwner.clear() 70 | inputCbOwner.send_keys(cardLastName + ' ' +cardFirstName) 71 | 72 | # Fill cb number 73 | cbNumber = str(cbNumber) 74 | creditCard = self.browser.find_element_by_name("pai_numcb_1") 75 | creditCard.send_keys(cbNumber[0:4]) 76 | 77 | creditCard = self.browser.find_element_by_name("pai_numcb_2") 78 | creditCard.send_keys(cbNumber[4:8]) 79 | 80 | creditCard = self.browser.find_element_by_name("pai_numcb_3") 81 | creditCard.send_keys(cbNumber[8:12]) 82 | 83 | creditCard = self.browser.find_element_by_name("pai_numcb_4") 84 | creditCard.send_keys(cbNumber[12:16]) 85 | 86 | # cb month 87 | select = Select(self.browser.find_element_by_name('pai_expir_mm')) 88 | select.select_by_value(expireMonth) 89 | 90 | # cb year 91 | select = Select(self.browser.find_element_by_name('pai_expir_aa')) 92 | select.select_by_value(expireYear) 93 | 94 | # cb code 95 | creditCardCode = self.browser.find_element_by_name("pai_cvc") 96 | creditCardCode.send_keys(cvv) 97 | 98 | button = self.browser.find_element_by_id('btn-active-abo') 99 | button.click() 100 | sleep(20) 101 | 102 | self.browser.switch_to.default_content() 103 | self.browser.quit() 104 | 105 | def cancelSubscription(self): 106 | base_url = 'https://go.ocs.fr/' 107 | self.browser.get(base_url) 108 | sleep(1) 109 | self.browser.find_elements_by_css_selector('span.delete_profil')[0].click() 110 | sleep(1) 111 | self.browser.find_elements_by_css_selector('span.confirm_delete_profil')[0].click() 112 | 113 | 114 | cancelContainer.find_elements_by_css_selector('button.btn')[0].click() --------------------------------------------------------------------------------