├── .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 |
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 | [](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 |
--------------------------------------------------------------------------------