前置p wang 驗簽腳本


import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.util.HTTPArgument;
import org.apache.jmeter.protocol.http.control.Header;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import java.net.URL;

class ParamUtils {
 ArrayList<String> values = new ArrayList<String>();
 long timestamp;

 ParamUtils(long timestamp) {
     this.timestamp = timestamp;
 }

 void put(String k, String v) throws Exception {
     if (k.isEmpty()) {
         return;
     }
     String value = URLEncoder.encode(v, "UTF-8");
     values.add(k + "=" + value);
 }

 ArrayList<String> sortedValues() {
     Collections.sort(values);
     return values;
 }

 void addGetParams(ArrayList<String> params) throws Exception {
     for (String param : params) {
         String[] keyValue = param.split("=", 2);
         put(keyValue[0], keyValue.length > 1 ? keyValue[1] : "");
     }
     sortedValues();
 }

 String getParams(String requestMethod, String requestBody, String queryString) throws Exception {
     
     if ("GET".equals(requestMethod)) {
         ArrayList<String> param = new ArrayList<String>();
         if (queryString != null && !queryString.isEmpty()) {
             String[] pairs = queryString.split("&");
             for (String pair : pairs) {
                 int idx = pair.indexOf("=");
                 put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), idx > 0 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : "");
             }
         }
         put("signTimestamp", String.valueOf(timestamp));
         addGetParams(param);
       }else if (Arrays.asList("POST", "PUT", "DELETE").contains(requestMethod)) {
         if (!requestBody.isEmpty()) {
             values.add("requestBody=" + requestBody);
         }
         put("signTimestamp", String.valueOf(timestamp));
     }
     
     return String.join("&", values);
 }
}

if (sampler instanceof HTTPSamplerProxy) {
 HTTPSamplerProxy currentSampler = (HTTPSamplerProxy) sampler;

 String url = currentSampler.getUrl().toString();
 log.info("獲取的完整請求: " + url);
 URL all_url_Path = new URL(url);
 String urlPath = all_url_Path.getPath();

 //String urlPath = currentSampler.getPath();
 log.info("獲取的 url部分: " + urlPath);

 String apiKey = vars.get("api_key");
 log.info("獲取的api_key: " + apiKey);
 String secretKey = vars.get("api_secret");
 log.info("獲取的api_secret: " + secretKey);
 String requestMethod = currentSampler.getMethod();
 log.info("獲取的 requestMethod: " + requestMethod);
 long timestamp = System.currentTimeMillis();

 String actualRequestBody = "";
 if (!"GET".equals(requestMethod)) {
     if (currentSampler.getPostBodyRaw()) {
         actualRequestBody = currentSampler.getArguments().getArgument(0).getValue();
     } else {
         StringBuilder requestBodyBuilder = new StringBuilder();
         for (HTTPArgument arg : (ArrayList<HTTPArgument>) currentSampler.getArguments().getArguments()) {
             if (requestBodyBuilder.length() > 0) {
                 requestBodyBuilder.append("&");
             }
             requestBodyBuilder.append(URLEncoder.encode(arg.getName(), "UTF-8"));
             requestBodyBuilder.append("=");
             requestBodyBuilder.append(URLEncoder.encode(arg.getValue(), "UTF-8"));
         }
         actualRequestBody = requestBodyBuilder.toString();
     }
 }

 ParamUtils paramUtils = new ParamUtils(timestamp);
 //String paramValue = paramUtils.getParams(requestMethod, actualRequestBody);


 // 獲取查詢字符串
 String queryString = all_url_Path.getQuery();
 // 修改getParams方法的調用,添加queryString參數(shù)
 String paramValue = paramUtils.getParams(requestMethod, actualRequestBody, queryString);


 String payload = requestMethod.toUpperCase() + "\n" + urlPath + "\n" + paramValue;

 try {
     Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
     SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA256");
     sha256_HMAC.init(secret_key);

     String signature = Base64.encodeBase64String(sha256_HMAC.doFinal(payload.getBytes("UTF-8")));
     vars.put("signature", signature);

     log.info("payload: " + payload);
     log.info("signature: " + signature);

     // 確保sampler具有非空的HeaderManager實例
     if (sampler.getHeaderManager() == null) {
         sampler.setHeaderManager(new HeaderManager());
     }
     sampler.getHeaderManager().clear();
     Header signatureHeader = new Header("signature", signature);
     sampler.getHeaderManager().add(signatureHeader);
     Header timeStampHeader = new Header("signTimestamp", String.valueOf(timestamp));
     sampler.getHeaderManager().add(timeStampHeader);
     Header contentHeader = new Header("Content-Type", "application/json");
     sampler.getHeaderManager().add(contentHeader);
     Header apiKeyHeader = new Header("key", apiKey);
     sampler.getHeaderManager().add(apiKeyHeader);
     log.info("==========添加后的請求頭" + sampler.getHeaderManager().toString());

 } catch (Exception e) {
     log.error("Error generating signature: " + e.getMessage());
 }
} else {
 log.warn("Sampler is not an instance of HTTPSamplerProxy.");
}



image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖诞吱,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逊桦,居然都是意外死亡粹舵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門戈泼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婿禽,“玉大人,你說我怎么就攤上這事大猛∨で悖” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵挽绩,是天一觀的道長膛壹。 經(jīng)常有香客問我,道長唉堪,這世上最難降的妖魔是什么恢筝? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮巨坊,結果婚禮上,老公的妹妹穿的比我還像新娘此改。我一直安慰自己趾撵,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布共啃。 她就那樣靜靜地躺著占调,像睡著了一般。 火紅的嫁衣襯著肌膚如雪移剪。 梳的紋絲不亂的頭發(fā)上究珊,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音纵苛,去河邊找鬼剿涮。 笑死言津,一個胖子當著我的面吹牛,可吹牛的內容都是我干的取试。 我是一名探鬼主播悬槽,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞬浓!你這毒婦竟也來了初婆?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猿棉,失蹤者是張志新(化名)和其女友劉穎磅叛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萨赁,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡弊琴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了位迂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片访雪。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掂林,靈堂內的尸體忽然破棺而出臣缀,到底是詐尸還是另有隱情,我是刑警寧澤泻帮,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布精置,位于F島的核電站,受9級特大地震影響锣杂,放射性物質發(fā)生泄漏脂倦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一元莫、第九天 我趴在偏房一處隱蔽的房頂上張望赖阻。 院中可真熱鬧,春花似錦踱蠢、人聲如沸火欧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苇侵。三九已至,卻和暖如春企锌,著一層夾襖步出監(jiān)牢的瞬間榆浓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工撕攒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陡鹃,地道東北人烘浦。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像杉适,于是被迫代替她去往敵國和親谎倔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容