当前位置:首页 > 奇闻趣事

登陆新浪微博 超详细的Python实现新浪微博模拟登陆

本文是在原作者授权下发表的。

原文链接:http://www.jianshu.com/p/816594c83c74

文本|解决方法

最近由于需要一直研究微博上的爬虫,第一步就是模拟登陆。其实挺难的,需要一些经验。为了让朋友以后少走弯路,我在这里附上我的分析过程和代码。

首先,我们用正常账号登录,看看会有什么请求。这里我用Http Analyzer捕获包(Filders也是不错的选择)。以下是正常登录过程的截图:

图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" mypass)

返回密码

}

这个函数实际上是副本加密文件的加密过程代码。为了测试,我直接使用随机数、服务器时间、rsakey等数据。,这是我在之前的登录中捕捉到的,在webstorm中调用这个函数,但是我报告了一个错误,提示“navigator未定义”,这是webstorm使用的nodejs的运行时环境,navigator是浏览器的一个属性,所以操作上会有问题。所以我只是用phantomjs作为运行时环境。考虑到有些同学不知道如何使用phantomjs,我在这里简单说一下。使用windows的同学应该去phantomjs官网下载它的可执行文件,然后设置环境变量。在命令行输入“phantomjs some.js”来执行some.js的文件,其实和在命令行执行python或者java文件是一样的。不清楚可以用百度来执行命令行执行python的方法,复制一下就行了,不清楚就问我。使用ubuntu的同学可以直接使用sudo apt-get安装phantomjs,然后就可以安装使用了。我直接用phantomjs运行加密的js文件,真的很不错。原因是phantomjs其实是一个没有ui的浏览器,自然支持navigator、window等属性。Pyexecjs支持phantomjs作为运行时环境。pyexecjs git主页的具体用法如代码所示。

用open('G:/java/sinajs.js ',' r ')作为f:

source = f.read()

phantom = execjs.get('PhantomJS ')

getpass = phantom.compile(源代码)

mypass = getpass.call('getpass ',mypass,nonce,servertime,pubkey)

这个代码可以得到加密的密码。

之后可以进行帖子提交,提交地址可以从抓包工具上看到:http://login.sina.com.cn/sso/login.php? client = SSO log in . js(v 1 . 4 . 18)。

根据经验,这里的流程基本完成。不过微博有点坑。这里还有一个步骤,类似于图1所示的http://passport.weibo.com/wbsso/login?URL = http://Weibo . com/ajaxlogin . PHP?framelogin = 1 & amp回调;= parent . Sinasocontroller . FeedurlCallback & amp;ticket = ST-NTc3 ntg1 mjmwnw = =-1461911127-gz-1de 185 df 04280 D7 e 96 bdcd 14 d9 D8 e 235 & amp;Retcode=0,这一步会重定向请求,返回当前账户的登录信息,如下图所示:

图三

那么问题来了,如何得到上面要求的地址。分析以上地址,有一个票字段。这应该是您登录的凭据,因此该地址应该由服务器返回。如果没有,那么至少是服务器返回了票据,所以我们在请求这个url之前使用包抓取工具检查返回的信息,发现有与上面的url一致的信息:

图四

这段代码使用了帖子回复的内容,所以我们可以直接从中提取我们需要的网址。然后使用get方法请求上面的url,它将进行重定向并直接返回登录信息。这时候就意味着成功着陆。

PS:授人以鱼不如授人以渔,这是我的信念。有些老手可能觉得我写的很啰嗦,但其实很多新手可能不知道这些细节,所以我把新浪微博模拟登陆过程的分析都写了出来。另外,除了这种方法,本文提到的另外两种方法也实现了。最暴力的方式是使用第三方库rsa。我对代码有详细的评论,另外一个方法是使用selenium phantomjs。我对代码中的关键地方也有评论。

说话便宜,给我看代码!

最后,我呈现这篇文章的所有模拟登录代码(如果你喜欢或阅读它来帮助你,你可能希望在github和welcome fork上给出一个星号)

代码链接,欢迎叉和星星:https://github.com/w1796246076/smart_login/

标题:pexels,CC0授权。

1.《登陆新浪微博 超详细的Python实现新浪微博模拟登陆》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《登陆新浪微博 超详细的Python实现新浪微博模拟登陆》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guonei/1194291.html

上一篇

迪士尼回应翻包 上海迪士尼回应了什么仍坚持翻包

下一篇

安徽省教育招生考试院网站 安徽招生考试院官网被冒充?官方回复

马樱花 我的春天,就是与你有关的每一朵马樱花……

  • 马樱花 我的春天,就是与你有关的每一朵马樱花……
  • 马樱花 我的春天,就是与你有关的每一朵马樱花……
  • 马樱花 我的春天,就是与你有关的每一朵马樱花……
掰手腕致手臂粉碎性骨折 这是真的吗你还敢掰手腕吗

掰手腕致手臂粉碎性骨折 这是真的吗你还敢掰手腕吗

7,江苏常州。大学生小许和他的朋友摔跤,但是突然他听到“啪啪”的声音,小许的手不能动了。x光片显示他左手的肱骨断成两截,粉碎性骨折。目前已经手术出院。医生提醒,突然用力特别容易造成肱骨螺旋骨折。网友们纷纷表示:“隔着屏幕我都觉得疼”“自从我扭伤...

僵尸突围 《死亡突围:僵尸战争》:我的“尸妹”不可能那么可爱!她扑来时我是拒绝的……

  • 僵尸突围 《死亡突围:僵尸战争》:我的“尸妹”不可能那么可爱!她扑来时我是拒绝的……
  • 僵尸突围 《死亡突围:僵尸战争》:我的“尸妹”不可能那么可爱!她扑来时我是拒绝的……
  • 僵尸突围 《死亡突围:僵尸战争》:我的“尸妹”不可能那么可爱!她扑来时我是拒绝的……

尸妹 《死亡突围:僵尸战争》:我的“尸妹”不可能那么可爱!她扑来时我是拒绝的……

  • 尸妹 《死亡突围:僵尸战争》:我的“尸妹”不可能那么可爱!她扑来时我是拒绝的……
  • 尸妹 《死亡突围:僵尸战争》:我的“尸妹”不可能那么可爱!她扑来时我是拒绝的……
  • 尸妹 《死亡突围:僵尸战争》:我的“尸妹”不可能那么可爱!她扑来时我是拒绝的……
我的幻想 艾青:她在我幻想的窗里

我的幻想 艾青:她在我幻想的窗里

窗 在这样美好的一天 我悠闲地看着窗户 我也能看见她 她在我幻想的窗户里 我希望她在窗口。 用手支撑你丰满的下巴 还有她柔软的眼睛 我沉浸在自己的想法中 从她的想法来看 映出无边无际的天空 那天的颜色 它像梦一样绿 蓝天之上 白云飘 追踪云 她...

怎么看见我的仙家 道士见闻 | 如遇仙家问:「你看我像什么?」你将如何作答? 枢机阁

被偷走的五年 《被偷走的那五年》我不明白,为什么一觉醒来你就不是我的。

作品介绍 《被盗的五年》  内容摘要 何曼和谢玉在蜜月期间结婚了,这太甜蜜太幸福了。结果,他们撞上了一棵树,造成了车祸。车祸后,男人醒来,但没有看到她的丈夫谢玉。 车祸前,照片还停留在蜜月之夜,但姐姐告诉我,现在已经五年过去了,她和谢玉已经离婚...

别人的夏天和我的夏天 两者差别在哪呢看看网友的夏天

  • 别人的夏天和我的夏天  两者差别在哪呢看看网友的夏天
  • 别人的夏天和我的夏天  两者差别在哪呢看看网友的夏天
  • 别人的夏天和我的夏天  两者差别在哪呢看看网友的夏天