包括獲取驗證碼接口、響應的驗證碼圖片保存、驗證碼圖片識別、獲取手機驗證碼請求接口等這幾個重要步驟的編寫javascript
打開Eclipse,新建一個java項目,項目中添加tess4j的jar包,以及tessdata等文件。java
代碼完成的功能爲,輸入驗證碼圖片的路徑,輸出驗證碼圖片的識別結果,結果是一個字符串類型python
具體代碼以下,註釋中已經對每一行代碼進行了講解,主要是爲了提升圖片字符識別的準確率。正則表達式
大概的圖片識別處理步驟是:設置字符的識別方式是英文和數字,將圖片按區域識別每個字符,把每個字符截取下來,作灰度處理以及銳化,而且把這個字符對應區域的圖片放大。最後識別這個通過處理的圖片。數組
package qingkeCode; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; import net.sourceforge.tess4j.util.ImageHelper; import net.sourceforge.tess4j.util.LoadLibs; public class PicToData { /*public static void main(String []args){ for (Integer i=1; i<44; i++){ System.out.println(GetData(i.toString())); } }*/ public static String GetData(String picPath) { File file = new File(picPath); Tesseract instance = new Tesseract(); //設置tess配置的路徑 File testDataFolderFile = LoadLibs.extractTessResources("tessdata"); //設置識別的方式爲英文和數字 instance.setLanguage("eng"); //加載配置 instance.setDatapath(testDataFolderFile.getAbsolutePath()); // 將驗證碼圖片的內容識別爲字符串 String result = ""; //對每個字符單獨識別 for (int i = 1; i < 5; i++) { String c = ""; try { c = instance.doOCR(change(file, i)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if (c.length()>0){ } if (c.length()>0){ result += c.substring(0, 1); } } return result; } public static BufferedImage change(File file, int i) throws Exception { // 讀取圖片字節數組 BufferedImage textImage = null; try { InputStream in = new FileInputStream(file); BufferedImage image = ImageIO.read(in); //包括左右的空白處,分爲6個區域 int subWidth = image.getWidth() / 6; //截取第i個字符的圖片,並將圖片灰度化 textImage = ImageHelper.convertImageToGrayscale(ImageHelper .getSubImage(image, subWidth * i, 0, subWidth+3, image.getHeight())); // 對圖片進行處理 //圖片銳化 textImage = ImageHelper.convertImageToBinary(textImage); //放大圖片,放大的倍數爲5倍 textImage = ImageHelper.getScaledInstance(textImage, textImage.getWidth() * 5, textImage.getHeight() * 5); // 將圖片擴大5倍 } catch (IOException e) { e.printStackTrace(); } //返回識別後的單個字符的值 return textImage; } }
編寫好以上代碼後,簡單測試一下接口是否可用。結果以下,說明接口可用,將main函數註釋瀏覽器
而後將項目導出爲Jarcookie
導出時設置如下選項,而且直接將jar包導出到Jmeter的ext路徑下session
新建測試計劃,在測試計劃中將jar包qingkeCode.jar添加進來。函數
添加BeanShell Sample,編寫如下腳本,腳本的功能爲導入jar包,而且識別路徑「D:\code\vcode_src\8.jpeg」中的圖片驗證碼的值。而且把值保存到了變量vcode中。工具
import qingkeCode.*; String code = "D:\\code\\vcode_src\\8.jpeg"; String d = PicToData.GetData(code); vars.put("vcode",d);
添加Debug Sample和察看結果樹,以便觀察運行結果。
運行腳本,察看運行結果。結果沒有報錯,而且輸出了路徑「D:\code\vcode\8.jpeg」中的圖片驗證碼的值,說明Java接口能夠調用。
獲取驗證碼圖片的GET請求,請求參數「d」是一個以毫秒爲單位的時間戳
http://www.qk365.com/security/captcha.do?d=1527660630370
還有一個接口是發送手機驗證碼的POST請求接口,包括請求頭和請求體
// 請求頭
http://www.qk365.com/security/sendMobileCode.do
// 請求體,captcha爲圖片驗證碼的值,func爲請求接口,mobile爲手機號
captcha=DYJE
func=register
mobile=18569845214
編寫獲取驗證碼的http請求
返回以下消息表示請求接口編寫成功
驗證碼圖片會保存在路徑「D:\code\vcode_src\」路徑下,文件名會以1到n的順序增加
這裏先測試一下運行一次的狀況,參數以下
運行結果,說明返回的驗證碼圖片進行了識別。後續只須要用這個識別的驗證碼進行獲取手機驗證碼的請求就能夠了。
獲取手機驗證碼時要帶上cookies和獲取圖片驗證碼返回的session值,這樣才能成功。要問這一點我怎麼知道的,是由於在編寫腳本時發現沒有帶這個值,或者這個值是錯的會返回錯誤信息,而後根據經驗,看到的~
獲取手機驗證碼腳本以下,其中${vceode}是驗證碼圖片識別中獲得的。
添加cookie請求頭把瀏覽器的值拷貝放入便可
使用正則表達式,在獲取驗證碼圖片中添加後處理,取出session,將取出的session放入獲取手機驗證碼的請求頭中
獲取session
session放入獲取手機驗證碼請求頭中
最後執行腳本,結果以下。後期能夠本身配置線程組中的參數進行接口壓力測試。
添加計數器,計算器的值就是圖片名稱
做者:西西的博客連接:https://www.jianshu.com/p/51bb8d6be280來源:簡書簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。