boss_batch_push: a userscript that batch applies to jobs, and why it stopped working
Boss直聘批量投简历,批量发送自定义招呼语,油猴脚本自动投递|升级版 AI 工作猎手 → ai-job
At a glance
- What is it?
- boss_batch_push is a Tampermonkey userscript that fills in Boss Zhipin job applications for you, filters the listing by company, salary and company size, and sends a custom greeting after each application. The README opens with a warning that the platform changed its job pages and the script no longer supports them, and the changelog is a record of every time the upstream API moved.
- Who is it for?
- Adopt boss_batch_push only if you still need the older behaviour and are comfortable maintaining the script against a moving web app, because the project states plainly that it has not been adapted to the new job pages and points users to a successor project. Do not adopt it as a finished tool, since the last release of the upstream interface it depends on is unmaintained, and treat the filters rather than the automation as the part worth reading.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 60 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 25, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The first paragraph says the project no longer supports the site
The README opens with a caution block, and it is the most important content in the repository.
Boss Zhipin, the Chinese recruitment platform, launched a new job page. This project was not adapted to those new pages, and the README says so in plain terms, pointing users to a newer project that was adapted and asking them to migrate. The successor is called AI Job Hunter, and it is linked from both GitHub and Gitee.
So the status of this repository is that of a retired tool with a maintained successor. The last push was on 2026-08-27, the licence is Apache-2.0, the default branch is master, and the repository has no GitHub releases. The topics are automation, job hunting, recruitment, resume, tampermonkey and userscript, and the whole project is a single userscript with an image directory and a source directory at the root.
The successor adds a layer of automation on top of the same idea. The README describes an AI agent that acts as a job seeker on your behalf, replies to recruiters' messages using your resume as context, sends a resume and exchanges contact details on request, and can send a retention message when a recruiter rejects you. There is a work notification feature that emails you about conversations with recruiters, and an option to be notified about high-intent postings based on keywords you set or on the number of conversation turns. The author also points at a separate project, an AI interview assistant, for the other half of the process.
The application tool itself is the part that survives into the successor: batch submitting resumes, a customisable number of applications per run, a custom greeting message, and filtering by company, position and salary.
That framing matters for what follows, because the interesting engineering in this repository is not the feature list but the years of breakage and repair behind it.
Applying invisibly means simulating a click and fixing a websocket
The author's long note at the end of the README is the best account of how the script actually submits an application, and it reads like a debugging diary.
The original idea was to call the platform's API directly and send the websocket message from the script. The author abandoned that because if the platform encrypted or intercepted the request it would be troublesome.
The fallback was to open an iframe and simulate the user clicking the apply button. That had its own problem: a simulated click was blocked, and the author's diagnosis was that the click did not trigger the focus event on the input box. The fix was unconventional, binding to the page's Vue component and changing the value of the submit-enable flag directly.
Then the messages did not arrive in the message list. Comparing the scripted path with a real click showed that the websocket send was missing the recipient identifier, so the send failed; the fix was to copy the value from the platform's own friend identifier field into the recipient field. The relevant code is in the main script file, in the send function, and the author notes that later the simulated click will probably be replaced by sending the websocket directly.
The identifiers the script depends on are the moving parts of any page-automation script, and they are named in the changelog:
window._PAGE.token
enableSubmit
friendStatus
haveContactedThe platform's status field for a contacted recruiter was renamed from one of these to the other, and the token lookup moved. Those four names are effectively the interface between the script and the site, and each one has broken the script at least once.
The filters are where most of the work is
Given that the page interactions are fragile, the filters are the durable part of the tool, and the README documents them in detail.
There is a company name inclusion filter, a fuzzy match, with several names separated by commas, and the README notes you rarely need it and that using it means you only apply to those companies. There is the matching exclusion filter, again fuzzy, which is the one you use to keep outsourcing agencies out of your results, and the example given is an exclusion of outsourcing contractors.
The job content exclusion is the most thoughtful of them. It detects context words above and below the term, such as negation words above and tool or system words below, so a posting that says it is not outsourcing is not excluded, and one that says a role is not a sales system is not excluded either. The examples given are outsourcing, on-site work, sales and driving licence requirements.
Then there is a job name inclusion filter, the salary range, which is written as a range with a hyphen, and the company size range, also a range, which is how you exclude a company that is hiring one hundred thousand people when you want a small team.
The custom greeting message is edited in the script's own panel and can use line breaks, and the README explains the semantics precisely: with the option enabled, the platform's default greeting is sent first and then your custom one follows.
There is also a filter for inactive recruiters, enabled by default, which automatically drops postings from bosses who have not been active recently, with the stated reason of not wasting the daily allowance of one hundred applications on them. That number is the clearest statement of the platform's own limit, and it is the constraint every user of this kind of tool is actually living inside.
The changelog is a record of the upstream moving three times
The update history in the README is the best available evidence of how this kind of tool ages, and it is a useful case study for anyone who maintains browser automation.
In July 2024 a contributor found that the token field had changed, which was breaking the submission with a request-not-legal error, and the fix was in the same month. In August 2024 the author reported that the greeting recognition was broken because the page token lookup used a different path, and the note is honest that the approach worked in a July commit and stopped working afterwards.
By December 2024 the platform had changed the field for a contacted recruiter, from a name to a different one, and the author had to update the script accordingly. The same entry mentions a platform bug where clicking apply in the list view still shows the apply button instead of switching to a continue-conversation state, and the author says it is unclear whether it is a bug on the platform side.
Earlier entries show the shape of the tool evolving. In September 2023 the custom greeting feature arrived, and the author notes in the closing remarks that it took a great deal of time to develop and debug, and that a first attempt at sending the websocket message directly was abandoned in favour of the iframe trick. A delay was introduced to avoid being rate limited, moving from 500 milliseconds to 800, and other entries add a retry mechanism, a submission lock to prevent duplicate applications, a fix for a deadlock in the waiting logic, and a refactor into an object-oriented style for readability.
The pattern is the same in every entry. The tool is not broken because the author stopped caring, it is broken because the platform moved, and the repairs are small patches to names and shapes. A contributor, RickieWen, is credited with debugging help, and the 2024-07-21 entry is credited to a different contributor, chenli1107, which is a sign the project did pick up outside help.
Running it is a paste into Tampermonkey, and the successor is a different project
The install path is short, and it is worth describing because it shows how little of a project has to exist for the idea to work.
You install Tampermonkey in the browser, add a new script, copy the code from the main script file, paste it into the Tampermonkey editor and save. The README also links a Greasy Fork listing, which is the same userscript served from a directory that keeps an index of them, and there is a Gitee mirror of the repository for the same reason the successor project has one, since the author clearly expects the GitHub link to be unreachable for some users.
The script's own panel holds the filters, a start button for batch submission, the configuration saving so the current filter set can be reused, a word cloud generator that takes all the job descriptions on the current page, segments the text and weights it to show the hot terms, and desktop notifications that fire when the run stops.
The successor project, AI Job Hunter, is a different thing rather than a rewrite. It keeps the batch submission and the filters and adds the AI agent, the scripted replies, the resume sending and the contact exchange, and it is linked on both GitHub and Gitee. The author's own framing of the two halves is worth repeating, because it is honest: getting the application sent is the first half, and the interview is the second half that actually decides the offer.
The repository itself is small, with a source directory, an image directory with the demonstration screenshots, and a README that is mostly documentation. The last push on 2026-08-27 came after the caution block was added, so the maintenance activity is now on the successor rather than here.
Editorial conclusion
Adopt boss_batch_push only if you still need the older behaviour and are comfortable maintaining the script against a moving web app, because the project states plainly that it has not been adapted to the new job pages and points users to a successor project. Do not adopt it as a finished tool, since the last release of the upstream interface it depends on is unmaintained, and treat the filters rather than the automation as the part worth reading. Before you run it, check the platform's own limit on daily applications, which the README mentions as one hundred chances, and read the changelog entries about the token and status field changes, because they show exactly which parts of the site the script depends on.
Frequently asked questions
What does boss_batch_push do?
It is a Tampermonkey userscript that batch submits job applications on Boss Zhipin, sends a custom greeting message after each application, and filters the listing by company name, company size, salary range, job name and job content, with an option to skip recruiters who have not been active recently.
Does boss_batch_push still work on the current Boss Zhipin site?
Not with the new job pages. The README opens with a caution that Boss Zhipin launched a new job page, that this project was not adapted to it, and that users should migrate to the newer project, which links to both GitHub and Gitee.
How does the script submit an application without being detected?
It opens an iframe and simulates the user clicking the apply button, and the author's notes explain that a directly simulated click was blocked until the script bound to the page's Vue component and changed the submit enable flag. The websocket send then failed until the recipient identifier was copied from the platform's friend identifier field, as described in the script's send function.
What filters does the script provide?
Company name inclusion and exclusion, both fuzzy matched with comma separated lists, exclusion of job content that mentions outsourcing or similar terms with context awareness so that a negated mention is not excluded, job name inclusion, salary range, company size range, and a custom greeting message edited in the script panel. There is also a default option that skips postings from recently inactive recruiters.
What is the newer project the README points to?
It is called AI Job Hunter and is linked on GitHub and Gitee. The README describes it as adding an AI agent that acts as your job seeker, replies to recruiters using your resume, sends resumes and exchanges contact details, notifies you about high-intent postings, and keeps the batch submission and filtering tools.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/yangfeng20-boss-batch-push)Was this useful?