标签(空格分隔): Java
实习期间需要做一个模拟58登录然后爬取简历,第一次做项目遇到很多坑
同时网上关于58登录的又没有很多资料,遇到了很多坑,这里记录一下,方便自己以及他人学习
源代码放在Github
有关实现的分析,可以参考我的另一篇博客 Java 模拟58登录(二) 实现
这里是通过手机动态码的方式来登录58, 而非帐号密码, 适用于第三方网站登录使用
原因是模拟密码登录的时候, 当我用其他人账号在我这里登录58的时候就会出现账号登录限制
需要手机动态码验证之后才可以登录,所以决定直接手机动态码的登录。
如果你知道这里的机制或者知道如何避免,请告知我[email protected]
首先是登录58, 查看登录期间的Http Request请求
其中,connect和clientid对我们模拟登录没有影响
可以发现大致的流程如下
- 发送Get请求(data?), 获取 token
我们先看下登录的关键js代码,看都需要哪些参数
function codeCommitLogin() {
loginClickLog("from=PC_login_sj_dlqq");
$("#loginMobileButton").attr("disabled", "disabled");
var source = $("#source").val();
var mobile = $("#loginMobile").val();
var mobilecode = $("#loginMobilecode").val();
var validatecode = $("#validatecodeMobile").val();
var token = $("#tokenMobile").val();
var tokencode = $("#tokencodeMobile").val();
var path = $("#path").val();
var rsaModulus = $("#rsaModulusMobile").val();
var rsaExponent = $("#rsaExponentMobile").val();
var timesign = (new Date).getTime() + timespan;
var isremember = $("#isremember_id_new_mobile").prop("checked");
var fingerprint = "";
if (typeof fingerPrint != "undefined") {
fingerprint = fingerPrint.get()
}
if (typeof Fingerprint2 != "undefined") {
var fp = new Fingerprint2;
var finger2 = fp.get()
} else {
var finger2 = ""
}
var p = encryptString(timesign + encodeURIComponent(mobile), rsaExponent, rsaModulus);
var url = "//passport.58.com/mobile/pc/login?callback=?&mobile=" + p + "&mobilecode=" + mobilecode + "&source=" + source + "&token=" + token + "&tokencode=" + tokencode + "&fingerprint=" + fingerprint + "&isremember=" + isremember + "&finger2=" + finger2 + "&path=" + path;
$.getJSON(url, function(result) {
codeSuccessCommitLoginFunction(result)
})
}
- 这里的话,finger2和fingerprint是唯一确定浏览器的参数,每个浏览器都有不同的值
这里直接从浏览器拷贝,没有影响
请求的URL
Request URL:https://passport.58.com/frontend/data?callback=jQuery18308426383909637498_1515994624659&_=1515994624692
Response
jQuery18305434571389149673_1515995590691({“code”:0,“data”:{“remainTime”:0,“token”:“7pjUnv6fhBONHh7A_4HrN_2rH4is-gC8”,“rsaModulus”:“xxx固定值xxx”,
“rsaExponent”:“010001”,“totalTime”:60,“mobile”:“手机号”},“msg”:""})
如上,其中callback参数中jQuery18308426383909637498_1515994624659和_=1515994624692,一个表示回调的函数+时间戳,一个应该是发送请求时候的时间戳,这里可以参考jquery资料
那么这个请求是页面刚加载就发送的请求,从response可以看出主要是获取token参数
Request URL
https://passport.58.com/mobile/getcode?
jQuery18305434571389149673_1515995590693({“code”:0,“data”:{“exist”:0,“tokencode”:“GhxN2kozUcU8wsbkzGXbMmst8G4_0sSg”},“msg”:“动态码已发送”})
Request URL
https://passport.58.com/mobile/pc/login?
Response
jQuery18305434571389149673_1515995590693({“code”:0,“data”:{“fingerprint”:“84E63543A0E4DF048727E0037314879E66AE767A7311EA8C”},“msg”:“成功”})
以上便是整个登录的流程
由于是第一次做Java项目,很多都不懂而且前期公司网不好半天才能刷出个界面,然后导致这个功能做了很久.
最初我试着用selenium框架去模拟登录,但是!!!公司网络不行并且我觉得这样效率太慢了就没有进行下去,后面转入Java模拟登录
前期很多时间都放在了去读Js代码,手动模拟添加部分cookie,以及模拟java加密过程,其实这三个后面发现都是在做无用功
然后自己登录成功后发现其他人账号不能登录,又转到手机动态码登录。。。
做这个功能最大的体会就是,做项目先不要深入的去了解某一个环节(这里我花了几天都在读js代码,Java模拟js加密),应该显示着做出一个最简单的demo,遇到问题再去学习解决
最后这个模拟登录还是很在很多问题,希望有了解的人可以告诉应该怎么做才最好