一、简介

主要实现人人网登录以及发布留言板信息

requests js逆向

二、实现过程

2.1 登录(案例使用账号为18888888888 密码123456 后面成功登录使用的是自己的账号)

登录链接 https://www.renren.com/login

先不说多,抓个包放松一下

post请求了 https://rrwapi.renren.com/account/v1/loginByPassword 这个url ,请求参数为 appKey、callId、password、sessionKey、sig和user。

一个一个分析:

appKey多次调试后发现是写死的,这就很好办,pass。

callId显然是一个时间戳,虽然不知道他有没有别的骚操作,但是在这里我们就暂且当作时间戳,后面分析JS代码的时候在看看。

password 显然是一个加密过的密码,它的长度是32位,有一定js逆向经验的就不难猜到可能是md5加密,因此我尝试了一下,果然就是密码123456的md5加密,ok pass

sessionkey是空的,不管,这个参数登录的时候置为空就好

sig 这是一个signature签名,这个才是最重要的一个参数,他也是32位,也可以试着猜测它是md5加密,至于本质是什么,分析JS代码后再下定论。

user 这个显然就是我们的账号了

2.2 追栈

在搜索sig关键字的时候结果太多,因为之前猜测sig是md5加密,因此我们尝试搜索md5,于是我们不难找到下面的一段代码:

很显然这个是拿到signature的方法,于是我们在这个里面打上断点,再次输入登录信息,果然是断在这个地方:

分析这个块代码,传进来的是一个对象外加一个字符串secret,这个secret其实也是写死的,在源  代码界面可以搜到这个字符串,传进来的参数经过一个getDate方法编程一个字符串s 然后拼接上secret,于是我们可以自己写代码,把这个字符串 s 造出来,s 的结构是

appKey=bcceb522717c2c49f895b561fa913d10callId=1628868432277password=e10adc3949ba59abbe56e057f20f883esessionKey=user=18888888888

其实很好切开(代码下面有),然后我们把这个newstr经过md5加密(这个md5不一定是简单的md5,也可能是自己实现一个类似于md5的方法,比如多次嵌套md5,返回也是md5(32)的形式,不过这个里面就是简单md5,),于是我们可以得到下面的js代码

var CryptoJS = require('xxxxxcrypto-js') //你的nodejs目录function getSig(username,password,t) {// 1628858250991newstr = "appKey=bcceb522717c2c49f895b561fa913d10callId=" +t + "password=" + CryptoJS.MD5(password) + "sessionKey=user="+ username + "bcceb522717c2c49f895b561fa913d10" console.log(newstr);sign = CryptoJS.MD5(newstr);return sign.toString();
}

传入参数是用户名和密码以及13位时间戳,返回得到sig值。

2.3 爬虫请求

爬虫请求就比较简单了,对上面的url发送post,然后将这个请求负载带上即可。

def login(info):username,passwd = infowith open(file = r"1.js",mode = "r",encoding="utf-8") as f:ctx = execjs.compile(f.read())t = str(int(time.time()*1000))sig = ctx.call("getSig",username,passwd,t)data = {"appKey":"bcceb522717c2c49f895b561fa913d10","callId": t,"password": ctx.call("getPasswdEn",passwd),"sessionKey":"","sig":sig,"user":username}print(data)headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67","Content-Type": "application/json;charset=UTF-8","Host": "rrwapi.renren.com","Referer": "https://renren.com/",}url = "https://rrwapi.renren.com/account/v1/loginByPassword"res = session.post(headers=headers,json=data,url=url)print(res.json())if res.json()['errorMsg'] == "成功":print("登录成功")uid = res.json()['data']['uid']sessionKey = res.json()['data']['sessionKey']secretKey = res.json()['data']['secretKey']return uid,sessionKey,secretKeydef userProfile():url = "https://renren.com/personal/973604572/details"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67" ,}session.get(url=url,headers=headers)# print(res.text)def pubMsg(uid, sessionKey, secretKey,body):"""appKey: "bcceb522717c2c49f895b561fa913d10"body: "456"callId: "1628860043478"ownerId: 973604572sessionKey: "B10Ar7j6O2twLZWh"sig: "28e889fcd9b2631e654dcebada05cff8"toId: ""toUserId: 973604572type: 0"""url = "http://rrwapi.renren.com/messageboard/v1/addMessage"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67" ,}with open(file = r"\2.js",mode = "r",encoding="utf-8") as f:ctx = execjs.compile(f.read())t = str(int(time.time()*1000))sig = ctx.call("getSig",uid,body,sessionKey,secretKey,t)data = {"appKey": "bcceb522717c2c49f895b561fa913d10" ,"callId": t ,"body": body,"sessionKey": sessionKey,"sig": sig ,"ownerId": uid,"toUserId":uid,"toId":"","type":"0",# 类型1 为悄悄话}print(data)res = session.post(url=url,headers=headers,json=data)print(res.text)if __name__ == '__main__':session = requests.session()os.environ['NODE_PATH'] = r"D:/nodejs/node_modules/npm/node_modules"uid,sessionKey,secretKey = login(("",""))userProfile()body = "Special01111"pubMsg(uid,sessionKey,secretKey,body)

第二个函数是发布留言板的,也很简单,只不过就是把上面的newstr改了下,然后传入了其他参数,newstr结构如下(传入参数前面三个都是登陆后返回给用户的,第四个也是时间戳):

    newstr=  "appKey=bcceb522717c2c49f895b561fa913d10body=" + body + "callId="+t+"ownerId=" + uid+"sessionKey="+sessionKey+"toId=toUserId="+uid+"type=0"+secretKey

三、总结

总的来说还是很简单的JS逆向问题,扣代码也很简单,经验比较重要,一般看到32位字符串就基本想到md5了,然后多尝试,可能你花几个小时扣下来一大堆代码,nodejs已经封装好了,效率第一,毕竟咱也不是搞前端的,js代码看的确实头疼。

人人网登录并写留言板(Requests,js逆向)相关推荐

  1. android中留言板功能,js 实现简易留言板功能

    无标题文档 li{list-style:none;} li{position:relative;width:500px;} a{position:absolute;right:10px;} var c ...

  2. mysql登录注册留言_能登录注册的留言板(1)——实现登录

    (一) 小白实现了登录操作,如图,代码在下面 一.登录界面 1.  布局: a)      定width , height , margin:20px auto , box-shadow , bord ...

  3. 【原创纯手打】如何用微信小程序写留言板(附代码)

    首先我们先创建三个输入框,分别绑定响应的触发条件,微信双向绑定和VUE不一样,需要setData 名字<input type="text" value="{{nam ...

  4. mysql登录注册留言_实现登录注册的留言板思路

    代码见 一.登录界面 1.  布局: a)      定width , height , margin:20px auto , box-shadow , border-radius b)      p ...

  5. html留言板原理,js实现留言板

    相信大家都知道QQ留言板吧,相信大家也给别人留过言,那你知道怎么用JS敲出留言板吗? 下面我给大家演示一下. html样式 Document 留言 scss样式 *{ padding: 0; marg ...

  6. html简单留言板教程,JS实现简易留言板(节点操作)

    本文实例为大家分享了JS实现简易留言板的具体代码,供大家参考,具体内容如下 今天的案例主要是对节点进行操作 创建节点.添加节点.删除节点以及为节点添加内容的操作. 就是一个简单的留言板功能,可以发布留 ...

  7. html如实现留言板功能,JS实现留言板功能

    每天一个JS 小demo之留言板.主要知识点:DOM方法的理解和运用 Document .wrap { width: 400px; margin: 30px auto; } textarea { di ...

  8. php 使用tp框架写留言板,基于thinkPHP框架实现留言板的方法

    这篇文章主要介绍了基于thinkPHP框架实现留言板的方法,简单分析了thinkPHP框架实现留言板的流程及控制器与模型的相关核心代码,需要的朋友可以参考下 本文实例讲述了基于thinkPHP框架实现 ...

  9. html如实现留言板功能,JS实现留言板功能[楼层效果展示]

    功能实现: 1.发布人和发布内容非空校验 2.编辑删除功能 3.楼层效果展示 4.发布时间展示 效果图 目录 tools.js 时间工具包 function getTime(){ var weeks ...

最新文章

  1. Python编程语言基础入门教程
  2. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
  3. 利用css3实现jQuery中的slideDown和slideUp效果
  4. linux /proc目录文件详解
  5. STL_set集合容器+map映照容器
  6. C语言删除单链列表中间的节点的算法(附完整源码)
  7. 一起 goroutine 泄漏问题的排查
  8. 【转】 ConstraintLayout 完全解析 快来优化你的布局吧
  9. 转:权限管理——用户认证和用户授权
  10. 计算机硬件操作系统应用软件之间的关系,操作系统是其他应用软件运行的基础,什么是操作系统...
  11. pytorch中tensor类型转换
  12. dart语言hello world
  13. 解决微擎框架出现Could not resolve: cloud.zhifun.cc (Domain name not found)问题
  14. html如何调用less,LESS
  15. 论文总结与展望怎么写?
  16. 游戏的现实规则和非现实规则
  17. VK1628 LED数显芯片,LED驱动显示液晶驱动兼用TM1628
  18. 一些dalao的模板
  19. BT06串口蓝牙模块的配置以及与电脑的配对
  20. 简单证明圆锥体积为三分之一圆柱

热门文章

  1. 高可用的接口安全规范
  2. 如何快速成为谷歌web Store开发者(不用办visa/信用卡)
  3. 2018, 数据分析师的就业前景如何?
  4. 腾讯云服务器备案完整流程 40天备案的血与泪
  5. 根据一个下拉框改变另外一个下拉框内容
  6. 2018年回顾和收获
  7. mysql数据库哪些情况不适合使用索引
  8. java 分析内存_Java 内存查看与分析
  9. p元素包含div元素的问题
  10. LTE学习笔记-3 OFDM