jmeter使用beanshell完成签名计算,附与python代码对比
签名计算过程:
1.ticket计算:时间戳加+随机数字拼接后md5加密
2.组装公共参数+ticket+时间戳+业务参数
beanshell代码实现:
import java.util.*;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import java.util.Date;
import java.text.SimpleDateFormat;
import net.sf.json.JSONObject;
//net.sf.json.JSONObject 将Map转换为JSON方法
//获取shop_id
String shop_id=vars.get("ebai_shopId");
//log.info("shop_id1233:"+shop_id+"");
//获取时间戳
long timestamp=new Date().getTime();
vars.put("timestamp",timestamp+"");
//log.info("timestamp:"+timestamp+"");
//中文转unicode编码
public static String gbEncoding( String gbString) {
char[] utfBytes = gbString.toCharArray();
String unicodeBytes = "";
for (int i = 0; i < utfBytes.length; i++) {
String hexB = Integer.toHexString(utfBytes[i]);
if (hexB.length() <= 2) {
hexB = "00" + hexB;
}
unicodeBytes = unicodeBytes + "\\u" + hexB;
}
return unicodeBytes;
}
//md5加密方法
private static String getMD5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
// log.info("input:"+input+"");
byte[] messageDigest = md.digest(input.getBytes());
BigInteger number = new BigInteger(1, messageDigest);
String hashtext = number.toString(16);
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
return hashtext.toUpperCase();
} catch (NoSuchAlgorithmException e) {
throw null;
}
}
//获取ticket方法
public static String getTicket() {
final int random = new Random().nextInt(Integer.MAX_VALUE);
final String md5 = getMD5(String.valueOf(timestamp + random));
StringBuilder sb = new StringBuilder(md5);
// 在左起第8、12、16、20位字符后面添加减号,注意是针对md5
final StringBuilder result = sb.insert(8, "-").insert(13, "-").insert(18, "-").insert(23, "-");
return result.toString().toUpperCase();
}
//将时间戳转换为时间字符串年月日,时分秒
public static String stampToDate(String s){
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long lt = new Long(s);
Date date = new Date(lt);
res = simpleDateFormat.format(date);
return res;
}
//获取时间:年月日时间秒
String timestamp_str=timestamp+"";
String time_str=stampToDate(timestamp_str);
vars.put("time_str",time_str);
////获取ticket
String ticket=getTicket();
//公共请求参数
String data_str="data=";
String pub_request_data="&source="+shop_id+"&ticket="+ticket+"×tamp="+timestamp_str+"";
String secret_key="111";
//获取商家信息
//处理请求参数
Map commercialInfo_map=new HashMap();
commercialInfo_map.put("shop_id", shop_id) ;
JSONObject commercialInfo_str = JSONObject.fromObject(commercialInfo_map);
//log.info("commercialInfo_str:"+commercialInfo_str+"");
//1.组装请求参数
String request_data_commercialInfo=""+data_str+commercialInfo_str+pub_request_data+"";
vars.put("request_data_commercialInfo",request_data_commercialInfo);
//log.info("request_data_commercialInfo:"+request_data_commercialInfo+"");
//2.拼接加密字符串
String commercialInfo_Authorization=""+request_data_commercialInfo+secret_key+"";
//log.info("Authorization_commercialInfo:"+Authorization_commercialInfo+"");
//3.获取加密后的签名
String Authorization_commercialInfo=getMD5(commercialInfo_Authorization);
vars.put("Authorization_commercialInfo",Authorization_commercialInfo);
//log.info("Authorization_commercialInfo:"+Authorization_commercialInfo+"");
python代码实现:
# '''生成md5加密字符串'''
def md5_Encry(self, str_in,upper=None):
str_out = hashlib.md5() # 采用md5加密
str_out.update(str(str_in).encode(encoding='utf-8'))
md5=str_out.hexdigest()
if upper==True:
return md5.upper()
return md5
def str_to_time(self, time_to_str='1970-01-01 00:00:00'): # 字符串转换为时间戳
try:
if time_to_str=='1970-01-01 00:00:00':
time_to_str=self.time_to_str()
d = datetime.datetime.strptime(time_to_str, "%Y-%m-%d %H:%M:%S")
t = d.timetuple()
timeStamp = int(time.mktime(t))
# print(timeStamp)
return timeStamp
except Exception as error:
print("数据处理失败,原因为:\n%s" % (error))
def get_timestamp(self): # 输出当前时间的13位时间戳
current_milli_time = lambda: int(round(time.time() * 1000)) # 输出13位时间戳,round:对浮点数进行四舍五入
return str(current_milli_time())
# ticket计算
def kuaishou_ticket_calc(self):
random_int=random.randint(1,100)
md5_string=self.requestData.md5_Encry('{}{}'.format(self.timestamp,random_int),upper=True)
list_md5=list(md5_string)
list_md5.insert(8,'-'),list_md5.insert(13,'-'),list_md5.insert(18,'-'),list_md5.insert(23,'-')
ticket_str=''.join(list_md5)
# print(ticket_str)
return ticket_str # # 授权参数计算
def kuaishou_sign_calc(self,sign_data=None):
if sign_data==None:
# 将参数转换为dict并排序
str_dict = self.requestData.strToDict(self.public_data, space_one='=', space_two='&')
str_dict = self.requestData.sortedDict(str_dict)
# 将dict转换为str
sort_str = self.requestData.dictToStr(str_dict)
self.data='data={}&{}'.format(self.data,sort_str)
input_auth_str = '{}{}'.format(self.data,self.secret_key)
else:
input_auth_str=sign_data
print(input_auth_str)
auth_str=self.requestData.md5_Encry(input_auth_str,upper=True)
print(auth_str)
return auth_str # 获取商户信息与资质信息
def kuaishou_openshop_merchandiseInfo(self,data):
url=self.yaml['gld_api_host']+'/api/snack/open/kuaishou/commercial/info'
self.data=json.dumps(data)
self.headers['Authorization']=self.kuaishou_sign_calc()
requets=self.request.run_main('post',url=url,data=self.data,headers=self.headers)
print(json.dumps(requets,indent=2,ensure_ascii=False))
遇到得坑:中文需要进行unicode编码,不然一直提示签名错误,坑了我好久
计算签名时,python中的json.dumps方法会自动对json中得中文进行unicode编码,而beanshell中的hashmap转换为json对象时则不会,需要需要手动转换编码
不知道java中有没有类似json.dumps得方法,希望各位大佬支个招,能用更好得方式实现
jmeter使用beanshell完成签名计算,附与python代码对比的更多相关文章
- 利用JMeter的beanshell进行接口的加密处理
最近项目中在做http协议的接口测试,其中接口请求报文数据有个字段值需要用到加密后的签名,即出于网络传输过程中,对数据安全的考虑,要对请求的数据进行特定的处理(加密),再进行请求. 刚开始由于项目赶进 ...
- 记录jmeter使用beanshell断言获取复杂的json字符串参数值
实战示例 测试场景 电商系统经常会涉及到商品的库存数量的压测,在用户下单前需要先做库存余量的判断,当余量不足时用户无法下单,保证商品的有效售卖 库存余量查询响应结果 响应结果一般是json字符串的形式 ...
- JMeter中BeanShell实现写入文件
1.首先F:\test.txt文件为空
- jmeter之beanshell提取json数据
Jmeter BeanShell PostProcessor提取json数据 假设现有需求: 提取sample返回json数据中所有name字段对应的值,返回的json格式如下: {“body”:{“ ...
- jmeter通过BeanShell 脚本,实现对http请求参数的加密
jmeter一直是一款很好的接口和性能测试工具,它是开源的,不需要为此支付任何费用,而且可以下载源码,可以在修改源代码并在此基础上拓展自己的功能或插件,它可以跟ant和jenkins结合起来搭建自己的 ...
- jmeter BeanShell实例-----两个变量之间的断言对比
jmeter BeanShell实例-----两个变量之间的断言对比 在jmeter的中,断言没法对两个变量的进行对比后判断,只能使用Bean Shell断言来进行,总是有人来问怎么写呢.这里写一个简 ...
- JMeter中BeanShell的实际应用
使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比 很多时候我们需要把Response Data取到的 Json 字符串跟数据库里的对比,来验证接口的正确性,使用Be ...
- jmeter之beanshell取出需要参数,传递给下个请求
jmeter之beanshell取出需要参数,传递给下个请求 事件背景: 上周同事用jmeter录制脚本,录制成功回放后,并没有达到自己想要的结果. ps:他想从数据库取出某个字段值,然后对数据库做操 ...
- jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密
前提: eclipse.JDK.Jmeter 说明: 本文分为两部分进行配置说明 第一部分:编写JavaMD5加密脚本 第二部分:使用Jmeter的BeanShell进行验证 ************ ...
- Jmeter用BeanShell Sampler调用java写的jar包进行MD5加密
[前言] 在工作中,有时候我们请求的参数可能需要加密,比如登录接口中的密码做了加密操作,今天我就给大家介绍一种方法:Jmeter用BeanShell Sampler调用java写的jar包进行MD5加 ...
随机推荐
- 如何使用深度学习技术探测代码逻辑死循环 —— 浪潮集团的“公开号CN117271314A”专利
专利公开号: CN117271314A 新闻链接: https://mbd.baidu.com/newspage/data/landingsuper?context={"nid"% ...
- 在vscode中通过修改launch.json文件为项目添加环境变量——在launch.json文件中修改env变量
在vscode中launch.json文件具有十分重要的作用,在vscode中可以通过修改launch.json文件修改调试和运行代码时的设置. 本文假设已对vscode有初步了解,已可以创建laun ...
- SeaTunnel 发布成为 Apache 顶级项目后首个版本 2.3.2,进一步提高 Zeta 引擎稳定性和易用性
近日,Apache SeaTunnel 正式发布 2.3.2 版本.此时距离上一版本 2.3.1 发布已有两个多月,期间我们收集并根据用户和开发者的反馈,在 2.3.2 版本中对 SeaTunnel ...
- SMU Summer 2023 Contest Round 2
SMU Summer 2023 Contest Round 2 A. Treasure Hunt 当\(x1 - x2\)的差值与\(y1-y2\)的差值都能被\(x,y\)整除时,且商之和为2的倍数 ...
- grpc断路器之sentinel
荐
背景 为了防止下游服务雪崩,这里考虑使用断路器 技术选型 由于是springboot服务且集成了istio,这里考虑三种方案 istio hystrix sentinel 这里分别有这几种方案的对比 ...
- poi的excel导出
poi的excel导出 这个导出依赖于模板文件,可便捷设置表头样式. 也可以不使用模板,直接创建. 1.引入poi依赖 <dependency> <groupId>org.ap ...
- 2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。 你需要按照以下规则进行 n 次操作,将数组 nums 中的所有元素分配到两个新数组 arr1 和
2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n. 你需要按照以下规则进行 n 次操作,将数组 nums 中的所有元素分配到两个新数组 arr1 和 ...
- AD(Active Directory )域的搭建与操作
AD 域的搭建与操作 一.准备工作 准备好 VM 虚拟机和 Server 的安装包. 二.安装 Server 2022 选择标准且有图形界面的进行安装. 选择自定义安装方式. 为虚拟机 server2 ...
- 初三年后集训测试---T1排序
初三年后集训测试 $T 1 $ 排序 $$HZOI$$ ·题意: 给定 \(4n\) 个整数,求 : \[\max\{\sum_{i=1}^{4n}(A_{i,1} \times A_{i,2} - ...
- 在 Docker 中启动 Jupyter
参考:Jupyter Docker Stacks documentation 容器地址在 quay.io/jupyter/scipy-notebook 如果你直接运行命令: docker run -p ...