Boss直聘使用ai自动化投递简历

2025-10-19更新于 2025-12-04849 字8 分钟python
目录

抓取网络数据包

首先分析职位列表的数据是怎么被得到的,打开f12刷新页面发现被一条list.json的链接里面含有全部的职位信息

逆向的方法以及衡量

实现根据实验发现cookies的**__zp_stoken_参数是必带参数,这个参数有时效性**,时间过了就不会有效了,通过全局搜索__zp_stoken_发现是下面的代码加密出来的

javascript
r = (new e).z(t, parseInt(n) + 60 * (480 + (new Date).getTimezoneOffset()) * 1e3)

通过断点进去发现在其他文件内,我们跳转过去

发现是很大一部分的控制流,这样逆向的难度就很大了,所有我们直接全部弄下来

javascript
j = function() {
  return P.apply(null, [6798].concat(Array.prototype.slice.call(arguments)));
}

把整个文件保存下来,补齐其环境,另外整个文件有很多检查的地方,并且整个文件每天还会变化,其加密的方法也会变化,所以逆向就太浪费时间了,不值得!!!(或者说我学艺不精,这个是动态的,我补完环境没有报错跑出来的密钥在url请求上无法正常运行,放弃了)

使用自动化快速获取cookies

所以我们所以第2种方法,浏览器自动化工具,这里我使用的是[DrissionPage](https://www.drissionpage.cn/)这个库,这个比较方便如果你有其他库也可以使用,思路是一样的

首先抓包确认具体的数据包的样式以及流程

  1. https://www.zhipin.com/wapi/zppassport/set/zpToken post方法,用于生成zp_token注意这个不是__zp_stoken_无法用于使用,目前未知用处
  2. https://www.zhipin.com/wapi/zpgeek/resume/restrict/list.json?_=1761125023477 _=后面为时间戳13位数的,用于返回列表信息这个就需要cookies携带__zp_stoken_,另外还有变种https://www.zhipin.com/wapi/zpgeek/pc/recommend/job/list.json?page=1&pageSize=15&city=&encryptExpectId={boss手机端设置的分岗位}&mixExpectType=&expectInfo=&jobType={}&salary=&experience=&degree=&industry=&scale=&_=1761125171984 其他参数就不一一列举的,自行抓包就能找出来
  3. https://www.zhipin.com/wapi/zpgeek/job/detail.json?securityId=&lid= 岗位详情接口,返回选择的岗位的详情数据,以及bossid等等,后续跳转chat可用bossid以及岗位id等等定向跳转到对应的聊天页面
  4. https://www.zhipin.com/wapi/zpgeek/pc/recommend/expect/list.json?\_={time} 手机设置的意向岗位列表,需要携带cookie返回的encryptExpectId数据可用于2的api使用直接查找具体岗位数据
  5. https://www.zhipin.com/web/geek/chat?id={encryptBossId}&jobId={encryptJobId}&securityId={securityId}&lid={lid} 聊天跳转页面,直接跳转到对应的页面,可用使用自动化直接点击输入框和发送按钮直接发送数据

大概的数据包就如上所示

怎么自动化获取__zp_stoken_

DrissionPage自动打开网页登录后,只要监听list.json,然后捕获发出数据包获取其中的cookies即可,cookies过期时间大概2分钟左右,当过期重新发出list.json请求重新捕获即可,生成的cookie可以重复使用

python
from DrissionPage import Chromium
from DrissionPage._units.listener import DataPacket

from BossJob.config.Config import  config

Boss_Url = 'https://www.zhipin.com/web/geek/jobs'

class BossTab:

    def __init__(self):
        self.tab = Chromium().new_tab()
        self.chat= Chromium().new_tab()
        self.tab.get(Boss_Url)
        self.tab.set.cookies(config['cookie'])
        self.tab.wait(5)
        self.wait_bypass()
        is_login, t2 = self.is_login()
        if not is_login:
            t2.click()
            self.tab.wait(5)
            self.wait_bypass()
            login_content =  self.tab.ele('@class=login-register-content',timeout=3)
            try:
                login_content.wait.deleted()
            except Exception:
                print('登录时间过长已经退出程序')
                self.tab.close()
                self.tab.browser.quit()
                exit(1)
        to_job = self.tab.ele('@ka=header-jobs',timeout=3)
        self.tab.listen.start("/resume/restrict/list.json")
        to_job.click()
        self.tab.listen.pause(True)
        self.tab.wait(5)
        self.chat.listen.start("https://www.zhipin.com/wapi/zpchat/geek/historyMsg")
        self.chat.listen.pause(True)

    def is_bypass(self):
        t = self.tab.ele('当前 IP 地址可能存在异常访问行为,完成验证后即可正常使用.')
        return t is None, t

    def wait_bypass(self):
        is_bypass, t = self.is_bypass()
        try:
            if not is_bypass:
                t.wait.deleted()
        except Exception:
            print('验证时间过长已经退出程序')
            self.tab.close()
            self.tab.browser.quit()
            exit(1)

    def is_login(self):
        t = self.tab.ele('@ka=header-login', timeout=3)
        return t is None, t

    def get_cookies_to_dict(self, refresh=False):
        self.tab.listen.resume()
        to_job = self.tab.ele('@ka=header-jobs', timeout=3)
        to_job.click()
        l = self.tab.listen.wait(timeout=5,count=1)
        if l is None:
            return None
        if isinstance(l, list):
            l1: DataPacket = l[-1]
            cookies_list = l1.request.cookies
            self.tab.listen.pause(True)
            return {item['name']: item['value'] for item in cookies_list}
        if isinstance(l, DataPacket):
            cookies_list = l.request.cookies
            self.tab.listen.pause(True)
            return {item['name']: item['value'] for item in cookies_list}
        cookies = self.tab.cookies()
        return {item['name']: item['value'] for item in cookies}

    def get_headers(self):
        pass

    def send_to_boss(self,msg,url):
        self.chat.listen.resume()
        self.chat.get(url)
        d = self.chat.listen.wait(timeout=5,count=1)
        if d is None:
            return
        if isinstance(d, list):
            d = d[-1]
        data = d.response.body
        if len(data['zpData']['messages'])>2:
            print('已经发送过消息了')
            return
        self.chat.listen.pause(True)
        self.chat.wait(5)
        input_k = self.chat.ele('@class=chat-input')
        input_k.click()
        input_k.input(msg)
        send_btn = self.chat.ele('@type=send')
        send_btn.click()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.tab.close()
        self.tab.browser.quit()

所以剩下的只需要使用ai对于获取的列表进行比对然后是否进行跳转来发出问询即可,如果不想自己实现那么可以到我的github项目使用我实现的版本

towenjian / AutoGetJob

加载中…

注意

该内容仅用作学习使用,禁止违法爬取对应网站

希望我的博客能够对你有帮助

hhhh6448

hhhh6448

转载请注明出处,欢迎留言交流~

评论

评论区还没开放,部署评论服务后就能留言啦~

主题色