Skip to content

Instantly share code, notes, and snippets.

@cocoabox
Created March 7, 2025 06:51
Show Gist options
  • Save cocoabox/5c5ba12807ccb857c5820d6a405ae5f2 to your computer and use it in GitHub Desktop.
Save cocoabox/5c5ba12807ccb857c5820d6a405ae5f2 to your computer and use it in GitHub Desktop.
クロネコヤマト自動再配達依頼
#!/bin/bash
# ---
# クロネコヤマト自動再配達依頼
#
# usage : bash redliver.sh [伝票番号] [個人情報ENVファイル]
#
# ---
# 2025-03-07 : initial version
# ---
# 伝票番号
TRACKING_NUM="$1"
if [[ -z "$TRACKING_NUM" ]]; then
echo "need TRACKING_NUM" >&2
TRACKING_NUM="000000000000"
fi
# 個人情報
if [[ -f "$2" ]]; then
source "$2"
else
echo "using dummy personal information! please : $0 [TRACKING_NUMBER] [PERSONAL_INFO_ENV_FILE]" >&2
LAST_NAME="日本"
FIRST_NAME="花子"
TEL="08055550000"
POSTCODE="1000013"
STATE="東京都"
CITY="千代田区"
STREET_NAME="霞が関"
STREET_NUM="2丁目"
ADDRESS_STREET_NUM_BAN=1
ADDRESS_STREET_NUM_GOU=2
ADDRESS3="${ADDRESS_STREET_NUM_BAN}番地${ADDRESS_STREET_NUM_GOU}"
ADDRESS4=""
fi
# 再配達指示
MSG="ガースメータボックスにてお願いいたします"
# 00 = 対面
# 02 = 宅配BOX(未確認)
DELIVER_TO="00"
# 再配達希望日(YYYY-MM-DD 必須)
if [[ -z "$DATE" ]]; then
echo "env variable DATE is not set; using today" >&2
DATE=$( date +%Y-%m-%d )
fi
# 0099 = 以後在宅
# 1820 = 18~20時
DELIVER_TIME_CODE="0099"
# 以後在宅
# 18時~20時
DELIVER_TIME_STR="以後在宅"
set -e
num2weekday() {
case "$1" in
0) echo "" ;;
1) echo "" ;;
2) echo "" ;;
3) echo "" ;;
4) echo "" ;;
5) echo "" ;;
6) echo "" ;;
*) echo "Unknown weekday number: $1" >&2 ;;
esac
}
if [[ `uname` == "Darwin" ]]; then
DATE_YYYYMMDD=$( date -j -f "%Y-%m-%d" "${DATE}" +"%Y%m%d" )
WEEKDAY=$(num2weekday "$(date -j -f "%Y-%m-%d" "${DATE}" +"%w")" )
DATE_TEXT="$(date -j -f "%Y-%m-%d" "${DATE}" +"%m月%d日(${WEEKDAY})")$([[ "$(date -j -f "%Y-%m-%d" "${DATE}" +"%Y-%m-%d")" == "$(date +"%Y-%m-%d")" ]] && echo "(本日)")"
elif [[ `uname` == "Linux" ]]; then
DATE_YYYYMMDD=$( date -d "${DATE}" +"%Y%m%d" )
WEEKDAY=$(num2weeekday "$(date -j -f "%Y-%m-%d" "${DATE}" +"%u")" )
DATE_TEXT="$( date -d "${DATE}" +"%m月%d日(${WEEKDAY})")$([[ "$(date -d "${DATE}" +"%Y-%m-%d")" == "$(date +"%Y-%m-%d")" ]] && echo "(本日)")"
else
echo "Please set DATE_YYYYMMDD and DATE_TEXT" >&2
exit 1
fi
package_info_json=$(curl 'https://member.kms.kuronekoyamato.co.jp/api/receive_parcel/v1/getParcelDetailInfo' \
-# --compressed \
-X POST \
--data-raw "$(echo '
{"nmtJho":{"okjNo":"'${TRACKING_NUM}'","uktHasKbn":"01"},"ktuJho":{
"iriTs": "'$(date +"%Y-%m-%dT%H:%M:%S.000%z" | sed 's/\([+-][0-9]\{2\}\)\([0-9]\{2\}\)$/\1:\2/')'",
"tnmSbtCd":"1"}}
' | jq -r --ascii-output
)" \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:136.0) Gecko/20100101 Firefox/136.0' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Content-Type: application/json;charset=utf-8' \
-H 'X-SYSTEM-ID: NRC' \
-H 'X-PG_ID: NRCWBRP0610' \
-H 'X-PG-ID: NRCWBRP0610' \
-H 'Origin: https://member.kms.kuronekoyamato.co.jp')
nmt_id=$( echo "$package_info_json" | jq -r '.result .nmtJho .nmtId'
)
echo "nmt_id = $nmt_id" >&2
if [[ -z "$nmt_id" || "$nmt_id" == "null" ]]; then
echo "`tput setaf 1`Could not find your package using tracking number : $TRACKING_NUM`tput sgr0`" >&2
echo "$package_info_json" | jq >&2
exit 1
fi
asc_post_body="$(echo '{
"srcJho": {
"yno": "'${POSTCODE}'"
},
"ktuJho": {
"iriTs": "'$(date +"%Y-%m-%dT%H:%M:%S.000%z" | sed 's/\([+-][0-9]\{2\}\)\([0-9]\{2\}\)$/\1:\2/')'",
"tnmSbtCd": "1"
}
}' | jq --ascii-output -r)"
echo "$asc_post_body" | jq >&2
address_search_result_json=$(curl 'https://member.kms.kuronekoyamato.co.jp/api/member/v1/searchAddress?' \
--silent -X POST -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:136.0) Gecko/20100101 Firefox/136.0' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Content-Type: application/json;charset=utf-8' \
-H 'X-SYSTEM-ID: NRC' -H 'X-PG_ID: NRCWBRP0400' -H 'X-PG-ID: NRCWBRP0400' \
-H 'Origin: https://member.kms.kuronekoyamato.co.jp' \
-H 'Referer: https://member.kms.kuronekoyamato.co.jp/parcel/receive/change/datetime' \
--data-raw "$asc_post_body" )
address_search_code=$(echo "$address_search_result_json" | jq -r '
.result.stkKmkJhoLst[0].ktrJhoLst | .[] | select(
(.tdkNm=="'${STATE}'") and
(.skgCysNm=="'${CITY}'") and
(.oazTor=="'${STREET_NAME}'")
and (.azaCym=="'${STREET_NUM}'")
) | .cazCd
')
echo "address_search_code = $address_search_code" >&2
if [[ -z "$address_search_code" ]]; then
echo -e "Could not find your address using postcode : $POSTCODE ; while searching for : ${STATE} > ${CITY} > ${STREET_NAME}\n\n$(echo "$address_search_result_json" | jq )\n" >&2
exit 1
fi
post_body="$(echo '{
"uktHenTrkJho": {
"iriCd": "1",
"dnpNo": "'${TRACKING_NUM}'",
"tucYouNisKey": "",
"uktHenSniMtoSitKbn": "01",
"iriSyaUktHenKkuMlKboFlg": "0",
"scnHttKboBsyJho": {
"scnHttBsyCd": "'${DELIVER_TO}'",
"scnHttDay": "'${DATE_YYYYMMDD}'",
"scnHttJktCd": "'${DELIVER_TIME_CODE}'",
"scnHttDayNm": "'${DATE_TEXT}'",
"scnHttJktNm": "'${DELIVER_TIME_STR}'"
},
"httKboBsyJho": {},
"nmtId": "'${nmt_id}'",
"frCmntTxt": "'${MSG}'",
"digitalKeyFlg": "0",
"kdkKbn": "",
"iriSyaMlAdr": "",
"iriSyaSei": "'${LAST_NAME}'",
"iriSyaNm": "'${FIRST_NAME}'",
"iriSyaTel": "'${TEL}'",
"dstZipCd": "'${POSTCODE}'",
"dstAddress1": "'${STATE}'",
"dstAddress2": "'${CITY}${STREET_NAME}${STREET_NUM}'",
"dstAddress3": "'${ADDRESS3}'",
"dstAddress4": "'${ADDRESS4}'",
"dstMachiazaCd": "'${address_search_code}'",
"dstBanchiNo": "'${ADDRESS_STREET_NUM_BAN}'",
"dstGouNo": "'${ADDRESS_STREET_NUM_GOU}'"
},
"ktuJho": {
"iriTs": "'$(date +"%Y-%m-%dT%H:%M:%S.000%z" | sed 's/\([+-][0-9]\{2\}\)\([0-9]\{2\}\)$/\1:\2/')'",
"tnmSbtCd": "1"
}
}' | jq --ascii-output -c
)"
echo "$post_body" | jq >&2
curl -v 'https://member.kms.kuronekoyamato.co.jp/api/receive_parcel/v1/registChangeReceiveParcel?tnmSbtCd=1&' \
-X POST -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:136.0) Gecko/20100101 Firefox/136.0' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Content-Type: application/json;charset=utf-8' \
-H 'X-SYSTEM-ID: NRC' -H 'X-PG_ID: NRCWBRP0410' -H 'X-PG-ID: NRCWBRP0410' \
-H 'Origin: https://member.kms.kuronekoyamato.co.jp' \
-H 'Referer: https://member.kms.kuronekoyamato.co.jp/parcel/receive/change/datetime/confirm' --data-raw "$post_body"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment