模拟登录新浪微博(python)

reference:

http://www.jb51.net/article/46053.htm
http://blog.csdn.net/u010487568/article/details/46932839
新浪微博的登录流程不是简单的post用户名密码,经过查询资料与抓包分析,它首先会用ssologin.js文件对用户名、密码以及服务器、客户端的信息先进行处理,再发送给服务器进行身份认证。目前,新浪的客户端版本已升级到1.4.18,经过测试,可以完成登录微博,并获取用户主页。本文主要对整个流程进行分析,并给予主要代码。

1.抓包分析登录流程

首先关注到登录的时候有两个包


第一个是prelogin.php,第二个login.php。
可以知道login.php中应该是发往服务器的身份认证信息,先看一下它的post数据,

这里可以看到有一些固定的数据,但是也有一些我们不知道的数据,重点关注servertime,nonce,rsakv,sp 只从现有信息无法获得这几个数据,现在看一下prelogin.php的返回数据

这里看到了我们关注的数据,所以我们只要先请求一下prelogin就可以了。现在看一下怎样请求

prelogin


用get的方式,这里后面跟的参数中有一个su,还有_后面那个是客户端的时间(毫秒形式),这些是我们不知道的,在找资料中可以在 (http://login.sina.com.cn/)中查看源码,这里面有一个js文件,如图

进入后可以看到http://login.sina.com.cn/js/sso/ssologin.js 的代码内容,下载下来后,搜索关键代码
——–su———-

可以看到是用base64处理过的,这里是我的python实现

su = base64.b64encode(urllib.quote(self.username))

——–sp———-

python实现

    def get_pwd(self,pwd, servertime, nonce, pubkey):rsaPublickey = int(pubkey, 16)key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥message = str(servertime) + '\t' + str(nonce) + '\n' +str(pwd)#拼接明文js加密文件中得到passwd = rsa.encrypt(message, key) #加密passwd = binascii.b2a_hex(passwd)  #将加密信息转换为16进制return passwd

——–plt———-
客户端计时,python实现

    def __mtime(self):'''Return the current time by milli-second'''return long('%.0f' % (time.time() * 1000))

之后我们就可以开始请求prelogin了

login

在login流程中,最重要的是构造post数据,完全按照抓包数据来处理。
这里有一个参数是prelt,在js文件中搜索,可以看到为现在时间减去了服务器返回的exectime这个时间值

python实现

    endPre = self.mtime()print 'endPre:%d' % endPreprelt = endPre - plt - long(data['exectime'])

对于包头,有的资料显示要构造得很详细,比如Content-Type、Cookies、Content-Length,但是我测试后发现只要用User-Agent就可以了。
有的资料到请求login后只要判断返回的js代码中是否有location.replace就可以了,但是为了之后要继续做爬虫等,还是需要获得uid的信息,所以继续抓包研究。

ajaxlogin


看到它的返回内容中有uid 以及 userdomain

homepage

请求homepage,它的url为’http://weibo.com/u/’ + uid +’/home’ + userdomain
得到返回的内容为用户的首页,可以通过状态码来判断是否获取成功

2.主要代码分析

(1)cookie设置

def set_cookie():'''设置cookies'''cookiejar = cookielib.LWPCookieJar()cookie_support = urllib2.HTTPCookieProcessor(cookiejar)opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)urllib2.install_opener(opener)

先使用cookielib与urllib2配合,处理cookie相关事宜,先配置好后,便于之后爬虫爬取网页
(2)预登录 prelogin

      def prelogin(self):'''预登录 获得变量字典:return: args_dict'''#获得用户名base63后的结果susu = base64.b64encode(urllib.quote(self.username))#获得客户端时间pltplt = self.__mtime()parameters = {'entry': 'weibo','callback': 'sinaSSOController.preloginCallBack','su': su,'rsakt': 'mod','checkpin': '1','client': 'ssologin.js(v1.4.5)','_': plt}url = 'http://login.sina.com.cn/sso/prelogin.php?' + urllib.urlencode(parameters)data = urllib2.urlopen(url).read()#获得返回内容中的变量字典p = re.compile('\((.*)\)')try:json_data = p.search(data).group(1)args_dict = json.loads(json_data)args_dict['su'] = sureturn args_dictexcept:print 'prelogin error!'return None

预登录前,先得到su和plt,然后发送get请求的,得到返回的变量字典
(3)login 登录
首先请求login.php

        postdata = {'entry': 'weibo','gateway': '1','from': '','savestate': '7','useticket': '1','pagerefer': '','vsnf': '1','su': args_dict['su'],'service': 'miniblog','servertime': args_dict['servertime'],'nonce': args_dict['nonce'],'pwencode': 'rsa2','rsakv': args_dict['rsakv'],'sp': sp,'encoding': 'UTF-8','prelt': '27','url': 'http://www.weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack','returntype': 'META'}postdata = urllib.urlencode(postdata)headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'}req = urllib2.Request(url=url,data=postdata,headers=headers)

这里有一个疑问,最开始,我总是请求失败,我的postdata 里的url是这样写的
‘url’ :
‘http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack’
按理说转义字符应该没有影响不知道为什么去掉这句就可以了。。。(可以再思考一下)

然后,我请求了ajaxlogin获得uid

    def get_uinfo(self):'''获得uid,userdomain:return: uid,userdomain'''ajaxlogin_url = 'http://weibo.com//ajaxlogin.php?framelogin=1&callback=' \'parent.sinaSSOController.feedBackUrlCallBack&sudaref=weibo.com'try:res = urllib2.urlopen(ajaxlogin_url).read()# print res.decode('gb2312').encode('utf-8')patt = re.compile('\((.*?)\)')user_info = patt.search(res).group(1)user_info = json.loads(user_info)uid = user_info['userinfo']['uniqueid']userdomain = user_info['userinfo']['userdomain']return uid, userdomainexcept:print 'get user info error'

最后,我请求homepage

homepage_url = 'http://weibo.com/u/' + uid +'/home' + userdomain
try:result = urllib2.urlopen(homepage_url)if result.code == 200:print 'login successful'
except:print 'login error'

然后就成功啦!

模拟登录新浪微博-python相关推荐

  1. pythonurllib新浪微博_python模拟登录新浪微博抓取数据(cookielib和urllib2).doc

    HYPERLINK "/article/python/22972.html" /article/python/22972.html python模拟登录新浪微博抓取数据(cooki ...

  2. scrapy模拟登录新浪微博

    hi: all, scrapy搞模拟登录真的很简单哦,以下均是在你安装scrapy成功的前提下哦. 首先,分析新浪微薄的登录流程,使用抓包工具得到下面的图片: 一般来说,登录主要就是对服务器进行pos ...

  3. java实现模拟登录新浪微博

    最近做新浪微博的数据挖掘,遇到不少的问题,搜索了不少的网上资源,现在我来总结一下,希望对大家有所帮助: 1.准备工作 只是登录无需申请新浪和腾迅的开发者账号,如果需要发送微博功能,需要申请一个新浪和腾 ...

  4. java 模拟登录新浪微博(通过cookie)

    java模拟登录新浪微博(通过cookie) 这几天一直在研究新浪微博的爬虫,发现爬取微博的数据首先要登录.本来打算是通过账号和密码模拟浏览器登录.但是现在微博的登录机制比较复杂.通过账号密码还没有登 ...

  5. curl模拟登录新浪微博

    curl模拟登录新浪微博 这几天要做个获取新浪微博@我的信息, 又不用第三方登录,所以只能通过模拟登录来获取信息,研究的一下发现直接模拟登录微博比较困难,验证的算法比较复杂,于是绕道通过登录新浪通行证 ...

  6. 模拟登录新浪微博(Python)

    PC 登录新浪微博时, 在客户端用js预先对用户名.密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分. 这样, 就不能用通常的那种简单方法来模拟POST ...

  7. python 登录新浪微博_模拟登录新浪微博(Python)

    PC 登录新浪微博时, 在客户端用js预先对用户名.密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分. 这样, 就不能用通常的那种简单方法来模拟POST ...

  8. 爬取新浪微博数据+新浪微博模拟登录+mysql+python

    小编的毕业设计是做一个关于网络社交平台的网络爬虫技术,所以需要爬取一些新浪微博数据. 不废话了,我先通过微博的高级搜索功能爬取数据,代码: #!usr/bin/env python #coding:u ...

  9. python 登录新浪微博_Python 模拟登录新浪微博

    在极客学院中看了一个关于爬虫的视频,然后自己实现一遍,并做此记录. 视频链接:http://www.jikexueyuan.com/course/995_4.html?ss=1 该文中的登录方式已经失 ...

最新文章

  1. MySQL 5.6通过MMM实现读写分离的高可用架构
  2. 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中...
  3. 架构风格:万金油CS与分层
  4. ubuntu系统静态路由
  5. android中layout、drawable及styles的xml文件加载探索
  6. mysql 查询 汇总_Mysql-Sql查询汇总
  7. 2019-02-23-算法-进化
  8. oracle last_day比较,Oracle的LAST_DAY函数
  9. 热门开源多媒体库 PJSIP 被爆5个内存损坏漏洞
  10. android for循环比大小,如何让for()循环花费更少的时间(android)?
  11. 操作系统 ucore lab1实验报告
  12. 十四、中国为什么没有自己的指令集
  13. 初中学历可以做原画师吗?原画师需要绘画基础吗
  14. 玩吧公司,入职后的真实感受
  15. java数字转罗马数字
  16. 应用程序无法启动,因为应用程序的并行配置不正确,有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具
  17. 桌面上程序可以用计算机打不开,我电脑桌面图标程序都打不开怎么办
  18. 数字油田中的虚拟光纤
  19. 「WAYZ维智」:全国最具价值的室内外混合定位感知网络 | 百万人学AI评选
  20. 无线通信基础——“单跳”与“多跳”

热门文章

  1. 小程序自己制作可以吗?要准备些什么?
  2. erwin教程 mysql_ERWin中生成Oracle数据库
  3. ENVI 5.3安装教程
  4. 【推荐】pairwise、pointwise 、 listwise算法是什么?怎么理解?主要区别是什么?
  5. FT+LT+ZT+DTFT+DFS+DFT(时域和频域之间的关系)
  6. linux中进入目录命令是什么,linux进入目录的命令是什么
  7. 飞机订票系统程序设计c语言,C语言课程设计——飞机订票系统源代码
  8. c语言字符常量的界限符,关于C语言的字符常量和符号常量
  9. P1169 [ZJOI2007]棋盘制作 DP悬线法
  10. ip被禁止后访问网页403 易语言