本文转自:http://blog.csdn.net/andrewseu/article/details/48730735
前几天想在学校论坛上淘一个二手蓝牙鼠标,没有时间盯着论坛就写了Python程序模拟登陆,每隔一段时间检测,一旦有目标物品出现,发短信通知(重要的通知还是用短信哈)
学校论坛模拟登陆很简单,用fiddler分析一cookies即可。今天在首页看到这篇博文,感觉挺有意思,转一个。

1.前言

从模拟登录这件事上,可以看出公司之间的技术水平,对安全的重视程度。之前做过豆瓣的模拟登录(链接),直接做一个post请求就OK,简直easy. 但是到新浪微博上,这个方法完全行不通,新浪微博简直了!!!各种加密,各种跳转,登录过程神烦!!!在参考了很多的博文,历经无数次失败之后,终于,我也成功登录上了!(●'◡'●)

2.登录过程分析

我一直用的是chrome浏览器,所以在开始做模拟登录的时候也是用chrome看登录过程,但是!并没有获得很多有用的信息,之后看网上很多推荐fiddler抓包,但是看着太乱了,也并没有真正去分析这个软件. 之后我转向了火狐,奇迹发现了,我看到了登录的全过程,网页的响应也很容易查看(chrome响应看不到的情况下也可以).因此,复杂的登录分析还是用火狐吧!

好,接下来就是见证奇迹的时刻,来看看登录到底经历了哪些过程:

首先,在输入用户名后,会进行预登录,网址为:http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=ZW5nbGFuZHNldSU0MDE2My5jb20%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1443156845536,通过响应(sinaSSOController.preloginCallBack({"retcode":0,"servertime":1443156842,"pcid":"gz-e88b75a929252baec7c12c741985eaa45627","nonce":"2L4IZ3","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","showpin":0,"exectime":16})),我们可以获得四个有用的变量,servertime、nonce、pubkey和rsakv.

新浪微博的用户名加密目前采用Base64加密算法,而新浪微博登录密码的加密算法使用RSA2,这是模拟登陆的重点,需要先创建一个rsa公钥,公钥的两个参数新浪微博都给了固定值,第一个参数是登录第一步中的pubkey,第二个参数是js加密文件中的‘10001’. 这两个值需要先从16进制转换成10进制,把10001转成十进制为65537,随后加入servertime和nonce再次加密.

在做完准备工作之后,可以看看登录需要什么数据,切换到post请求,网址为:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18),查看提交的表单数据,如下图:

主要的需要提交数据:

su:base64加密过后的用户名

servertime/nonce/rsakv之前预登陆获取到了

sp是加密过户的密码

表单数据获取到了之后自然就是提交表单数据,你以为这样就好了吗?太naive了!

提交之后返回的并不是微博个人主页,而是一段重定向的代码,大概是这样:

注意红线部分,如果是retcode=0则表示成功,否则前面的过程就有问题哦==

通过正则表达式获取到重定向的网址,提交请求之后就大功告成啦!

3.技术要点

3.1 几个库

cookielib:The cookie module defines classes for abstracting the concept ofcookies, an HTTP state management mechanism. It supports both simple string-onlycookies, and provides an abstraction for having any serializable data-type ascookie value. 用来保存cookies.

urllib2:The urllib2 module defines functions and classes which help in openingURLs (mostly HTTP) in a complex world — basic and digest authentication,redirections, cookies and more. 用来发送请求获取网页数据,与cookielib配合可以利用cookie访问.

json:Json is a lightweight data interchange format inspired by javascript object literal syntax(although it is not a strict subset of JavaScript ).

3.2 正则表达式

正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.

具体可以参考:Python正则表达式指南

4.源代码

[python] view plaincopy
  1. # -*- coding: utf-8 -*-
  2. ########################
  3. #author:Andrewseu
  4. #date:2015/9/23
  5. #login weibo
  6. ########################
  7. import sys
  8. import urllib
  9. import urllib2
  10. import cookielib
  11. import base64
  12. import re
  13. import json
  14. import rsa
  15. import binascii
  16. #import requests
  17. #from bs4 import BeautifulSoup
  18. #新浪微博的模拟登陆
  19. class weiboLogin:
  20. def enableCookies(self):
  21. #获取一个保存cookies的对象
  22. cj = cookielib.CookieJar()
  23. #将一个保存cookies对象和一个HTTP的cookie的处理器绑定
  24. cookie_support = urllib2.HTTPCookieProcessor(cj)
  25. #创建一个opener,设置一个handler用于处理http的url打开
  26. opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
  27. #安装opener,此后调用urlopen()时会使用安装过的opener对象
  28. urllib2.install_opener(opener)
  29. #预登陆获得 servertime, nonce, pubkey, rsakv
  30. def getServerData(self):
  31. url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=ZW5nbGFuZHNldSU0MDE2My5jb20%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1442991685270'
  32. data = urllib2.urlopen(url).read()
  33. p = re.compile('(.∗)')
  34. try:
  35. json_data = p.search(data).group(1)
  36. data = json.loads(json_data)
  37. servertime = str(data['servertime'])
  38. nonce = data['nonce']
  39. pubkey = data['pubkey']
  40. rsakv = data['rsakv']
  41. return servertime, nonce, pubkey, rsakv
  42. except:
  43. print 'Get severtime error!'
  44. return None
  45. #获取加密的密码
  46. def getPassword(self, password, servertime, nonce, pubkey):
  47. rsaPublickey = int(pubkey, 16)
  48. key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
  49. message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
  50. passwd = rsa.encrypt(message, key) #加密
  51. passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
  52. return passwd
  53. #获取加密的用户名
  54. def getUsername(self, username):
  55. username_ = urllib.quote(username)
  56. username = base64.encodestring(username_)[:-1]
  57. return username
  58. #获取需要提交的表单数据
  59. def getFormData(self,userName,password,servertime,nonce,pubkey,rsakv):
  60. userName = self.getUsername(userName)
  61. psw = self.getPassword(password,servertime,nonce,pubkey)
  62. form_data = {
  63. 'entry':'weibo',
  64. 'gateway':'1',
  65. 'from':'',
  66. 'savestate':'7',
  67. 'useticket':'1',
  68. 'pagerefer':'http://weibo.com/p/1005052679342531/home?from=page_100505&mod=TAB&pids=plc_main',
  69. 'vsnf':'1',
  70. 'su':userName,
  71. 'service':'miniblog',
  72. 'servertime':servertime,
  73. 'nonce':nonce,
  74. 'pwencode':'rsa2',
  75. 'rsakv':rsakv,
  76. 'sp':psw,
  77. 'sr':'1366*768',
  78. 'encoding':'UTF-8',
  79. 'prelt':'115',
  80. 'url':'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
  81. 'returntype':'META'
  82. }
  83. formData = urllib.urlencode(form_data)
  84. return formData
  85. #登陆函数
  86. def login(self,username,psw):
  87. self.enableCookies()
  88. url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'
  89. servertime,nonce,pubkey,rsakv = self.getServerData()
  90. formData = self.getFormData(username,psw,servertime,nonce,pubkey,rsakv)
  91. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'}
  92. req  = urllib2.Request(
  93. url = url,
  94. data = formData,
  95. headers = headers
  96. )
  97. result = urllib2.urlopen(req)
  98. text = result.read()
  99. print text
  100. #还没完!!!这边有一个重定位网址,包含在脚本中,获取到之后才能真正地登陆
  101. p = re.compile('location\.replace[\'"](.∗?)[\'"]')
  102. try:
  103. login_url = p.search(text).group(1)
  104. print login_url
  105. #由于之前的绑定,cookies信息会直接写入
  106. urllib2.urlopen(login_url)
  107. print "Login success!"
  108. except:
  109. print 'Login error!'
  110. return 0
  111. #访问主页,把主页写入到文件中
  112. url = 'http://weibo.com/u/2679342531/home?topnav=1&wvr=6'
  113. request = urllib2.Request(url)
  114. response = urllib2.urlopen(request)
  115. text = response.read()
  116. fp_raw = open("e://weibo.html","w+")
  117. fp_raw.write(text)
  118. fp_raw.close()
  119. #print text
  120. wblogin = weiboLogin()
  121. print '新浪微博模拟登陆:'
  122. username = raw_input(u'用户名:')
  123. password = raw_input(u'密码:')
  124. wblogin.login(username,password)

5.结果截图

根据提示输入用户名和密码:

主页文件:

and then? 随心所欲的做自己喜欢的事~~

Python模拟登陆新浪微博相关推荐

  1. Python模拟登陆新浪微博,爬取用户数据

    目标 爬取新浪微博用户数据,包括以下字段:id,昵称,粉丝数,关注数,微博数,每一篇微博的内容,转发数,评论数,点赞数,发布时间,来源,以及是原创还是转发.(本文以GUCCI(古驰)为例) 方法 + ...

  2. 分享:Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据

    Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据 http://my.oschina.net/leopardsaga/blog/94774

  3. python模拟登陆 验证码el_python 模拟登陆github的示例

    # -*- coding: utf-8 -*- # @Author: CriseLYJ # @Date: 2020-08-14 12:13:11 import re import requests c ...

  4. python模拟登陆163邮箱并获取通讯录

    From: http://hi.baidu.com/fc_lamp/blog/item/2466d1096fcc532de8248839.html python模拟登陆163邮箱并获取通讯录 #-*- ...

  5. 潜心专研Python模拟登陆专题,实现网易云音乐自动签到!这项目居然只值三百?

    前言: 时隔三周没有和大家见过面了,最近在研究python模拟登陆专题,话不多说,让我们愉快地开始实现模拟登陆实现网易云自动签到 开发工具 **Python****版本:**3.6.4 相关模块: D ...

  6. python模拟登陆 验证码el_python 模拟登陆163邮箱

    import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium ...

  7. Python模拟登陆大连交通大学教务在线

    Python模拟登陆大连交通大学教务在线,使用wxPython做的界面,urllib2发送数据,可以实现登陆后获取首页登陆数据的功能,目前只做登陆,其他的暂时没做 Python2.7代码 # -*- ...

  8. 使用Python模拟登陆12306并全自动下单

    最近一段时间一直在研究用Python模拟登陆12306网站并自动刷票下单,经过一段时间的摸索,终于完成了代码,实现了12306刷票的功能.话不多说,先给大伙儿看看成果.我录制了一段时间,展示了自动刷票 ...

  9. pythonurllib微博登录怎么删_Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据...

    我们都知道HTTP是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限. 用浏览器 ...

最新文章

  1. [翻译]Axure-Dynamic Panel(Basic)-原型设计工具Axure学习-第2.1节
  2. 网络丢包问题排查总结
  3. Codeforces 38B - Chess
  4. 1.物理系统PhysicsWorld,RayCast
  5. P2571 [SCOI2010]传送带
  6. idea 切换java11_Java 11就在这里,您准备好进行切换了吗?
  7. STL源码剖析 set相关算法
  8. mfsmatelogger安装脚本
  9. 数学图形(2.1)三叶结
  10. php简单登陆,PHP简单实现单点登录
  11. ISO14001认证用处有哪些?
  12. postman 定时任务
  13. python定义一个变量为整型怎么写_python里怎么定义一个变量
  14. android pppd log,未记录的pppd退出代码
  15. Freeman链码(弗雷曼链码)--matlab实现
  16. root的家目录和普通用户的家目录
  17. 游戏skr而止,漏洞周而复始 —— 游戏合约漏洞全面汇总 | 漏洞分析连载之六
  18. 简练软考知识点整理-估算活动持续时间
  19. 3389远程服务器管理器,server 2012R2 data center远程桌面无法连接,3389不通,监听列表没有3389...
  20. matlab 分式拟合,matlab 微分方程组的参数拟合

热门文章

  1. web系统大规模并发
  2. 【MySQL】使用C语言连接数据库
  3. 上述所提到的所有资源文件,页面内搜索按住ctrl+f
  4. android wifi热点默认名称,Android WIFI热点默认SSID的修改方法
  5. webstrom 怎么设置打开的时候默认不是insert状态(切换插入和改写模式)
  6. 2-Bomb Lab
  7. 3D文档(BRD、MRD、PRD)定义联系区别
  8. CSS 经典布局(两栏布局 + 三栏布局 + 圣杯布局 + 双飞翼布局)
  9. 分享给java程序员的文章:一年有多长
  10. 计算机专业徐向东教授,计算机虹膜识别系统的分析-控制理论与控制工程专业论文.docx...