類比登入新浪微博(Python)

來源:互聯網
上載者:User

 PC 登入新浪微博時, 在用戶端用js預先對使用者名稱、密碼都進行了加密, 而且在POST之前會GET 一組參數,這也將作為POST_DATA 的一部分。 這樣, 就不能用通常的那種簡單方法來類比POST 登入( 比如 人人網 )。

由於要用的一部分微博資料用API擷取不方便, 所以還是要自己寫個小爬蟲, 類比登入是必不可少的。琢磨了一下這個東西,最終登入成功。

1, 在提交POST請求之前, 需要GET 擷取兩個參數。
       地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
       得到的資料中有 "servertime" 和 "nonce" 的值, 是隨機的,其他值貌似沒什麼用。

2, 通過httpfox 觀察POST 的資料, 參數較複雜,其中 “su" 是加密後的username, "sp"是加密後的password。"servertime" 和 ”nonce" 是上一步得到的。其他參數是不變的。

    username 經過了BASE64 計算: username = base64.encodestring( urllib.quote(username) )[:-1];
    password 經過了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值來幹擾。
    即: 兩次SHA1加密後, 將結果加上 servertime 和 nonce 的值, 再SHA1 算一次。

    將參數組織好, POST請求。 這之後還沒有登入成功。
    POST後得到的內容中包含一句 location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");

這是登入失敗時的結果, 登入成功後結果與之類似, 不過retcode 的值是0 。接下來再請求這個URL,這樣就成功登入到微博了。
記得要提前build 緩衝。

下面是完整代碼(沒加註釋,湊合看吧):

#! /usr/bin/env python
#coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlib

cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
postdata = {
    'entry': 'weibo',
    'gateway': '1',
    'from': '',
    'savestate': '7',
    'userticket': '1',
    'ssosimplelogin': '1',
    'vsnf': '1',
    'vsnval': '',
    'su': '',
    'service': 'miniblog',
    'servertime': '',
    'nonce': '',
    'pwencode': 'wsse',
    'sp': '',
    'encoding': 'UTF-8',
    'url': '
    'returntype': 'META'
}

def get_servertime():
    url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'
    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']
        return servertime, nonce
    except:
        print 'Get severtime error!'
        return None

def get_pwd(pwd, servertime, nonce):
    pwd1 = hashlib.sha1(pwd).hexdigest()
    pwd2 = hashlib.sha1(pwd1).hexdigest()
    pwd3_ = pwd2 + servertime + nonce
    pwd3 = hashlib.sha1(pwd3_).hexdigest()
    return pwd3

def get_user(username):
    username_ = urllib.quote(username)
    username = base64.encodestring(username_)[:-1]
    return username

def login():
    username = '你的登入郵箱'
    pwd = '你的密碼'
    url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)'
    try:
        servertime, nonce = get_servertime()
    except:
        return
    global postdata
    postdata['servertime'] = servertime
    postdata['nonce'] = nonce
    postdata['su'] = get_user(username)
    postdata['sp'] = get_pwd(pwd, servertime, nonce)
    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
    )
    result = urllib2.urlopen(req)
    text = result.read()
    p = re.compile('location\.replace\(\'(.*?)\'\)')
    try:
        login_url = p.search(text).group(1)
        #print login_url
        urllib2.urlopen(login_url)
        print "登入成功!"
    except:
        print 'Login error!'

login()

轉載:http://www.douban.com/note/201767245/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.