├── LICENSE ├── README.md ├── .gitignore └── scheduler.py /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 sinhapy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Instagram Post Scheduler 2 | ======== 3 | Auto Post 4 | 5 | ## IMPORTANT NOTES 6 | 7 | * If Your Photo Does Not Fit to the screen, You Can Use This Feature Called expand, to Use This Feature Just Unmute Below Lines: 8 | 9 | 1) `#expnd_btn = browser.find_element_by_class_name('pHnkA')` [line:55] 10 | 11 | 2) `#expnd_btn.click()` [line:56] 12 | 13 | 3) `#time.sleep(1)` [line:58] 14 | 15 | ## Before Running `scheduler.py` 16 | 17 | * Open scheduler.py File and Edit The Following Lines: 18 | 19 | 1) `username = 'USERNAME' # Enter your username here` [line:23] 20 | 21 | 2) `password = 'PASSWORD' # Enter your password here` [line:24] 22 | 23 | 3) `file_path = r"C:\Users\P Sinha\Desktop\Capture.png" # File Path Where Pic/Vid is Stored That You Want To Upload` [line:25] 24 | 25 | 4) `timee = "21:44" # Specific Time When The Post will be Posted` [line:92] 26 | 27 | 5) `caption = 'Hi There, P Sinha this side !' # Write Your Caption Here` [line:65] 28 | 29 | Ensure that you have Chrome installed and the 30 | [`chromedriver` ](https://chromedriver.chromium.org/downloads) that matches 31 | your Chrome version available on your `$PATH`. You may have to update this from time to time. 32 | 33 | ## Requirements 34 | 35 | * [Python](https://www.python.org/) 36 | * `python` on the PATH 37 | * [The Requests Library](http://python-requests.org) for Python: `pip install requests` 38 | * Install Selenium: 39 | 40 | ```bash 41 | pip install selenium 42 | ``` 43 | * Install Schedule: 44 | 45 | ```bash 46 | pip install schedule 47 | ``` 48 | * Install pyautogui: 49 | 50 | ```bash 51 | pip install PyAutoGUI 52 | ``` 53 | 54 | ## Run 55 | 56 | * Run the program using: 57 | 58 | ```bash 59 | python scheduler.py 60 | ``` 61 | 62 | Buy Me a Coffee 63 | ---- 64 | 65 | Buy Me A Coffee 66 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /scheduler.py: -------------------------------------------------------------------------------- 1 | import schedule 2 | from selenium import webdriver 3 | from selenium.webdriver.common.keys import Keys 4 | from selenium.webdriver.chrome.options import Options 5 | import time 6 | import pyautogui 7 | 8 | 9 | x = 0 10 | 11 | def post(): 12 | chrome_options = Options() 13 | chrome_options.add_argument( 14 | '--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1') 15 | browser = webdriver.Chrome(options=chrome_options) 16 | browser.get('https://www.instagram.com/accounts/login/') 17 | 18 | time.sleep(2) 19 | 20 | usrname_bar = browser.find_element_by_name('username') # Find the username bar 21 | passwrd_bar = browser.find_element_by_name('password') # Find the password bar 22 | 23 | username = 'USERNAME' # Enter your username here 24 | password = 'PASSWORD' # Enter your password here 25 | file_path = r"C:\Users\P Sinha\Desktop\Capture.png" # File Path Where Picture is Stored That You Want To Upload 26 | 27 | usrname_bar.send_keys(username) 28 | passwrd_bar.send_keys(password + Keys.ENTER) 29 | 30 | time.sleep(11) 31 | 32 | cncel_btn = browser.find_element_by_class_name('cmbtv') # Cancel Button 33 | 34 | cncel_btn.click() 35 | 36 | time.sleep(2) 37 | 38 | not_now_btn = browser.find_element_by_class_name('mt3GC') # Not Now button 39 | 40 | not_now_btn.click() 41 | 42 | time.sleep(1) 43 | 44 | upld_pic_btn = browser.find_element_by_xpath( 45 | '//div[@class="q02Nz _0TPg"] [@data-testid="new-post-button"] [@role="menuitem"] [@tabindex="0"]') # New Post Button 46 | upld_pic_btn.click() 47 | 48 | time.sleep(5) 49 | 50 | pyautogui.write(file_path) 51 | pyautogui.press('enter') 52 | 53 | time.sleep(7) 54 | 55 | #expnd_btn = browser.find_element_by_class_name('pHnkA') 56 | #expnd_btn.click() 57 | 58 | #time.sleep(1) 59 | 60 | nxt_btn = browser.find_element_by_class_name('UP43G') 61 | nxt_btn.click() 62 | 63 | time.sleep(2) 64 | 65 | caption = 'Hi There, P Sinha this side !' # Write Your Caption Here 66 | 67 | cptn = browser.find_element_by_class_name('_472V_') 68 | cptn.send_keys(caption) 69 | pst_btn = browser.find_element_by_class_name('UP43G') 70 | pst_btn.click() 71 | 72 | time.sleep(15) # Upload Time, it depends on your file size and internet speed 73 | 74 | browser.quit() 75 | 76 | print(''' 77 | Successfully Uploaded! 78 | 79 | Python Program by 80 | ___ ___ _ _ 81 | | _ \ / __(_)_ _ | |_ __ _ 82 | | _/ \__ \ | ' \| ' \/ _` | 83 | |_| |___/_|_||_|_||_\__,_| 84 | 85 | Follow me on Instagram @b31ngdev 86 | 87 | Github b31ngd3v 88 | ''') 89 | x += 1 90 | 91 | 92 | timee = "21:44" # Specific Time When The Post will be Posted 93 | 94 | schedule.every().day.at(timee).do(post) 95 | 96 | try: 97 | while True and x != 1: 98 | schedule.run_pending() 99 | time.sleep(1) 100 | except UnboundLocalError: 101 | print('') 102 | --------------------------------------------------------------------------------