潭州课堂25班:Ph201805201 爬虫基础 第十四课 js破解 (课堂笔记)

 

 

 

 

 

打断点

找要的数据

 

鼠标的点击事件

 

 

 

 

 

新浪微博登录

表单提交分析 :

 

 

 

先佃输入错误密码开始调式

 f10 往下走,

f11 进入函数

sh + f11 跳出函数

 

 

 

 

# -*- coding: utf-8 -*-
# 斌彬电脑
# @Time : 2018/9/20 0020 4:30

#    新浪js分析

import requests
import base64
import time
import re
import json
import rsa
import binascii


class WeiboLogin(object):
    def __init__(self, username, password):
        self.username = self.encrypt_username(username)
        self.password = password
        self.session = requests.session()
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"}

    def pre_login(self):
        params = {
            "entry": "weibo",
            "callback": "sinaSSOController.preloginCallBack",
            "su": self.username,
            "rsakt": "mod",
            "checkpin": "1",
            "client": "ssologin.js(v1.4.19)",
            "_": int(time.time() * 1000)
        }

        url = 'https://login.sina.com.cn/sso/prelogin.php?'
        response = self.session.get(url, headers=self.headers, params=params)
        json_data = re.search(r'preloginCallBack\((.*?)\)', response.text).group(1)
        return json.loads(json_data)

    def login(self, pre_login_data):
        data = {
            "entry": "weibo",
            "gateway": "1",
            "from": "",
            "savestate": "7",
            "qrcode_flag": "false",
            "useticket": "1",
            "pagerefer": "",
            "vsnf": "1",
            "su": self.username,
            "service": "miniblog",
            "servertime": pre_login_data['servertime'],
            "nonce": pre_login_data['nonce'],
            "pwencode": "rsa2",
            "rsakv": pre_login_data['rsakv'],
            "sp": self.encrypt_password(self.password, pre_login_data['pubkey'], pre_login_data['servertime'],
                                        pre_login_data['nonce']),
            "sr": "1920*1080",
            "encoding": "UTF-8",
            "prelt": "49",
            "url": "https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack",
            "returntype": "META"
        }
        url = "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)"
        response = self.session.post(url, headers=self.headers, data=data)
        return response.content.decode('gbk')

    def houxu_login(self, login_response):
        first_url = re.search(r'location.replace\("(.*?)"\)', login_response).group(1)
        response = self.session.get(first_url, headers=self.headers).content.decode('gbk')

        all_url = re.search(r'arrURL":\["(.*?)"\]', response).group(1)
        all_url = all_url.split('","')
        data = "&callback=sinaSSOController.doCrossDomainCallBack&" + "scriptId=ssoscript1&" + "client=ssologin.js(v1.4.19)&" + "_=" + str(
            int(time.time() * 1000))
        for url in all_url:
            url = url.replace('\\', '')
            self.session.get(url + data, headers=self.headers)

    def encrypt_password(self, password, pubkey, servertime, nonce):
        my_password = str(servertime) + '\t' + str(nonce) + '\n' + str(password)
        publickey = rsa.PublicKey(int(pubkey, 16), int('10001', 16))
        return binascii.b2a_hex(rsa.encrypt(my_password.encode(), publickey)).decode()

    def encrypt_username(self, username):
        return base64.b64encode(username.encode())

    def yanzheng(self):
        resp = self.session.get('https://weibo.com/wnanbei/home', headers=self.headers)
        print(resp.text)

    def __call__(self, *args, **kwargs):
        json_data = self.pre_login()
        login_response = self.login(json_data)
        self.houxu_login(login_response)
        self.yanzheng()


if __name__ == "__main__":
    my_login = WeiboLogin('账号', '密码')
    my_login()

  

posted @ 2018-09-18 04:34  25班Ph201805201  阅读(204)  评论(0编辑  收藏  举报