博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpClient4.3模拟登陆OSChina开源社区
阅读量:6801 次
发布时间:2019-06-26

本文共 27413 字,大约阅读时间需要 91 分钟。

hot3.png

import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.net.URISyntaxException;import java.util.ArrayList;import java.util.List;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptException;import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.message.BasicNameValuePair;public class HttpClient4OSchinaLogin {    private CloseableHttpClient httpClient = HttpClients.createDefault();    /**     * 设置请求头(这个方法没被用到,有些网站可能需要设置用户代理等请求头信息)     *      * @param httpPost     *            POST请求     *      */    public void setHeader(HttpPost httpPost) {        httpPost.setHeader("host", "www.oschina.net");        httpPost.setHeader("User-Agent",                "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");        httpPost.setHeader("Accept",                "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");        httpPost.setHeader("Accept-Language",                "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");        httpPost.setHeader("Accept-Encoding", "gzip, deflate");        // httpPost.setHeader("Referer", "https://www.oschina.net/home/login");        httpPost.setHeader("Connection", "keep-alive");    }    public void login(String url, String email, String pwd)            throws ScriptException, URISyntaxException,            ClientProtocolException, IOException {        //调用sha1.js对密码进行sha1加密        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();        ScriptEngine scriptEngine = scriptEngineManager                .getEngineByName("JavaScript");        scriptEngine.eval(new InputStreamReader(HttpClient4OSchinaLogin.class                .getResourceAsStream("/sha1.js")));        Object t = scriptEngine                .eval("CryptoJS.SHA1('" + pwd + "').toString();");        // 打印加密后的pwd        System.out.println(t.toString());        HttpPost httpPost = new HttpPost(url);        List
parameters = new ArrayList
(); parameters.add(new BasicNameValuePair("email", email)); parameters.add(new BasicNameValuePair("pwd", t.toString())); UrlEncodedFormEntity urlEncoedFromEntity = new UrlEncodedFormEntity( parameters); httpPost.setEntity(urlEncoedFromEntity); CloseableHttpResponse response = httpClient.execute(httpPost); // httpClient.execute(httpPost); HttpGet httpGet = new HttpGet( "http://my.oschina.net/u/1167421/admin/profile"); HttpResponse response2 = httpClient.execute(httpGet); ByteArrayOutputStream baos = new ByteArrayOutputStream(); response2.getEntity().writeTo(baos); baos.flush(); // 打印http://my.oschina.net/u/1167421/admin/profile的html代码 System.out.println(baos.toString("utf-8")); // 打印响应头 Header[] headers = response.getAllHeaders(); for (Header h : headers) { System.out.println(h.getName() + "=" + h.getValue()); } } public static void main(String[] args) throws Exception { HttpClient4OSchinaLogin hc = new HttpClient4OSchinaLogin(); hc.login("https://www.oschina.net/action/user/hash_login", "your email", "your password"); }}

 

/*CryptoJS v3.1.2code.google.com/p/crypto-js(c) 2009-2013 by Jeff Mott. All rights reserved.code.google.com/p/crypto-js/wiki/License*//*CryptoJS v3.1.2code.google.com/p/crypto-js(c) 2009-2013 by Jeff Mott. All rights reserved.code.google.com/p/crypto-js/wiki/License*//** * CryptoJS core components. */var CryptoJS = CryptoJS || (function (Math, undefined) {    /**     * CryptoJS namespace.     */    var C = {};    /**     * Library namespace.     */    var C_lib = C.lib = {};    /**     * Base object for prototypal inheritance.     */    var Base = C_lib.Base = (function () {        function F() {}        return {            /**             * Creates a new object that inherits from this object.             *             * @param {Object} overrides Properties to copy into the new object.             *             * @return {Object} The new object.             *             * @static             *             * @example             *             *     var MyType = CryptoJS.lib.Base.extend({             *         field: 'value',             *             *         method: function () {             *         }             *     });             */            extend: function (overrides) {                // Spawn                F.prototype = this;                var subtype = new F();                // Augment                if (overrides) {                    subtype.mixIn(overrides);                }                // Create default initializer                if (!subtype.hasOwnProperty('init')) {                    subtype.init = function () {                        subtype.$super.init.apply(this, arguments);                    };                }                // Initializer's prototype is the subtype object                subtype.init.prototype = subtype;                // Reference supertype                subtype.$super = this;                return subtype;            },            /**             * Extends this object and runs the init method.             * Arguments to create() will be passed to init().             *             * @return {Object} The new object.             *             * @static             *             * @example             *             *     var instance = MyType.create();             */            create: function () {                var instance = this.extend();                instance.init.apply(instance, arguments);                return instance;            },            /**             * Initializes a newly created object.             * Override this method to add some logic when your objects are created.             *             * @example             *             *     var MyType = CryptoJS.lib.Base.extend({             *         init: function () {             *             // ...             *         }             *     });             */            init: function () {            },            /**             * Copies properties into this object.             *             * @param {Object} properties The properties to mix in.             *             * @example             *             *     MyType.mixIn({             *         field: 'value'             *     });             */            mixIn: function (properties) {                for (var propertyName in properties) {                    if (properties.hasOwnProperty(propertyName)) {                        this[propertyName] = properties[propertyName];                    }                }                // IE won't copy toString using the loop above                if (properties.hasOwnProperty('toString')) {                    this.toString = properties.toString;                }            },            /**             * Creates a copy of this object.             *             * @return {Object} The clone.             *             * @example             *             *     var clone = instance.clone();             */            clone: function () {                return this.init.prototype.extend(this);            }        };    }());    /**     * An array of 32-bit words.     *     * @property {Array} words The array of 32-bit words.     * @property {number} sigBytes The number of significant bytes in this word array.     */    var WordArray = C_lib.WordArray = Base.extend({        /**         * Initializes a newly created word array.         *         * @param {Array} words (Optional) An array of 32-bit words.         * @param {number} sigBytes (Optional) The number of significant bytes in the words.         *         * @example         *         *     var wordArray = CryptoJS.lib.WordArray.create();         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);         */        init: function (words, sigBytes) {            words = this.words = words || [];            if (sigBytes != undefined) {                this.sigBytes = sigBytes;            } else {                this.sigBytes = words.length * 4;            }        },        /**         * Converts this word array to a string.         *         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex         *         * @return {string} The stringified word array.         *         * @example         *         *     var string = wordArray + '';         *     var string = wordArray.toString();         *     var string = wordArray.toString(CryptoJS.enc.Utf8);         */        toString: function (encoder) {            return (encoder || Hex).stringify(this);        },        /**         * Concatenates a word array to this word array.         *         * @param {WordArray} wordArray The word array to append.         *         * @return {WordArray} This word array.         *         * @example         *         *     wordArray1.concat(wordArray2);         */        concat: function (wordArray) {            // Shortcuts            var thisWords = this.words;            var thatWords = wordArray.words;            var thisSigBytes = this.sigBytes;            var thatSigBytes = wordArray.sigBytes;            // Clamp excess bits            this.clamp();            // Concat            if (thisSigBytes % 4) {                // Copy one byte at a time                for (var i = 0; i < thatSigBytes; i++) {                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);                }            } else if (thatWords.length > 0xffff) {                // Copy one word at a time                for (var i = 0; i < thatSigBytes; i += 4) {                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];                }            } else {                // Copy all words at once                thisWords.push.apply(thisWords, thatWords);            }            this.sigBytes += thatSigBytes;            // Chainable            return this;        },        /**         * Removes insignificant bits.         *         * @example         *         *     wordArray.clamp();         */        clamp: function () {            // Shortcuts            var words = this.words;            var sigBytes = this.sigBytes;            // Clamp            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);            words.length = Math.ceil(sigBytes / 4);        },        /**         * Creates a copy of this word array.         *         * @return {WordArray} The clone.         *         * @example         *         *     var clone = wordArray.clone();         */        clone: function () {            var clone = Base.clone.call(this);            clone.words = this.words.slice(0);            return clone;        },        /**         * Creates a word array filled with random bytes.         *         * @param {number} nBytes The number of random bytes to generate.         *         * @return {WordArray} The random word array.         *         * @static         *         * @example         *         *     var wordArray = CryptoJS.lib.WordArray.random(16);         */        random: function (nBytes) {            var words = [];            for (var i = 0; i < nBytes; i += 4) {                words.push((Math.random() * 0x100000000) | 0);            }            return new WordArray.init(words, nBytes);        }    });    /**     * Encoder namespace.     */    var C_enc = C.enc = {};    /**     * Hex encoding strategy.     */    var Hex = C_enc.Hex = {        /**         * Converts a word array to a hex string.         *         * @param {WordArray} wordArray The word array.         *         * @return {string} The hex string.         *         * @static         *         * @example         *         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);         */        stringify: function (wordArray) {            // Shortcuts            var words = wordArray.words;            var sigBytes = wordArray.sigBytes;            // Convert            var hexChars = [];            for (var i = 0; i < sigBytes; i++) {                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;                hexChars.push((bite >>> 4).toString(16));                hexChars.push((bite & 0x0f).toString(16));            }            return hexChars.join('');        },        /**         * Converts a hex string to a word array.         *         * @param {string} hexStr The hex string.         *         * @return {WordArray} The word array.         *         * @static         *         * @example         *         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);         */        parse: function (hexStr) {            // Shortcut            var hexStrLength = hexStr.length;            // Convert            var words = [];            for (var i = 0; i < hexStrLength; i += 2) {                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);            }            return new WordArray.init(words, hexStrLength / 2);        }    };    /**     * Latin1 encoding strategy.     */    var Latin1 = C_enc.Latin1 = {        /**         * Converts a word array to a Latin1 string.         *         * @param {WordArray} wordArray The word array.         *         * @return {string} The Latin1 string.         *         * @static         *         * @example         *         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);         */        stringify: function (wordArray) {            // Shortcuts            var words = wordArray.words;            var sigBytes = wordArray.sigBytes;            // Convert            var latin1Chars = [];            for (var i = 0; i < sigBytes; i++) {                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;                latin1Chars.push(String.fromCharCode(bite));            }            return latin1Chars.join('');        },        /**         * Converts a Latin1 string to a word array.         *         * @param {string} latin1Str The Latin1 string.         *         * @return {WordArray} The word array.         *         * @static         *         * @example         *         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);         */        parse: function (latin1Str) {            // Shortcut            var latin1StrLength = latin1Str.length;            // Convert            var words = [];            for (var i = 0; i < latin1StrLength; i++) {                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);            }            return new WordArray.init(words, latin1StrLength);        }    };    /**     * UTF-8 encoding strategy.     */    var Utf8 = C_enc.Utf8 = {        /**         * Converts a word array to a UTF-8 string.         *         * @param {WordArray} wordArray The word array.         *         * @return {string} The UTF-8 string.         *         * @static         *         * @example         *         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);         */        stringify: function (wordArray) {            try {                return decodeURIComponent(escape(Latin1.stringify(wordArray)));            } catch (e) {                throw new Error('Malformed UTF-8 data');            }        },        /**         * Converts a UTF-8 string to a word array.         *         * @param {string} utf8Str The UTF-8 string.         *         * @return {WordArray} The word array.         *         * @static         *         * @example         *         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);         */        parse: function (utf8Str) {            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));        }    };    /**     * Abstract buffered block algorithm template.     *     * The property blockSize must be implemented in a concrete subtype.     *     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0     */    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({        /**         * Resets this block algorithm's data buffer to its initial state.         *         * @example         *         *     bufferedBlockAlgorithm.reset();         */        reset: function () {            // Initial values            this._data = new WordArray.init();            this._nDataBytes = 0;        },        /**         * Adds new data to this block algorithm's buffer.         *         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.         *         * @example         *         *     bufferedBlockAlgorithm._append('data');         *     bufferedBlockAlgorithm._append(wordArray);         */        _append: function (data) {            // Convert string to WordArray, else assume WordArray already            if (typeof data == 'string') {                data = Utf8.parse(data);            }            // Append            this._data.concat(data);            this._nDataBytes += data.sigBytes;        },        /**         * Processes available data blocks.         *         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.         *         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.         *         * @return {WordArray} The processed data.         *         * @example         *         *     var processedData = bufferedBlockAlgorithm._process();         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');         */        _process: function (doFlush) {            // Shortcuts            var data = this._data;            var dataWords = data.words;            var dataSigBytes = data.sigBytes;            var blockSize = this.blockSize;            var blockSizeBytes = blockSize * 4;            // Count blocks ready            var nBlocksReady = dataSigBytes / blockSizeBytes;            if (doFlush) {                // Round up to include partial blocks                nBlocksReady = Math.ceil(nBlocksReady);            } else {                // Round down to include only full blocks,                // less the number of blocks that must remain in the buffer                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);            }            // Count words ready            var nWordsReady = nBlocksReady * blockSize;            // Count bytes ready            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);            // Process blocks            if (nWordsReady) {                for (var offset = 0; offset < nWordsReady; offset += blockSize) {                    // Perform concrete-algorithm logic                    this._doProcessBlock(dataWords, offset);                }                // Remove processed words                var processedWords = dataWords.splice(0, nWordsReady);                data.sigBytes -= nBytesReady;            }            // Return processed words            return new WordArray.init(processedWords, nBytesReady);        },        /**         * Creates a copy of this object.         *         * @return {Object} The clone.         *         * @example         *         *     var clone = bufferedBlockAlgorithm.clone();         */        clone: function () {            var clone = Base.clone.call(this);            clone._data = this._data.clone();            return clone;        },        _minBufferSize: 0    });    /**     * Abstract hasher template.     *     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)     */    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({        /**         * Configuration options.         */        cfg: Base.extend(),        /**         * Initializes a newly created hasher.         *         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.         *         * @example         *         *     var hasher = CryptoJS.algo.SHA256.create();         */        init: function (cfg) {            // Apply config defaults            this.cfg = this.cfg.extend(cfg);            // Set initial values            this.reset();        },        /**         * Resets this hasher to its initial state.         *         * @example         *         *     hasher.reset();         */        reset: function () {            // Reset data buffer            BufferedBlockAlgorithm.reset.call(this);            // Perform concrete-hasher logic            this._doReset();        },        /**         * Updates this hasher with a message.         *         * @param {WordArray|string} messageUpdate The message to append.         *         * @return {Hasher} This hasher.         *         * @example         *         *     hasher.update('message');         *     hasher.update(wordArray);         */        update: function (messageUpdate) {            // Append            this._append(messageUpdate);            // Update the hash            this._process();            // Chainable            return this;        },        /**         * Finalizes the hash computation.         * Note that the finalize operation is effectively a destructive, read-once operation.         *         * @param {WordArray|string} messageUpdate (Optional) A final message update.         *         * @return {WordArray} The hash.         *         * @example         *         *     var hash = hasher.finalize();         *     var hash = hasher.finalize('message');         *     var hash = hasher.finalize(wordArray);         */        finalize: function (messageUpdate) {            // Final message update            if (messageUpdate) {                this._append(messageUpdate);            }            // Perform concrete-hasher logic            var hash = this._doFinalize();            return hash;        },        blockSize: 512/32,        /**         * Creates a shortcut function to a hasher's object interface.         *         * @param {Hasher} hasher The hasher to create a helper for.         *         * @return {Function} The shortcut function.         *         * @static         *         * @example         *         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);         */        _createHelper: function (hasher) {            return function (message, cfg) {                return new hasher.init(cfg).finalize(message);            };        },        /**         * Creates a shortcut function to the HMAC's object interface.         *         * @param {Hasher} hasher The hasher to use in this HMAC helper.         *         * @return {Function} The shortcut function.         *         * @static         *         * @example         *         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);         */        _createHmacHelper: function (hasher) {            return function (message, key) {                return new C_algo.HMAC.init(hasher, key).finalize(message);            };        }    });    /**     * Algorithm namespace.     */    var C_algo = C.algo = {};    return C;}(Math));(function () {    // Shortcuts    var C = CryptoJS;    var C_lib = C.lib;    var WordArray = C_lib.WordArray;    var Hasher = C_lib.Hasher;    var C_algo = C.algo;    // Reusable object    var W = [];    /**     * SHA-1 hash algorithm.     */    var SHA1 = C_algo.SHA1 = Hasher.extend({        _doReset: function () {            this._hash = new WordArray.init([                0x67452301, 0xefcdab89,                0x98badcfe, 0x10325476,                0xc3d2e1f0            ]);        },        _doProcessBlock: function (M, offset) {            // Shortcut            var H = this._hash.words;            // Working variables            var a = H[0];            var b = H[1];            var c = H[2];            var d = H[3];            var e = H[4];            // Computation            for (var i = 0; i < 80; i++) {                if (i < 16) {                    W[i] = M[offset + i] | 0;                } else {                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];                    W[i] = (n << 1) | (n >>> 31);                }                var t = ((a << 5) | (a >>> 27)) + e + W[i];                if (i < 20) {                    t += ((b & c) | (~b & d)) + 0x5a827999;                } else if (i < 40) {                    t += (b ^ c ^ d) + 0x6ed9eba1;                } else if (i < 60) {                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;                } else /* if (i < 80) */ {                    t += (b ^ c ^ d) - 0x359d3e2a;                }                e = d;                d = c;                c = (b << 30) | (b >>> 2);                b = a;                a = t;            }            // Intermediate hash value            H[0] = (H[0] + a) | 0;            H[1] = (H[1] + b) | 0;            H[2] = (H[2] + c) | 0;            H[3] = (H[3] + d) | 0;            H[4] = (H[4] + e) | 0;        },        _doFinalize: function () {            // Shortcuts            var data = this._data;            var dataWords = data.words;            var nBitsTotal = this._nDataBytes * 8;            var nBitsLeft = data.sigBytes * 8;            // Add padding            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;            data.sigBytes = dataWords.length * 4;            // Hash final blocks            this._process();            // Return final computed hash            return this._hash;        },        clone: function () {            var clone = Hasher.clone.call(this);            clone._hash = this._hash.clone();            return clone;        }    });    /**     * Shortcut function to the hasher's object interface.     *     * @param {WordArray|string} message The message to hash.     *     * @return {WordArray} The hash.     *     * @static     *     * @example     *     *     var hash = CryptoJS.SHA1('message');     *     var hash = CryptoJS.SHA1(wordArray);     */    C.SHA1 = Hasher._createHelper(SHA1);    /**     * Shortcut function to the HMAC's object interface.     *     * @param {WordArray|string} message The message to hash.     * @param {WordArray|string} key The secret key.     *     * @return {WordArray} The HMAC.     *     * @static     *     * @example     *     *     var hmac = CryptoJS.HmacSHA1(message, key);     */    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);}());

 

将JS文件放在src下

转载于:https://my.oschina.net/u/1167421/blog/546464

你可能感兴趣的文章
Python简介
查看>>
泛函编程(13)-无穷数据流-Infinite Stream
查看>>
XML与HTML
查看>>
[Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的哦)...
查看>>
Java SecurityManager
查看>>
[LeetCode]*84.Largest Rectangle in Histogram
查看>>
[华为机试练习题]8.汽水瓶
查看>>
taskset - retrieve or set a process's CPU affinity (affect SYSTEMTAP TIME)
查看>>
SpringBoot2 | SpringBoot启动流程源码分析(二)
查看>>
MyBatis 原理浅析——基本原理
查看>>
第七章:SpringCloud Feign对hystrix的支持
查看>>
从零开始学习hadoop之发行版选择
查看>>
Redis radix tree源码解析
查看>>
数组和链表
查看>>
撩课-Java面试宝典-第三篇
查看>>
阿里云前端周刊 - 第 13 期
查看>>
给你一份架构部操作手册,你会用么?
查看>>
接口Deque <E>
查看>>
线程安全的无锁RingBuffer
查看>>
移动安全-iOS(二)
查看>>