图1
接下来,我将详细解释每个过程。
第一步:预登录。
现在微博、空等大型网站基本都是输入用户名后再做编码或者加密。这里在用户名输入框输入我的账号,可以看到服务器会通过抓包工具返回一个字符串:
图2
这一步是预登录过程。学生可以自己尝试。我们需要在登录时使用servertime、nonce、pubkey等字段。当然这不是我自己的猜测,接下来的步骤会说明。
还有一点是预登录的网址:
http://login.sina.com.cn/sso/prelogin.php?词条=微博& ampcallback = Sinasocontroller . PreLoginCallback & amp;su = & amprsakt = mod & ampcheckpin = 1 & ampclient = SSO log in . js(v 1 . 4 . 18)amp;_=1461819359582
这里su的值是你自己用户名的编码值。但也许你会问我怎么知道的。我以后再说。实际测量后,如果不在这里给su传递参数,其实是可以的。为了最逼真地模拟用户登录,我们最好带上它的价值。
请看图1中http://i.sso.sina.com.cn/js/ssologin.js的第一个js请求。学生可以点进去看看。这是一系列的加密文件,比如上面提到的加密用户名和密码。如果有同学非要问我怎么找到这个加密文件,我只能说:反复抢包。在浏览器中输入weibo.com之后,找到请求路径的js文件,然后用代码格式化工具打开它,一个一个地查找,并在代码中搜索关键字。例如,我们可以在这里搜索“现时”、“服务器时间”等。,我们就能找到加密文件。
打开加密文件,我们可以看到加密用户名的代码。在加密的js文件中搜索“username”,我们可以看到有一行代码:
_ username = sinaSSOEncoder..encode(URL encode(username));_现在可以直接找到编码方法(代码太多就不贴了),然后就可以找到对应的方法了。为了验证我们的猜测,我们可以复制webstorm中的encode函数,用自己的用户名运行,返回的结果就是su的值,这个值也将在后面的帖子提交中用到。如果你有一定的加密经验,可能一眼就看出这是代码。python中有一个模块可以做到这一点。让我们回到图1,http://login.sina.com.cn/sso/login.php?客户端=ssologin.js(v1.4.18)这个地址是数据后提交的地址,下面是我自己提交的数据:
图三
这里我们需要自己构造su(加密用户名)、sp(加密密码)、servertime、nonce、rsakv等数据,其他数据不需要改动。有同学问我为什么其他数据不用改。可以多次登录查看更改的值,那么那些值就是需要构造的值,其他的值可以直接使用。这里的su,su,servertime,nonce,rsakv rsakv都已经得到,所以现在需要的只是sp值。我们还是按照原来的方法在js文件中寻找“sp”,可以找到代码requests.sp=password,所以只需要看看密码是如何构造的。通过搜索,您可以看到密钥加密代码:
password = RSa key . encrypt([me . server time,me.nonce]。加入(" t") "n "密码)
这段代码就是加密密码的代码。有经验的同学会知道用的是rsa加密,python中有相应的RSA加密库。但是我们假设没有人能够看到或者知道python中有第三方库rsa。这时,我想向你介绍一下我的一些经历。我已经知道有三种模拟登录方案:a)最简单高效的,直接将js源代码转换成相应的python代码,模拟加密过程进行加密;b)使用selenium phantomjs/firefox的方案直接模拟人工操作,填写表单,提交数据进行模拟登录,最简单,效率稍低。如果学生对这种简单暴力的方式感兴趣,可以在我的github上查看源代码c),通过pyv 8/pyxecjs渲染js代码,这是本文的主要方式。第一种方式,微博如果调整登录加密算法,加密码一定要改。第二种方式和第三种方式没有这个问题。
因为使用Python3,不支持PyV8,所以选择了Pyexecjs,和Python 3类似,也可以直接执行js代码。我对Java代码也不是很熟悉,所以直接定义了一个函数来处理加密密码,并没有过多修改其加密源代码:
函数get_pass(mypass,nonce,servertime,rsakey){
varRSAKey = newsinaSSOEncoder。RSakey();
RSAKey.setPublic(rsakey," 10001 ");
password = RSa KeY . encrypt([server time,nonce]。join("t") "n" alt="登陆新浪微博 超详细的Python实现新浪微博模拟登陆">