设为首页 收藏本站
查看: 999|回复: 0

[经验分享] 测试开发Python培训:模拟登录新浪微博-技术篇

[复制链接]
累计签到:13 天
连续签到:1 天
发表于 2015-12-1 15:31:39 | 显示全部楼层 |阅读模式
        一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,poptest在做测试开发培训中更加关注技术难点,掌握技术实现思路,提高动手能力。这里通过大家都能接触到的系统新浪微博,作为案例。
        模拟登录功能比较简单,很多人在学习自动化的时候都会以登陆来作为自己的第一个学习案例,有点像开发语言中第一段代码都是helloworld!一样。登陆简单的模拟登录,直接发post请求就OK,很容易实现。 这里用新浪微博,就是技术实现复杂,涉及到很多细节。难点在于登录新浪微博时,客户端js会对发送的请求,如登陆中的用户名、密码进行加密。
        第一步:分析协议内容
                  可以利用协议工具进行分析,在这里我们可以用火狐浏览器来进行跟踪,输入用户名后,会进行预登录,网址为: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再次加密.
      第二步:模拟请求
             请求网址:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18),表单数据如下:
              DSC0000.png             
        主要提交数据:
  su:base64加密过后的用户名
  servertime/nonce/rsakv之前预登陆获取到了
  sp是加密过户的密码
      username 经过了BASE64 计算: username = base64.encodestring( urllib.quote(username) )[:-1];
      password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰。
      即: 两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1 算一次。

     第三步:处理请求响应

    提交之后: 将参数组织好, POST请求。 这之后还没有登录成功。,原因是返回的并不是微博个人主页,而是一段重定向的代码:

    DSC0001.png

        登录成功后retcode 的值是0 。接下来再请求这个URL,这样就成功登录到微博了。
   记得要提前build 缓存
  
    备注:技术实现:
    cookielib: 用来保存cookies.
  urllib2: 发送请求获取网页数据,与cookielib配合,利用cookie访问.
  json:处理数据交换格式

   代码:
  
   # -*- coding: utf-8 -*-
########################  
#author:Andrewseu  
#date:2015/9/23  
#login weibo  
########################  
  
import sys  
import urllib  
import urllib2  
import cookielib  
import base64  
import re  
import json  
import rsa  
import binascii  
#import requests  
#from bs4 import BeautifulSoup  
  
#新浪微博的模拟登陆  
class weiboLogin:  
      def enableCookies(self):  
                #获取一个保存cookies的对象  
                cj = cookielib.CookieJar()  
                #将一个保存cookies对象和一个HTTP的cookie的处理器绑定  
                cookie_support = urllib2.HTTPCookieProcessor(cj)  
                #创建一个opener,设置一个handler用于处理http的url打开  
                opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)  
                #安装opener,此后调用urlopen()时会使用安装过的opener对象  
                urllib2.install_opener(opener)  
  
      #预登陆获得 servertime, nonce, pubkey, rsakv  
      def getServerData(self):  
                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'  
                data = urllib2.urlopen(url).read()  
                p = re.compile('(.∗)')  
                try:  
                          json_data = p.search(data).group(1)  
                          data = json.loads(json_data)  
                          servertime = str(data['servertime'])  
                          nonce = data['nonce']  
                          pubkey = data['pubkey']  
                          rsakv = data['rsakv']  
                          return servertime, nonce, pubkey, rsakv  
                except:  
                          print 'Get severtime error!'  
                          return None  
                  
   #获取加密的密码  
       def getP、assword(self, password, servertime, nonce, pubkey):  
                  rsaPublickey = int(pubkey, 16)  
                  key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥  
                  message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到  
                  passwd = rsa.encrypt(message, key) #加密  
                  passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。  
                  return passwd  
  
       #获取加密的用户名  
       def getUsername(self, username):  
                  username_ = urllib.quote(username)  
                  username = base64.encodestring(username_)[:-1]  
                  return username  
  
        #获取需要提交的表单数据     
       def getFormData(self,userName,password,servertime,nonce,pubkey,rsakv):  
              userName = self.getUsername(userName)  
              psw = self.getPassword(password,servertime,nonce,pubkey)  
         
              form_data = {  
                    'entry':'weibo',  
                    'gateway':'1',  
                    'from':'',  
                    'savestate':'7',  
                    'useticket':'1',  
                    'pagerefer':'http://weibo.com/p/1005052679342531/home?from=page_100505&mod=TAB&pids=plc_main',  
                    'vsnf':'1',  
                    'su':userName,  
                    'service':'miniblog',  
                    'servertime':servertime,  
                    'nonce':nonce,  
                    'pwencode':'rsa2',  
                    'rsakv':rsakv,  
                    'sp':psw,  
                    'sr':'1366*768',  
                    'encoding':'UTF-8',  
                    'prelt':'115',  
                    'url':'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',  
                    'returntype':'META'  
                   }  
            formData = urllib.urlencode(form_data)  
            return formData  
  
        #登陆函数  
        def login(self,username,psw):  
                  self.enableCookies()  
                  url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'  
                  servertime,nonce,pubkey,rsakv = self.getServerData()  
                  formData = self.getFormData(username,psw,servertime,nonce,pubkey,rsakv)  
                  headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'}  
                  req  = urllib2.Request(  
                          url = url,  
                          data = formData,  
                          headers = headers  
                  )  
                  result = urllib2.urlopen(req)  
                  text = result.read()  
                  print text  
                  #还没完!!!这边有一个重定位网址,包含在脚本中,获取到之后才能真正地登陆  
                  p = re.compile('location\.replace[\'"](.∗?)[\'"]')  
                  try:  
                            login_url = p.search(text).group(1)  
                            print login_url  
                            #由于之前的绑定,cookies信息会直接写入  
                            urllib2.urlopen(login_url)  
                            print "Login success!"  
                  except:  
                            print 'Login error!'  
                            return 0  
  
                #访问主页,把主页写入到文件中  
                url = 'http://weibo.com/u/2679342531/home?topnav=1&wvr=6'  
                request = urllib2.Request(url)  
                response = urllib2.urlopen(request)  
                text = response.read()  
                fp_raw = open("e://weibo.html","w+")  
                fp_raw.write(text)  
                fp_raw.close()  
                #print text  
              
wblogin = weiboLogin()  
print '新浪微博模拟登陆:'  
username = raw_input(u'用户名:')  
password = raw_input(u'密码:')  
wblogin.login(username,password)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146002-1-1.html 上篇帖子: windows下如何快速优雅的使用python的科学计算库? 下篇帖子: python学习笔记十六:读取JSON文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表