温馨提示
本文最后更新于 天前,其中的信息可能已经有所发展或是发生改变。
目录
抓取网络数据包
首先分析职位列表的数据是怎么被得到的,打开f12刷新页面发现被一条list.json的链接里面含有全部的职位信息
逆向的方法以及衡量
实现根据实验发现cookies的**__zp_stoken_参数是必带参数,这个参数有时效性**,时间过了就不会有效了,通过全局搜索__zp_stoken_发现是下面的代码加密出来的
r = (new e).z(t, parseInt(n) + 60 * (480 + (new Date).getTimezoneOffset()) * 1e3)
通过断点进去发现在其他文件内,我们跳转过去

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

j = function() {
return P.apply(null, [6798].concat(Array.prototype.slice.call(arguments)));
}把整个文件保存下来,补齐其环境,另外整个文件有很多检查的地方,并且整个文件每天还会变化,其加密的方法也会变化,所以逆向就太浪费时间了,不值得!!!(或者说我学艺不精,这个是动态的,我补完环境没有报错跑出来的密钥在url请求上无法正常运行,放弃了)
使用自动化快速获取cookies
所以我们所以第2种方法,浏览器自动化工具,这里我使用的是[DrissionPage](https://www.drissionpage.cn/)这个库,这个比较方便如果你有其他库也可以使用,思路是一样的
首先抓包确认具体的数据包的样式以及流程
- https://www.zhipin.com/wapi/zppassport/set/zpToken post方法,用于生成zp_token注意这个不是__zp_stoken_无法用于使用,目前未知用处
- 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=°ree=&industry=&scale=&_=1761125171984 其他参数就不一一列举的,自行抓包就能找出来
- https://www.zhipin.com/wapi/zpgeek/job/detail.json?securityId=&lid= 岗位详情接口,返回选择的岗位的详情数据,以及bossid等等,后续跳转chat可用bossid以及岗位id等等定向跳转到对应的聊天页面
- https://www.zhipin.com/wapi/zpgeek/pc/recommend/expect/list.json?\_={time} 手机设置的意向岗位列表,需要携带cookie返回的encryptExpectId数据可用于2的api使用直接查找具体岗位数据
- 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可以重复使用
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
加载中…
注意
该内容仅用作学习使用,禁止违法爬取对应网站
希望我的博客能够对你有帮助

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