├── .gitignore ├── LICENSE.txt ├── README.md ├── bot ├── requests-V2 │ ├── __init__.py │ └── main.py └── selenium-V2 │ └── autoViews.py ├── img └── tiktok_logo.png └── setup ├── setup.cfg └── setup.py /.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 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Nyumat 4 | nyumat18@gmail.com 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 |

5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 |

[PATCHED.]

13 |

The TikTok Bot

14 | 15 |

Made By Nyumat.

16 |
17 | 18 | 19 |

See here 20 | and here for why, and, what's next for this project.

21 | 22 |

Disclaimer: This bot is for educational purposes, only.

23 |
24 |
25 | 26 | ## Patch Explanation 27 | 28 | * The Selenium version is patched. 29 | * However, FireLiker.com is still an active service on the internet, [here](fireliker.com) 30 | * The requests version is also patched. TikTok.com's API is no longer accessible with normal, non-authed headers. (I still can't believe it was at some point.) 31 | * You can make your own bot instance with this latest commit for another service, such as instagram for example. 32 | 33 | 34 | ## Getting Started 35 | 36 | * There's a selenium version and a concurrent, http requests version. 37 | * The selenium version requires a re-write and is barring any revisions to the fireliker.com site, is non-useful (There's a CAPTCHA). 38 | * The requests version was the original bot, and had its hayday, but is patched as well. 39 | * I've comitted changes which will make it easier for developers to create their own bot instance for plug-in-play type use on any social media API. 40 | * Most if not all of the TikTok related inputs can be revised as needed for your use case. 41 | 42 | ## Proxies 43 | 44 | The bot scrapes proxies from [free-proxy-list.net.](https://free-proxy-list.net) Here's an example method from the TikTokBot class, with comments explaining the process. The reason this is important is because the proxies are what allow the bot to appear unique to clients. 45 | 46 | > Note, you may or may not need to create a solution to determine if the proxy is working as free proxies tend to be the most unreliable. Although I will say I've had decent luck so far. 47 | 48 | ```python 49 | def get_elite_proxies(use_http=True): 50 | # Generate a random user agent. 51 | ua = UserAgent() 52 | user_agent = ua.random 53 | # Our proxy solution. 54 | url = 'https://free-proxy-list.net/' 55 | # Define the headers for the request. 56 | ua_header = {'User-Agent': user_agent} 57 | content = requests.get(url, headers=ua_header).text 58 | # Our web scraper, bs4 gives us the HTML elements on the page. 59 | soup = BeautifulSoup(content, 'html.parser') 60 | rows = [] 61 | # It through the table rows we need to scrape for further processing 62 | for row in soup.findAll("tr"): 63 | rows.append(row) 64 | elite_https_proxies = [] 65 | # If use_http is false, we'll be using the non-https proxy ips. 66 | elite_proxies = [] 67 | # Futher process each row to grab the ip 68 | for row in rows: 69 | # Get the cells 70 | i = row.findAll('td') 71 | try: 72 | # Here/Below, we're just writing to files storing the ip and port. 73 | # This can be mofidied for your use case with the bot instance. 74 | if use_http == True: 75 | if (i[4].text == 'elite proxy') and i[6].text == 'yes': 76 | with open('elite_proxies.txt', 'r+') as f: 77 | last_line = f.readlines()[-1] 78 | f.write(i[0].text + ':' + i[1].text) 79 | f.write('\n') 80 | elite_https_proxies.append(i[0].text + ':' + i[1].text) 81 | else: 82 | if (i[4].text == 'elite proxy') and i[6].text == 'no': 83 | with open('elite_proxies.txt', 'r+') as f: 84 | last_line = f.readlines()[-1] 85 | f.write(i[0].text + ':' + i[1].text) 86 | f.write('\n') 87 | elite_proxies.append(i[0].text + ':' + i[1].text) 88 | except: 89 | continue 90 | # Depending on the argument passed in, we'll use the https list or not. 91 | return "\n".join([str(i) for i in elite_https_proxies]) if use_http == True else "\n".join([str(i) for i in elite_proxies]) 92 | 93 | ``` 94 | 95 | ## Closing Thoughts 96 | 97 | It was a solid run and honestly, even though this project is now an artifact, I'm thankful for what were able to achieve and show to the world in 2020. 98 | 99 | I can forsee a new social media application being creted in the next couple years possibly allowing us to take advantage of weak API design. 100 | 101 | But until then, we'll have to all move forward. Peace ✌🏿 102 | 103 | 104 | ## License 105 | 106 | [![License](https://img.shields.io/badge/license-MIT-greene)](http://badges.mit-license.org) 107 | - **[MIT license](LICENSE.txt)** 108 | -------------------------------------------------------------------------------- /bot/requests-V2/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | # Imports all the modules for the script. 3 | from os.path import dirname, basename, isfile, join 4 | import glob 5 | import os 6 | 7 | modules = glob.glob(join(dirname(__file__), "*.py")) 8 | __all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')] 9 | 10 | # Calls program files 11 | if __name__ == '__init__': 12 | os.system('python3 __init__.py') 13 | os.system('python3 main.py') 14 | -------------------------------------------------------------------------------- /bot/requests-V2/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from random import randint, choice, random 4 | import requests 5 | from threading import active_count, Thread 6 | import threading 7 | from time import strftime, gmtime, time, sleep 8 | from bs4 import BeautifulSoup 9 | import logging 10 | import ssl 11 | from pystyle import Colorate, Colors, Write 12 | from http import cookiejar 13 | import regex as re 14 | from fake_useragent import UserAgent 15 | os.system('clear') 16 | print(" ████████▀▀▀████ ") 17 | print(" ████████────▀██ ") 18 | print(" ████████──█▄──█ ") 19 | print(" ███▀▀▀██──█████ ") 20 | print(" █▀──▄▄██──█████ ") 21 | print(" █──█████──█████ ") 22 | print(" █▄──▀▀▀──▄█████ ") 23 | print(" ███▄▄▄▄▄███████ ") 24 | print(" ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ") 25 | print("\n") 26 | print( 27 | ''' 28 | ======================================= 29 | | Hello & Welcome to The-TikTok-Bot! | 30 | |This bot was once a monumetal exploit| 31 | |of TikTok's API. Now, it is a bot not| 32 | |containing any exploits, and is just | 33 | |purely archive. Feel use this bot to | 34 | | bootstrap your own bot instance. | 35 | ======================================= 36 | ''' 37 | ) 38 | 39 | 40 | class TikTokBot: 41 | 42 | # Proxies are still being implemented. 43 | def __init__(self, proxies=None): 44 | self.added = 0 45 | self.amount = 0 46 | self.views = 0 47 | self.proxy = proxies 48 | self.time = 0 49 | self.video_id = "" 50 | 51 | def start(self): 52 | self.clear() 53 | self.menu() 54 | 55 | def menu(self): 56 | proceed = True 57 | try: 58 | self.amount = int(input('> View Count: ')) 59 | except ValueError: 60 | proceed = False 61 | self.close('Integer expected.') 62 | try: 63 | self.video_id = input('> TikTok Video Url: ').split('/')[5] 64 | except IndexError: 65 | proceed = False 66 | self.close( 67 | 'Invalid TikTok URL format.\nFormat expected: https://www.tiktok.com/@username/video/1234567891234567891' 68 | ) 69 | if proceed: 70 | self.bot_init() 71 | 72 | def close(self, message): 73 | print(message) 74 | sys.exit() 75 | 76 | def notice(self, message): 77 | print(message) 78 | 79 | def status(self, code, intention): 80 | if (code == 200 and intention == "Bot Running"): 81 | self.added += 1 82 | self.notice( 83 | f'Views Added: {self.added}/{self.amount} ({round(((self.added / self.amount) * 100), 3)}%)') 84 | self.notice('Bot run in Progress...') 85 | else: 86 | if intention == "complete": 87 | self.notice('Bot run complete.') 88 | self.notice(f'Views Added: {self.added}/{self.amount}') 89 | self.notice( 90 | f'Time Elapsed: {strftime("%H:%M:%S", gmtime(time() - self.start_time))}') 91 | self.notice(f'Active Threads: {threading.active_count() ^ 1}') 92 | self.notice( 93 | f'Average Views Per Second: {round(self.added / (time() - self.start_time), 3)}') 94 | 95 | def update_title(self, views): 96 | while self.amount != self.added: 97 | self.added += 1 98 | print(f'Views Added: {self.added}') 99 | print('Bot run in Progress...') 100 | 101 | while self.added < self.amount: 102 | 103 | time_remaining = strftime( 104 | '%H:%M:%S', gmtime( 105 | (time() - self.start_time) / 106 | self.added * (self.amount - self.added) 107 | ) 108 | ) 109 | os.system( 110 | f'title ~ The TikTok Bot ~ - Added: {self.added}/{self.amount} ' 111 | f'({round(((self.added / self.amount) * 100), 3)}%) ^| Active Threads: ' 112 | f'{threading.active_count()} ^| Time Remaining: {time_remaining}' 113 | ) 114 | 115 | os.system( 116 | f'title ~ The TikTok Bot ~ - Added: {self.added}/{self.amount} ' 117 | f'({round(((self.added / self.amount) * 100), 3)}%) ^| Active Threads: ' 118 | f'{threading.active_count()} ^| Time Remaining: 00:00:00' 119 | ) 120 | 121 | def bot_init(self): 122 | # Defines the bots userAgent, keys, and headers. 123 | action_time = round(time()) 124 | device_id = randint(100000000000000, 999999999999999) 125 | 126 | data = ( 127 | f'action_time={action_time}&item_id={self.video_id}&item_type=1&play_delta=1&stats_cha' 128 | 'nnel=copy' 129 | ) 130 | headers = { 131 | 'Content-Type': 'application/x-www-form-urlencoded', 132 | 'x-common-params-v2': 'version_code=16.6.5&app_name=musical_ly&channel=App%20Store&devi' 133 | f'ce_id={device_id}&aid=1233&os_version=13.5.1&device_platform=ip' 134 | 'hone&device_type=iPhone10,5', 135 | 'User-Agent': 'TikTok 16.6.5 rv:166515 (iPhone; iOS 13.6; sv_SE) Cronet' 136 | } 137 | 138 | try: 139 | """ 140 | We no longer have acess to the old api solution, but I did some reverse search through my router and found this. 141 | 142 | These are the api domains in which my tiktok app has been networking within my network. 143 | 144 | [There is possibility none of these work anymore since it's been a few years, but I'm sure you can find some yourself.] 145 | 146 | api16-core-c-alisg.tiktokv.com 147 | api16-core-c-useast1a.tiktokv.com 148 | api16-core-va.tiktokv.com 149 | api19-core-c-useast1a.tiktokv.com 150 | api19-core-va.tiktokv.com 151 | api19-normal-c-useast1a.tiktokv.com 152 | api21-core-c-alisg.tiktokv.com 153 | api22-core-c-useast1a.tiktokv.com 154 | api22-normal-c-useast1a.tiktokv.com 155 | 156 | """ 157 | response = requests.post( 158 | 'See_Doc', data=data, headers=headers, 159 | proxies=self.proxy, timeout=10 160 | ) 161 | 162 | self.start(self.amount, self.proxy) 163 | 164 | except Exception as e: 165 | print(f'Error: {e}') 166 | self.bot() 167 | 168 | def start(self): 169 | self.start_time = time() 170 | 171 | self.amount = input('> View Count: ') 172 | self.video_id = input('> TikTok Video Url: ') 173 | 174 | self.amount = int(self.amount) 175 | self.added = 0 176 | 177 | while self.added < self.amount: 178 | # Creates a new thread for each proxy. 179 | threading.Thread(target=self.status( 180 | 200, "Bot Running", ), daemon=True, args=(self.proxy,)).start() 181 | 182 | if self.added >= self.amount: 183 | self.status(200, "complete") 184 | 185 | def get_elite_proxies(use_http): 186 | ua = UserAgent() 187 | user_agent = ua.random 188 | url = 'https://free-proxy-list.net/' 189 | ua_header = {'User-Agent': user_agent} 190 | content = requests.get(url, headers=ua_header).text 191 | soup = BeautifulSoup(content, 'html.parser') 192 | rows = [] 193 | for row in soup.findAll("tr"): 194 | rows.append(row) 195 | elite_https_proxies = [] 196 | elite_proxies = [] 197 | for row in rows: 198 | i = row.findAll('td') 199 | try: 200 | if use_http == True: 201 | if (i[4].text == 'elite proxy') and i[6].text == 'yes': 202 | with open('elite_proxies.txt', 'r+') as f: 203 | last_line = f.readlines()[-1] 204 | f.write(i[0].text + ':' + i[1].text) 205 | f.write('\n') 206 | elite_https_proxies.append(i[0].text + ':' + i[1].text) 207 | else: 208 | if (i[4].text == 'elite proxy') and i[6].text == 'no': 209 | with open('elite_proxies.txt', 'r+') as f: 210 | last_line = f.readlines()[-1] 211 | f.write(i[0].text + ':' + i[1].text) 212 | f.write('\n') 213 | elite_proxies.append(i[0].text + ':' + i[1].text) 214 | except: 215 | continue 216 | return "\n".join([str(i) for i in elite_https_proxies]) if use_http == True else "\n".join([str(i) for i in elite_proxies]) 217 | 218 | 219 | def get_normal_proxies(): 220 | res = requests.get('https://free-proxy-list.net/', 221 | headers={'User-Agent': 'Mozilla/5.0'}) 222 | soup = BeautifulSoup(res.text, "lxml") 223 | proxies = soup.find('textarea').text 224 | 225 | regex = re.compile(r'\d+\.\d+\.\d+\.\d+\:\d+') 226 | proxies = regex.findall(proxies) 227 | 228 | proxies = "\n".join([str(i) for i in proxies]) 229 | return proxies 230 | 231 | 232 | # Entry point 233 | if __name__ == '__main__': 234 | # os.system('title' + '[The TikTok Bot -V2- Nyumat]') 235 | sys.stdout.write("\x1b]2;[The TikTok Bot -V2- Nyumat]\x07") 236 | logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO) 237 | proxies = get_normal_proxies() 238 | sleep(10) 239 | print("Loading Proxies...") 240 | print(proxies + '\n') 241 | os.system("clear") 242 | print("Proxies Loaded!") 243 | main = TikTokBot() 244 | main.start() 245 | 246 | 247 | -------------------------------------------------------------------------------- /bot/selenium-V2/autoViews.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.support.ui import Select 3 | import time 4 | 5 | # Currently, The Selenium Version that exploited FireLiker.com is patched. 6 | # A fix will be in production within the next week or so. 7 | 8 | # Links that through getURL will be referenced 9 | mainURL = "https://fireliker.com/" 10 | panelURL = "https://fireliker.com/welcome.php" 11 | autoviewURL = "https://fireliker.com/autoviews.php" 12 | loop = False 13 | 14 | # Prompt the user for their information and desired views. 15 | print("What is your TikTok user name?") 16 | user = input("-->> ") 17 | 18 | print("How many views would you like?") 19 | print("Options are : [1000] [800] [600] [400] [200] ") 20 | views = input("") 21 | 22 | chrome_options = webdriver.ChromeOptions() 23 | chrome_options.add_argument("--log-level=3") 24 | chrome_options.add_argument("--headless") 25 | driver = webdriver.Chrome() 26 | driver.set_window_size(500, 540) 27 | driver.get(mainURL) 28 | time.sleep(2) 29 | loginInput = driver.find_element_by_name("username") 30 | loginInput.send_keys(user) 31 | 32 | submit_xpath = "#alternative > form > fieldset > div:nth-child(2) > button" 33 | submit = driver.find_element_by_xpath("/html/body/div[2]/div[2]/div/form/fieldset/div[2]/button").click() 34 | 35 | driver.get(panelURL) 36 | time.sleep(2) 37 | auto = driver.find_element_by_xpath("/html/body/div[2]/div[2]/div[1]/fieldset/div/div/a[2]").click() 38 | 39 | driver.get(autoviewURL) 40 | select = Select(driver.find_element_by_id('select')) 41 | # Select Specified Views logic 42 | if views == "1000": 43 | select.select_by_value('5') 44 | elif views == "800": 45 | select.select_by_value('4') 46 | elif views == "600": 47 | select.select_by_value('3') 48 | elif views == "400": 49 | select.select_by_value('2') 50 | elif views == "200": 51 | select.select_by_value('1') 52 | else: 53 | # User didn't enter one of the dropdown values 54 | print("You did not specify a number of views within range, please re-run the program.") 55 | breakpoint() 56 | select_button = driver.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/div/div/div[2]/div/form/button").click() 57 | 58 | # Code below isn't needed unless you're in a headless browser. 59 | 60 | #select = driver.find_element_by_id("select").click() 61 | #select_views = driver.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/div/div/div[2]/div/form/div/select/option[5]").click() 62 | #time.sleep(3) 63 | #send_views = driver.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/div/div/div[2]/div/form/button") 64 | #time.sleep(2) 65 | 66 | # Wait 5 mins to run again. 67 | time.sleep(315) 68 | loop = True 69 | 70 | while loop == True: 71 | driver.get(autoviewURL) 72 | auto = driver.find_element_by_id("select") 73 | driver.get(autoviewURL) 74 | select = driver.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/div/div/div[2]/div/form/button").click() 75 | select.select_by_visible_text("1000 VIEWS") 76 | time.sleep(315) 77 | view = driver.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/div/div/div[2]/div/form/button") 78 | time.sleep(5) 79 | -------------------------------------------------------------------------------- /img/tiktok_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nyumat/The-TikTok-Bot/8746b27da4c91ce31d7c06ebba3df98c91b9190f/img/tiktok_logo.png -------------------------------------------------------------------------------- /setup/setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | Name = {Nyumat} 3 | version = file: V2 4 | author = Thomas 5 | author-email = nyumat18@gmail.com 6 | home-page = https://github.com/Nyumat 7 | description = {A TikTok Bot to automate the share and view process.} 8 | long-description = file: README.md 9 | long_description_content_type = text/markdown 10 | license = MIT 11 | license-file = LICENSE.txt 12 | platform = OS X,Windows,Linux 13 | keywords = {tiktok,bot,automation,views,shares,tools,python} 14 | classifiers = 15 | Development Status :: Work in Progress 16 | Intended Audience :: Developers 17 | License :: OSI Approved :: MIT License 18 | Operating System :: Any 19 | Programming Language :: Python :: 3.6 20 | Programming Language :: Python :: 3.7 21 | Programming Language :: Python :: 3.8 22 | Topic :: Software Development :: Libraries :: requests,selenium,os,time,threading 23 | 24 | [main] 25 | file-pattern = main.py 26 | verbose = 2 27 | no-skip-report = true 28 | quiet-stdout = true 29 | run-coverage = true 30 | 31 | [main.py] 32 | disallow_any_decorated = true 33 | disallow_any_generics = true 34 | disallow_any_unimported = false 35 | disallow_subclassing_any = false 36 | disallow_untyped_calls = true 37 | disallow_untyped_defs = true 38 | ignore_missing_imports = true 39 | warn_unused_ignores = true 40 | warn_return_any = true 41 | 42 | [__init.py__] 43 | disallow_any_decorated = true 44 | disallow_any_generics = true 45 | disallow_any_unimported = false 46 | disallow_subclassing_any = false 47 | disallow_untyped_calls = true 48 | disallow_untyped_defs = true 49 | ignore_missing_imports = true 50 | warn_unused_ignores = true 51 | warn_return_any = true 52 | -------------------------------------------------------------------------------- /setup/setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | def installLibraries(): 4 | 5 | print(f'Installing Libraries....') 6 | 7 | os.system('pip install requests') 8 | os.system('pip install threading') 9 | os.system('pip install bs4') 10 | os.system('pip install time') 11 | os.system('pip install math') 12 | os.system('pip install selenium') 13 | os.system('pip install Keys') 14 | os.system('pip install ActionsChains') 15 | os.system('pip install sys') 16 | os.system('pip install multiprocessing') 17 | os.system('pip install logging') 18 | os.system('pip install glob') 19 | 20 | if __name__ == "__main__": 21 | installLibraries() 22 | print(f'\n'+'All Required Libraries are now installed.') 23 | --------------------------------------------------------------------------------