This is an web scraping bot that automates the process of job applications on LinkedIn. It searches for jobs relevant to you, answers all questions in application form, customizes your resume based on the collected job information, such as skills required, description, about company, etc. and applies to the job. Can apply 100+ jobs in less than 1 hour.
Click on above image to watch the demo or use this link https://youtu.be/gMbB1fWZDHw
- Introduction
- Demo Video
- Index
- Install
- Configure
- Contributor Guidelines
- Updates
- Disclaimer
- Terms and Conditions
- License
- Socials
- Support and Discussions
Click on above image to watch the tutorial for installation and configuration or use this link https://youtu.be/f9rdz74e1lM (Recommended to watch it in 2x speed)
- Python 3.10 or above. Visit https://www.python.org/downloads/ to download and install Python, or for windows you could visit Microsoft Store and search for "Python". Please make sure Python is added to Path in System Environment Variables.
- Install necessary Undetected Chromedriver, PyAutoGUI and Setuptools packages. After Python is installed, OPEN a console/terminal or shell, Use below command that uses the pip command-line tool to install these 3 package.
pip install undetected-chromedriver pyautogui setuptools openai flask-cors flask
- Download and install latest version of Google Chrome in it's default location, visit https://www.google.com/chrome to download it's installer.
- Clone the current git repo or download it as a zip file, url to the latest update https://github.com/GodsScion/Auto_job_applier_linkedIn.
- (Not needed if you set
stealth_mode = Trueinconfig/settings.py) Download and install the appropriate Chrome Driver for Google Chrome and paste it in the location Chrome was installed, visit https://googlechromelabs.github.io/chrome-for-testing/ to download.
OR
If you are using Windows, click onwindows-setup.batavailable in the/setupfolder, this will install the latest chromedriver automatically. - If you have questions or need help setting it up or to talk in general, join the github server: https://discord.gg/fFp7uUzWCY
- Open
personals.pyfile in/configfolder and enter your details like name, phone number, address, etc. Whatever you want to fill in your applications. - Open
questions.pyfile in/configfolder and enter your answers for application questions, configure wether you want the bot to pause before submission or pause if it can't answer unknown questions. - Open
search.pyfile in/configfolder and enter your search preferences, job filters, configure the bot as per your needs (these settings decide which jobs to apply for or skip). - Open
secrets.pyfile in/configfolder and enter your LinkedIn username, password to login and OpenAI API Key for generation of job tailored resumes and cover letters (This entire step is optional). If you do not provide username or password or leave them as default, it will login with saved profile in browser, if failed will ask you to login manually. - Open
settings.pyfile in/configfolder to configure the bot settings like, keep screen awake, click intervals (click intervals are randomized to seem like human behavior), run in background, stealth mode (to avoid bot detection), etc. as per your needs. - (Optional) Don't forget to add you default resume in the location you mentioned in
default_resume_path = "all resumes/default/resume.pdf"given in/config/questions.py. If one is not provided, it will use your previous resume submitted in LinkedIn or (In Development) generate custom resume if OpenAI APT key is provided! - Run
runAiBot.pyand see the magic happen. - To run the Applied Jobs history UI, run
app.pyand open web browser onhttp://localhost:5000. - If you have questions or need help setting it up or to talk in general, join the github server: https://discord.gg/fFp7uUzWCY
Thank you for your efforts and being a part of the community. All contributions are appreciated no matter how small or big. Once you contribute to the code base, your work will be remembered forever.
NOTE: Only Pull request to community-version branch will be accepted. Any other requests will be declined by default, especially to main branch.
Once your code is tested, your changes will be merged to the main branch in next cycle.
- All functions or methods are named lower case and snake case
- Must have explanation of their purpose. Write explanation surrounded in
''' Explanation '''under the definitiondef function() -> None:. Example:def function() -> None: ''' This function does nothing, it's just an example for explanation placement! '''
- The Types
(str, list, int, list[str], int | float)for the parameters and returns must be given. Example:def function(param1: str, param2: list[str], param3: int) -> str:
- Putting all that together some valid examples for function or method declarations would be as follows.
def function_name_in_camel_case(parameter1: driver, parameter2: str) -> list[str] | ValueError: ''' This function is an example for code guidelines ''' return [parameter2, parameter2.lower()]
- The hashtag comments on top of functions are optional, which are intended for developers
# Comments for developers.# Enter input text function def text_input_by_ID(driver: WebDriver, id: str, value: str, time: float=5.0) -> None | Exception: ''' Enters `value` into the input field with the given `id` if found, else throws NotFoundException. - `time` is the max time to wait for the element to be found. ''' username_field = WebDriverWait(driver, time).until(EC.presence_of_element_located((By.ID, id))) username_field.send_keys(Keys.CONTROL + "a") username_field.send_keys(value)
- All variables must start with lower case, must be in explainable full words. If someone reads the variable name, it should be easy to understand what the variable stores.
- All local variables are camel case. Examples:
jobListingsElement = None
localBufferTime = 5.5
- All global variables are snake case. Example:
total_runs = 1 - Mentioning types are optional.
localBufferTime: float | int = 5.5
- All config variables are treated as global variables. They have some extra guidelines.
- Must have variable setting explanation, and examples of valid values. Examples:
# Explanation of what this setting will do, and instructions to enter it correctly config_variable = "value1" # <Valid values examples, and NOTES> "value1", "value2", etc. Don't forget quotes ("")
# Do you want to randomize the search order for search_terms? randomize_search_order = False # True of False, Note: True or False are case-sensitive
# Avoid applying to jobs if their required experience is above your current_experience. (Set value as -1 if you want to apply to all ignoring their required experience...) current_experience = 5 # Integers > -2 (Ex: -1, 0, 1, 2, 3, 4...)
# Search location, this will be filled in "City, state, or zip code" search box. If left empty as "", tool will not fill it. search_location = "United States" # Some valid examples: "", "United States", "India", "Chicago, Illinois, United States", "90001, Los Angeles, California, United States", "Bengaluru, Karnataka, India", etc.
- Add the config variable in appropriate
/config/file. - Every config variable must be validated. Go to
/modules/validator.pyand add it over there. Example: For config variablesearch_location = ""found in/config/search.py, string validation is added in file/modules/validator.pyunder the methoddef validate_search().def validate_search() -> None | ValueError | TypeError: ''' Validates all variables in the `/config/search.py` file. ''' check_string(search_location, "search_location")
- All contributions require proper attestion. Format for attestation:
##> ------ <Your full name> : <github id> OR <email> - <Type of change> ------
print("My contributions ๐") # Your code
##<- Examples for proper attestation: New feature example
##> ------ Sai Vignesh Golla : godsscion - Feature ------
def alert_box(title: str, message: str) -> None:
'''
Shows an alert box with the given `title` and `message`.
'''
from pyautogui import alert
return alert(title, message)
##<Bug fix example
def alert_box(title: str, message: str) -> None:
'''
Shows an alert box with the given `title` and `message`.
'''
from pyautogui import alert
##> ------ Sai Vignesh Golla : saivigneshgolla@outlook.com - Bug fix ------
return alert(message, title)
##<- Contributions from community have been added
- Better AI support, minor bug fixes
- Patched to work for latest changes in Linkedin.
- Users can now select to follow or not follow companies when submitting application.
- Frameworks for future AI Developments have been added.
- AI can now be used to extract skills from job description.
- Framework for OpenAI API and Local LLMs
- Framework for RAG
- Smarter Auto-fill for salaries and notice periods
- Robust Search location filter, will work in window mode (No need for full screen)
- Better logic for Select and Radio type questions
- Proper functioning of Decline to answer questions in Equal Employment opportunity questions
- Checkbox questions select fail bug fixed
- Annotations are clearer in instructions for setup
- Annotations for developers
- Robust input validations
- Restructured config file
- Fixed pagination bug
- Performance improvements (skip clicking on applied jobs and blacklisted companies)
- Stop when easy apply application limit is reached
- Added ability to discard from pause at submission dialogue box
- Added support for address input
- Bug fixed radio questions, added support for physical disability questions
- Added framework for future config file updates
- Major Bug fixes (Text Area type questions)
- Made uploading default resume as not required
- Added functionality for textarea type questions
summary,cover_letter(Summary, Cover letter); checkbox type questions (acknowledgements) - Added feature to skip irrelevant jobs based on
bad_words - Improved performance for answering questions
- Logic change for masters students skipping
- Change variable names
blacklist_exceptions->about_company_good_wordsandblacklist_words->about_company_bad_words - Added session summary for logs
- Added option to turn off "Pause before Submit" until next run
- For questions similar to "What is your current location?", City posted in Job description will be posted as the answer if
current_cityis left empty in the configuration - Added option to over write previously saved answers for a question
overwrite_previous_answers - Tool will now save previous answer of a question
- Tool will now collect all available options for a Radio type or Select type question
- Major update in answering logic for Easy Apply Application questions
- Added Safe mode option for quick stable launches
safe_mode
- Added option to fill in "City, state, or zip code" search box
search_location - Bug fixes in answering City or location question
This program is for educational purposes only. By downloading, using, copying, replicating, or interacting with this program or its code, you acknowledge and agree to abide by all the Terms, Conditions, Policies, and Licenses mentioned, which are subject to modification without prior notice. The responsibility of staying informed of any changes or updates bears upon yourself. For the latest Terms & Conditions, Licenses, or Policies, please refer to Auto Job Applier. Additionally, kindly adhere to and comply with LinkedIn's terms of service and policies pertaining to web scraping. Usage is at your own risk. The creators and contributors of this program emphasize that they bear no responsibility or liability for any misuse, damages, or legal consequences resulting from its usage.
Please consider the following:
-
LinkedIn Policies: LinkedIn has specific policies regarding web scraping and data collection. The responsibility to review and comply with these policies before engaging, interacting, or undertaking any actions with this program bears upon yourself. Be aware of the limitations and restrictions imposed by LinkedIn to avoid any potential violation(s).
-
No Warranties or Guarantees: This program is provided as-is, without any warranties or guarantees of any kind. The accuracy, reliability, and effectiveness of the program cannot be guaranteed. Use it at your own risk.
-
Disclaimer of Liability: The creators and contributors of this program shall not be held responsible or liable for any damages or consequences arising from the direct or indirect use, interaction, or actions performed with this program. This includes but is not limited to any legal issues, loss of data, or other damages incurred.
-
Use at Your Own Risk: It is important to exercise caution and ensure that your usage, interactions, and actions with this program comply with the applicable laws and regulations. Understand the potential risks and consequences associated with web scraping and data collection activities.
-
Chrome Driver: This program utilizes the Chrome Driver for web scraping. Please review and comply with the terms and conditions specified for Chrome Driver.
Copyright (C) 2024 Sai Vignesh Golla saivigneshgolla@outlook.com
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.
See AGPLv3 LICENSE for more info.
- LinkedIn : https://www.linkedin.com/in/saivigneshgolla/
- Email : saivigneshgolla@outlook.com
- X/Twitter: https://x.com/saivigneshgolla
- Discord : godsscion
- Discord Server : https://discord.gg/fFp7uUzWCY alternate link: https://discord.gg/ykfDjRFB
- GitHub