XXXX直聘聊天机器人

XXXX直聘聊天机器人

想转岗到爬虫工程师,由于面试机会太少,而boss直聘又无法海投,决定做一个boss直聘机器人来帮我找工作。

一、基本需求

一个爬虫程序爬取需要的工作信息,存入数据库。
聊天机器人每天上午10点向未聊天的boss打招呼。
如果有boss回复了,聊天机器人向boss发送简历(因为boss直聘设定必须双方说话过后才能发简历)。

二、涉及知识点

  • protobuf
  • MQTT
  • websocket

三、聊天机器人实现过程

1. 查看boss直聘网页版即时通讯实现方式。

查看聊天界面ws下有无建立websocket。
在这里插入图片描述
发现无websocket建立,考虑难道是ajax轮训不会这么low吧?
但是在与别人聊天时候,下面并无新增ajax请求。
打开抓包工具charles进行抓包查看。

在这里插入图片描述
发现是有ws建立的。改用chrome浏览器,
在这里插入图片描述
可以看到是有ws建立。(第一个坑,以后默认使用chrome浏览器)。

2.websocket连接建立方式及参数

查看连接建立的调用栈
在这里插入图片描述
将关联的js都下载到本地,使用webstorm格式化代码。再使用charles的map local功能将这三个文件代理。这样boss直聘使用的js就是本地格式化后的代码了(否则在使用查看调用时,所有代码都堆在2行,不可读)。
仔细查看调用堆栈确认是app.js的connection处传入的连接参数。
在这里插入图片描述
搜索关键词paho-mqtt了解mqtt的功能。所以boss直聘是使用的paho.mqtt这个第三方库。
在本地使用paho.mqtt第三方库做个连接的demo。参数通过修改app.js,在建立连接前打印所有的参数获得。
代码:

var hostname = 'ws.zhipin.com', //'192.168.1.2',port = 443,ssl = true,topic = '/chatws';client = new Paho.MQTT.Client(hostname, port, topic, "ws-CD090DC8307DE0AC");//建立客户端实例var options = {password: "Xxxxxx",userName: "Xxxxxxxx",useSSL: ssl,onSuccess: onConnect,onFailure: function (e) {console.log(e);}};client.connect(options);//发送消息  message = new Paho.MQTT.Message("hello");  message.destinationName = topic;  client.send(message);

运行后:
在这里插入图片描述
连接已经可以建立。但是在发送信息后,会报错并断开连接。因为数据格式有误。

3、通信数据格式

websocket连接已经可以建立,接下来就是查看boss直聘的通信数据格式了。
通过charles抓包,取到当我对一个boss发送“你好”时的数据:

3357 0004 6368 6174 0001 0801 1A4B 0A02 0800 1220 0800 121C 3531 6465 3762 6632 6234 3732 6139 3566 3148 525F 3039 5739 4556 6F7E 1801 20EE FBC8 FB92 2D28 B8B7 8EF2 922D 320C 0801 1001 1A06 E4BD A0E5 A5BD 58EE FBC8 FB92 2D

简单的16进制转字符串后获得:

3W�chat���K
�� ��51de7bf2b472a95f1HR_09W9EVo~�� �����-(����-2�����你好X�����-

这不是一个简单的json数据,查看数据发送时的调用堆栈
在这里插入图片描述
发现protobuf.js关键字,搜索并学习了protobuf。通过打印发送的数据。
在这里插入图片描述
获得数据:

 [8, 1, 26, 75, 10, 2, 8, 0, 18, 32, 8, 0, 18, 28, 53, 49, 100, 101, 55, 98, 102, 50, 98, 52, 55, 50, 97, 57, 53, 102, 49, 72, 82, 95, 48, 57, 87, 57, 69, 86, 111, 126, 24, 1, 32, 233, 193, 149, 232, 145, 45, 40, 179, 253, 218, 222, 145, 45, 50, 12, 8, 1, 16, 1, 26, 6, 228, 189, 160, 229, 165, 189, 88, 233, 193, 149, 232, 145, 45]

写一个使用protobuf转化的demo。

var protobuf = require("protobufjs");protobuf.load("proto.proto").then(function (root) {var Protocol = root.lookupType("TechwolfChatProtocol");// var data = Buffer.from([8,2,34,87,8,1,16,182,196,186,9,26,76,10,0,18,0,26,0,34,0,42,18,49,53,53,48,56,49,55,53,57,51,55,49,49,49,52,53,50,53,50,12,53,57,46,49,48,57,46,55,55,46,57,52,56,187,70,66,3,119,101,98,74,2,45,49,82,0,90,0,97,0,0,0,0,0,0,0,0,105,0,0,0,0,0,0,0,0,40,0]);var data = Buffer.from([8, 1, 26, 75, 10, 2, 8, 0, 18, 32, 8, 0, 18, 28, 53, 49, 100, 101, 55, 98, 102, 50, 98, 52, 55, 50, 97, 57, 53, 102, 49, 72, 82, 95, 48, 57, 87, 57, 69, 86, 111, 126, 24, 1, 32, 233, 193, 149, 232, 145, 45, 40, 179, 253, 218, 222, 145, 45, 50, 12, 8, 1, 16, 1, 26, 6, 228, 189, 160, 229, 165, 189, 88, 233, 193, 149, 232, 145, 45]);// Decode an Uint8Array (browser) or Buffer (node) to a messagevar message = Protocol.decode(data);console.log(message);});

打印数据为:

TechwolfChatProtocol {messages:[ TechwolfMessage {from: [TechwolfUser],to: [TechwolfUser],type: 1,mid: [Long],time: [Long],body: [TechwolfMessageBody],cmid: [Long] } ],messageSync: [],messageRead: [],type: 1 }

可以解析数据。这样数据格式就找到了。

4、发送一条消息。

考虑node运行聊天机器人,但是 paho-mqtt.js不支持node方式,仅支持浏览器。而python同时支持paho-mqtt和protobuf。
所以使用python来结合完成。
但是在python中建立socket连接时总会报错:
在这里插入图片描述
给出了报错,但是没有具体信息。以为是tls版本太低,最后在mqtt源码报错处添加打印,获得信息

b"bytearray(b'http/1.1 403 forbidden\\r\\n')"
b"bytearray(b'date: wed, 27 feb 2019 10:03:06 gmt\\r\\n')"
b"bytearray(b'transfer-encoding: chunked\\r\\n')"
b"bytearray(b'connection: keep-alive\\r\\n')"

发现是在websocket握手时,http请求直接403了,考虑是否与cookies有关,在源码找到header设置的地方,添加cookies参数。
运行后可以正常连接。
结合protobuf后,最终代码:

chat = {'type': 1,'messages': [{'from': {'uid': 0},'to': {'uid': 0, 'name': 'xxxxxxxxx~'},#name为boss的id'type': 1,'mid': 1550970085609,'time': 1550950252211,'body': {'type': 1, 'templateId': 1, 'text': '你好'},'cmid': 1550970085609}]
}
chat_protocol = protobuf_json.json2pb(TechwolfChatProtocol(), chat)hostname = 'ws.zhipin.com'
port = 443
clientId = '19833398'
timeout = 60
keepAlive = 100
topic = '/chatws'# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):print("Connected with result code " + str(rc))# Subscribing in on_connect() means that if we lose the connection and# reconnect then subscriptions will be renewed.client.subscribe(topic)client.publish(topic,payload=chat_protocol.SerializeToString(),qos=0)def on_disconnect(client, userdata, rc):if rc != 0:print("Unexpected disconnection.")# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):print('received message -----'+client)protocol = TechwolfChatProtocol()protocol.ParseFromString(msg.payload)print(protocol)client = mqtt.Client(client_id="ws-CD090DC8307DE0AC", clean_session=True,transport="websockets")
client.username_pw_set("xxxxxxx", "xxxxx")  # 参数分别boss为用户生的mqtt账号密码。
client.ws_set_options(path=topic)
client.tls_set()
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnectclient.connect(hostname, port, 60)
client.loop_forever()

运行后,手机端以及可以看到给boss发送了“你好”。

5.总结

接下来只需要结合爬虫,就可以完成最初的设想啦。
完成这个聊天机器学到了protobuf、mqtt、websocket相关的知识。
中间有卡壳的地方也很多。
但是一定要坚信,web端所有的内容,都是可爬的。完成的所有功能,都是可以模拟的。
ps:
原文链接:XXXX直聘聊天机器人

前言

时隔小一年,之前为了找工作做了部分boss直聘web端的逆向工作,没有进行下去,期间挺多小伙伴邮箱联系我,有这方面的需求。所以对之前的工作做了完善及封装。
详情见github项目:bossbot,可以几行代码实现自己的boss机器人。
这里记录下逆向过程,补充上篇。

逆向过程:

上篇抓包工具替换app.js,在需要的地方增加打印及调试。但是现在因为app.js资源是跨域的,替换后会有跨域问题。我这里用的charles,所以需要使用rewrite添加允许跨域请求头

上篇提到python代码中,websocket建立,在mqtt源码中修改了headers。因为当时看的急,mqtt是可以设置headers的。例如:

self.client = mqtt.Client(client_id="ws-CD090DC8307DE0AC", clean_session=True,transport="websockets")headers = {"Cookie": "t=%s; wt=%s;" % (self.user_id, self.user_id)}self.client.ws_set_options(path=self.topic, headers=headers)

心跳时间需要设置小于60s。

client.connect(hostname, port, 30)

过无限debugger
替换代码中的debugger
替换后还是有很多debugger,因为有debugger是通过混淆及eval方法
生成并定时调用的。可以重写eval函数或者给将生成的debugger代码,传入eval执行时,替换传入的代码。

后记:

这里是当时逆向过程中的一些细节,但是并不关键,关键的在上一篇。
上面给的github项目,在我想结合爬虫,试能否自动每天定时搜索职位并沟通、发简历时发现,boss搜索有加密字段zp_token。并且加密也挺复杂的,所以之后会把这个算法也添加进项目支持里。就可以无痛搜索加沟通啦~~
原文链接:XXXX直聘聊天机器人(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53920.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天加班的HR,时间都浪费在了这些琐事上?

编者按:随着无纸化办公的引入,为企业办公免去了非常多的成本浪费,那么OA系统是如何为无纸化办公助力的呢?让我们一起往下看。 HR每天的工作离不开招聘、员工入转调离信息、出勤排班、薪酬和工资单、绩效福利、培训、休假管理等等。…

一位程序员的一天工作清单:5:30下班,5:30起床

分享职场程序员生活、职场攻略、领导同事相处技巧和创业资源 文|洪生鹏 曾发布了一篇《一位程序员的一天清单》文章,简单描述了一位程序员了的一天日程安排。 文章发布后,得到了广大读者的欢迎,其中读者们的留言最为精彩了,比文章…

工作日志day01

1.No matching distribution found for virtualenv 查询了好多资料,最终找到问题所在: 2.根据上述果然报错ping: www.baidu.com: Temporary failure in name resolution 解决: 最终成功下载虚拟环境 3.cuda编程问题:根据代码运行环…

【第188期】游戏文案策划:薪水低、压力大,升职无望,怎么办?

我是酱油,这是第188期文章 收到一位想匿名的同学留言: 酱油哥,我已经入行两年,在一个平平无奇的小游戏公司打转。因为职场的高度,也完全限制了我的职场眼界,所以想向你请教一下,游戏文案的职场…

你10点钟还在做报表?套用模板,让你提前下班3小时

最近听到一个朋友向我抱怨,他们是一家主营餐饮的传统公司,已经线下开了好几家门店了,今年还打算再开六家。但是发现随着门店数量的增长,加上现在外卖业务的集中发力,线上线下业务数据无法打通,其传统的运营…

天选打工人春节兼职记

一、python爬虫是可以做副业的,主要是爬取网站、小程序或者APP的数据,对数据进行分析与处理,或者直接向客户提供爬虫程序与技术支持。 当初学会Python那会儿,有朋友来介绍我去接私活,是为一家公司做网站,那…

程序员10个月接了30个私活单子,晒出收入,让大家意想不到

现如今,相信很多职场朋友都非常羡慕程序员的高薪工作吧,很多学习计算机专业的大学生,他们在毕业以后,往往通过自己的专业就能找到互联网公司的高薪工作,而作为一名程序员,他们的工作压力还是非常大的&#…

“摸鱼”的打工人,“累死”了同事

文/韩滢 来源/连线Insight 一纸处罚,打破了打工人手中“金鱼缸”的平静。 近期,一份国美集团《关于违反员工行为规范的处罚通报》在职场人的圈子里流传开来,国美处罚员工摸鱼事件也引起了众多讨论。在国美的这张处罚表里,详细…

IT = 加班多?外国小哥打破“魔咒”:“每天工作 10 分钟,工资近 9 万美元”

相信在许多人印象中,凡是与 IT 沾边的工作似乎都逃不开“加班”二字:“加班狂”、“过度劳累”等标签令许多站在 IT 行业门口的人望而却步。 但上周,国外社交网站 Reddit 上有一则帖子突然爆火:“一年多前,我把我的工…

某百度程序员:每天十点上班,午休两小时,每天闲逛,晚上八点就下班!

请点击上面  一键关注! 互联网公司一向以加班和996著称,大家说起来都是一把辛酸泪。如果有人说他所在的公司可以养老,你信不信? 一个百度员工发帖爆料自己的职场生活:10点上班,中午休息两个小时&#xff…

ESP32接入米家-小爱同学-IDF环境-巴法平台

0 引言 冬天床边没有开关,睡觉懒得关灯,想通过小爱同学控制灯的开关,但是不想换开关。 所以 想用ESP32接入米家,控制一个舵机实现开关控制。 文章目录 0 引言1 MQTT协议2 ESP32 MQTT例程2.1 ESP-MQTT 库2.2.1 配置结构体 esp_mq…

AI新势力 claude,国内支持访问,跟我一起用起来吧

ChatGPT已经火的没边了,但是最近出来了一个claude也不容小觑,而且只要注册过谷歌账户,就可以不用挂梯子,直接可以访问,是不是很好? 那我们来看一下效果吧 真是非常的给力,据说可以媲美chatGPT3…

OpenAI推出新业务模式:售卖Model instance

文|张向前源|分布式实验室 OpenAI的新业务模式,卖Model instance,起价26万4千美元一年。 这个Model instance的好处是它完全归属于你,你可以按照自己的要求,对它进行有针对的微调,使它具备你需要…

「Bug」解决办法:Could not switchto this profil,无法使用节点的解决方法,彻底解决

♥️作者:白日参商 🤵‍♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油&#xff01…

同花顺_代码解析_技术指标_L

本文通过对同花顺中现成代码进行解析,用以了解同花顺相关策略设计的思想 目录 LH_LYDG LH_猎鹰歼狐 LHBLX LHSJ LHTZ LHXJ LH猎狐雷达 LOF净值 LWR LH_LYDG 猎鹰渡关(检测大盘顶部) 指标用法: (1&#xff…

chatgpt赋能python:Python自动发送信息:提高效率,解放双手

Python自动发送信息:提高效率,解放双手 作为一位有10年python编程经验的工程师,我深深体会到了Python带来的效率提升和工作上的便捷。Python的应用场景广泛,其中自动发送信息也是其优秀的应用之一。本文将介绍Python自动发送信息…

AD中画圆弧形板框的方法

在实际的板框设计中,有时为了生产需要,不得不需要将PCB板设计成四角需要倒角的形式,经过实际的摸索,现在得出一种画圆形板框的小技巧。 现在需要将板框设计成3.5mm半径样式。 (1)将板子原点定位至左下角。 …

Boxplot箱线图

方法1 http://www.ehbio.com/Cloud_Platform/front/#/ 网站直接做 方法2 Excel如何绘制箱线图 画箱线图首先需要计算5个数据:最小值(min),第一四分位数(Q1)、中位数(median)、第三四…

什么是 Wireframe线框图

http://www.mobileui.cn/what-is-wireframe-wireframes.html 什么是 Wireframe线框图 ? 老实说我受够某客户和某设计公司老是把 Wireframe 喊做 Storyboard 了!每次听到都要克制翻白眼的欲望。拜托不要开口闭口说“我们很重视 UI、我们很有经验”,却连…

给TableLayou绘制边框

效果如下&#xff1a; 思路&#xff1a;使用share作为背景显示边框 步骤&#xff1a; 1.在res/drawable文件夹下建立table_frame_gray.xml文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.a…