脚本用来测试公司带签名的接口,只要给出原始的url即可,脚本会自动对给定的url解码,
然后重新生成app_token 和签名:
贴出脚本前,先退出两个shell小脚本,分别对url encode和decode
#/**** URL encode
function die () {
echo >&2 "$@"
exit 1
}
urlencode() {
# urlencode <string>
old_lang=$LANG
LANG=C
#LANG=zh_CN.utf8
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
#LC_COLLATE=zh_CN.utf8
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
LANG=$old_lang
LC_COLLATE=$old_lc_collate
}
urlencode "$1"
#/******
###URL decode脚本
urldecode() {
# urldecode <string>
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
urldecode "$1"
/**********************************测试带签名的接口脚本******************************************/
#!/bin/bash
#According to url specified url ,then re-gennerating the token and signture of url
#only for app of taotao ling on testing evirnment
app_id='bcc1cf2e-b376-11e5-921c-fcaa1490ccaf'
private_key='690b98fcb37711e5921cfcaa1490ccaf717130d1b37711e5921cfcaa1490ccaf'
get_TokenAndSign_Url='http://t-appportal.meitianhui.com/openapi/app/login'
##开始之前先判断主要的工具是否安装,没有安装在安装或给与提示
if test -z `rpm -qa|grep 'jq-'`;then
echo "jq 工具没有安装,通过yum install -y jq-* 安装"
exit 3
fi
if test -z `rpm -qa|grep '^curl-'`;then
echo "curl 工具没有安装,通过yum install -y curl-* 安装"
exit 4
fi
url=$1
if [ $# -ne 1 ];then
echo '输入测试URL,URL使用单引号括起来'
exit 0
fi
uri=`echo $url|awk -F '?' '{print $1}'`
params=`echo $url|awk -F '?' '{print $2}'`
###url 解码函数
urldecode() {
# urldecode <string>
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
params=`urldecode "$params"`
res_code=`http --form POST $get_TokenAndSign_Url app_id=$app_id private_key=$private_key|jq .rsp_code|sed 's/"//g'`
if [ $res_code != 'succ' ];then
echo 'response error!'
exit 1
fi
app_token=`http --form POST $get_TokenAndSign_Url app_id=$app_id private_key=$private_key|jq .data.app_token|sed 's/"//g'`
security_code=`http --form POST $get_TokenAndSign_Url app_id=$app_id private_key=$private_key|jq .data.security_code|sed 's/"//g'`
#通过awk 把键值对分离出来,然后剔除app_token和sign的键值对,并对剩下的键值对排序,然后通过paste -d '&' -s
#指定分隔符重新连接一行,前面把app_token 剔除掉了,这里通过 awk 的END 功能,把app_token 值附件到最后,
#并参与排序,awk 中使用变量非常麻烦,awk 大括号里面不能使用单引号了,这里先使用双引号,然后单引号,
#最后在套一层双引号
# sort_str=`echo $params|awk -F '&' '{for(i=1;i<NF;i++) if($i !~ /sign|app_token/)print $i} END {print "'app_token='""'"$app_token"'"}'|sort|paste -d '&' -s`
(上面通过awk分割,awk对{} 有特殊意义,对有大括号的传参会导致问题)
下面提供一种通用的分割方式:
sort_str=$(echo -e ${params//&/\\n}|grep -v sign|sort|paste -d '&' -s)
使用字符串替换方式${params//&/\\n} 使用\n 替换字段串中的& 然后通过echo -e 解析出换成,然后各个传参换行,然后通过sort 排序,最后再通过paste 使用& 拼接
#签名也可以使用|openssl md5 结果也是一样的,不过一定要去掉结尾的$(换行)符号
sign=`echo -n "$sort_str$security_code"|md5sum|awk '{print $1}'`
#new_params=`echo $params|awk -F '&' '{for(i=1;i<NF;i++) if($i !~ /sign|app_token/)print $i}'|xargs|sed "s/'//g"`
#http --form POST $new_params app_token=$app_token sign=$sign
curl -d "$sort_str&sign=$sign" $uri
echo -e "\n"
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!