2018-01-10:fix post 請求數據遺漏部分內容
背景:
最近在寫一個小程序,發現博主所在的地區訪問該網站時有防ddos功能驗證導致程序不能正常工作。
經過試驗發現可以用國外代理ip解決這個問題,但是程序走代理訪問延遲高且不穩定。
思路:
selenium啟動瀏覽器 => 手動通過網站ddos驗證 => 程序操控其他業務請求
問題:
1.selenium 不支持 post 請求方式
2.selenium 不支持自定義 request header
環境:
selenium:3.8.1
JDK:1.8
firefox:45.9.0esr 下載歷史版本:https://download-installer.cdn.mozilla.net/pub/firefox/releases/
解決方案:
1.寫一個本地頁面,post請求通過本地頁面的ajax請求轉發出去,ajax也支持自定義request header
問題:本地頁面轉發會在request header附帶上origin。網站對origin有校驗,導致訪問失敗
2.selenium 執行 js代碼
問題:只能執行原生js代碼
參考代碼:https://stackoverflow.com/questions/11430773/how-to-use-javascript-with-selenium-webdriver-java
WebDriver driver = new FirefoxDriver(); // 打開這個網站,防止js跨域請求(用baidu舉例) driver.get("https://www.baidu.com"); // 開啟開發者模式,方便觀察請求 Actions builder = new Actions(driver); builder.sendKeys(Keys.F12).perform(); JavascriptExecutor jse = (JavascriptExecutor) driver ; try { String resp = (String) jse.executeScript( "var xmlhttp=new XMLHttpRequest();\n" + "xmlhttp.open(\"GET\",\"https://www.baidu.com\",false);\n" + "xmlHttp.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\");\n" + // 表單提交的頭部信息 "xmlhttp.setRequestHeader(\"testHeader\",\"123456\");\n" + // 自定義請求頭 "xmlhttp.send(\"name=test&sex=1&age=18\");\n" + // 表單數據 "return xmlhttp.responseText;"); System.out.println(resp); } catch (Exception e) { //.......... Exception }
以上,拋磚引玉。如有更好的解決方案,請留言討論,謝謝!