天天看點

使用圖鑒 API 實作 js 腳本自動登入實踐

登入頁 form 表單

<form action="/" id="loginForm" method="post" role="form">
    <div class="dl box-shadow1">
        <div class="dl-bj space-m ">
            <div class="dl-box space-m">
                <div class="dl-box-left float-l">
                    <div class="dl-box-left-text">
                        <div class="neme float-l">使用者名</div>

                        <input class="text1 float-l" id="UserAccount" name="UserAccount" type="text"
                            autocomplete="off" value="" />
                    </div>
                    <div class="dl-box-left-text space-m-t-05">
                        <div class="neme float-l">密 碼</div>

                        <input class="text2 float-l" id="Password" name="Password" type="password"
                            autocomplete="off" value="" />
                    </div>
                    <div class="float-l" style="width:372px">
                        <table>
                            <tr>
                                <td>
                                    <div class="dl-box-left-textyzm space-m-t-05">
                                        <div class="neme float-l">驗證碼</div>
                                        <input class="text3" id="SecurityCode" name="SecurityCode"
                                            type="text" autocomplete="off" value="" />
                                    </div>
                                </td>
                                <td>
                                    <div class="neme"><img style=" margin-top:4px;border-radius:5px;"
                                            onclick="this.src= document.location.protocol + '/Account/GetSecurityCode?flag=' + Math.random(); "
                                            id="secImg" title="換一張" /></div>
                                </td>
                            </tr>
                        </table>

                    </div>
                    <br />
                    <div class="err">
                        <div class="ts">
                            <font size="2" color="#fff">
                                驗證碼錯誤,請重新輸入!
                            </font>
                        </div>
                    </div>
                </div>
                <div class="dl-box-right float-r">
                    <input id="btnLogin" class="label-2 radius-5 pointer space-m-b-10 space-m" type="button"
                        value="登 錄" />
                </div>
                <div class="clear"></div>
            </div>
        </div>
    </div>
</form>           

自動登入 js 腳本

// XMLHttpRequest 請求網絡封裝方法
const http = {
    ajax: (settings = {}) => {
        let _s = Object.assign ({
            url: '', // string
            type: 'GET', // string 'GET' 'POST' 'DELETE'
            dataType: 'json', // string 期望的傳回資料類型:'json' 'text' 'document' 'blob'...
            async: true, // boolean true:異步請求 false:同步請求 required
            data: null, // any 請求參數,data需要和請求頭Content-Type對應
            headers: {}, // object 請求頭
            timeout: 1000, // string 逾時時間:0表示不設定逾時
            beforeSend: (xhr) => {},
            success: (result, status, xhr) => {},
            error: (xhr, status, error) => {},
            complete: (xhr, status) => {}
        }, settings);
        // 參數驗證
        if (!_s.url || !_s.type || !_s.dataType || _s.async === undefined) {
            alert('參數有誤');
            return;
        }
        // 建立XMLHttpRequest請求對象
        let xhr = new XMLHttpRequest();
        // 請求開始回調函數
        xhr.addEventListener('loadstart', e => {
            _s.beforeSend(xhr);
        });
        // 請求成功回調函數
        xhr.addEventListener('load', e => {
            const status = xhr.status;
            if ((status >= 200 && status < 300) || status === 304) {
                let result;
                if (xhr.responseType === 'text') {
                    result = xhr.responseText;
                } else if (xhr.responseType === 'document') {
                    result = xhr.responseXML;
                } else {
                    result = xhr.response;
                }
                // 注意:狀态碼200表示請求發送/接受成功,不表示業務處理成功
                _s.success(result, status, xhr);
            } else {
                _s.error(xhr, status, e);
            }
        });
        // 請求結束
        xhr.addEventListener('loadend', e => {
            _s.complete(xhr, xhr.status);
        });
        // 請求出錯
        xhr.addEventListener('error', e => {
            _s.error(xhr, xhr.status, e);
        });
        // 請求逾時
        xhr.addEventListener('timeout', e => {
            _s.error(xhr, 408, e);
        });
        let useUrlParam = false;
        let sType = _s.type.toUpperCase ();
        // 如果是"簡單"請求,則把data參數組裝在url上
        if (sType === 'GET' || sType === 'DELETE') {
            useUrlParam = true;
            _s.url += http.getUrlParam(_s.url, _s.data);
        }
        // 初始化請求
        xhr.open(_s.type, _s.url, _s.async);
        // 設定期望的傳回資料類型
        xhr.responseType = _s.dataType;
        // 設定請求頭
        for (const key of Object.keys(_s.headers)) {
            xhr.setRequestHeader(key, _s.headers[key]);
        }
        // 設定逾時時間
        if (_s.async && _s.timeout) {
            xhr.timeout = _s.timeout;
        }
        // 發送請求.如果是簡單請求,請求參數應為null.否則,請求參數類型需要和請求頭Content-Type對應
        xhr.send(useUrlParam ? null : http.getQueryData(_s.data));
    },
    // 把參數data轉為url查詢參數
    getUrlParam: (url, data) => {
        if (!data) {
            return '';
        }
        let paramsStr = data instanceof Object ? http.getQueryString(data) : data;
        return (url.indexOf('?') !== -1) ? paramsStr : '?'+paramsStr;
    },
    // 擷取ajax請求參數
    getQueryData: (data) => {
        if (!data) {
            return null;
        }
        if (typeof data === 'string') {
            return data;
        }
        if (data instanceof FormData) {
            return data;
        }
        return http.getQueryString(data);
    },
    // 把對象轉為查詢字元串
    getQueryString: (data) => {
        let paramsArr =[];
        if (data instanceof Object) {
            Object.keys(data).forEach(key => {
                let val = data[key];
                // todo 參數Date類型需要根據背景api酌情處理
                if (val instanceof Date) {
                    // val = dateFormat(val, 'yyyy-MM-dd hh:mm:ss');
                }
                paramsArr.push(encodeURIComponent(key) + '=' + encodeURIComponent(val));
            });
        }
        return paramsArr.join('&');
    }
}
// 從 Bolb 中讀取 Base64 圖檔資料方法
function blobToBase64(blob, callback) {
   var reader = new FileReader();
   reader.onload = function (e) {
       callback(e.target.result);
   }
   reader.readAsDataURL(blob);
}
// 自動登入方法
function auto_login() {
    // 替換自己的賬戶 input 和賬戶名稱
    document.getElementById('UserAccount').value = 'xxxxxxxx';
    // 替換自己的密碼 input 和賬戶密碼
    document.getElementById('Password').value = 'xxxxxx';
    // 替換自己的驗證碼 img
    var imgUrl = document.getElementById('secImg').src;
    http.ajax({
        url: imgUrl,
        dataType: 'blob',
        success: function (blob, status, xhr) {
            blobToBase64(blob, function (base64) {
                var formData = new FormData();
                // 替換自己的圖鑒使用者名
                formData.append('username', 'xxxxxx');
                // 替換自己的圖鑒密碼
                formData.append('password', 'xxxxxx');
                formData.append('typeid', '11');
                formData.append('image', base64.replace('data:image/jpeg;base64,', ''));
                http.ajax({
                    url: 'http://api.ttshitu.com/predict',
                    type: 'POST',
                    data: formData,
                    dataType: 'json',
                    timeout: 0,
                    success: function (response, status, xhr) {
                        let d = response.data;
                        if (d.success) {
                            let {id, result} = d.data;
                            // 替換自己的驗證碼 img
                            document.getElementById('SecurityCode').value = result;
                            // 替換自己的登入按鈕
                            document.getElementById('btnLogin').click();
                        }
                    },
                    error: (xhr, status, error) => {
                        console.log(error);
                    }
                });
            });
        },
        error: (xhr, status, error) => {
            console.log(error);
        }
    });
}
// 調用登入方法
auto_login();           

參考文檔

繼續閱讀