300x250
반응형
300x250
현재 개발중에 유용하게 사용중인 배송추적 API가 있어 소개드립니다.
저는 Java에서 따로 호출하여 사용중인데, JavaScript 페이지도 공유되어 있어서 올려드립니다.
제가 사용중인 Java code는 아래에 따로 추가했습니다.
출처 및 원글 : https://tracker.delivery/guide
링크형
배송조회 페이지를 팝업 형태를 띄우고 싶다면 아래와 같은 방식으로 코드를 넣으시면 됩니다.
<a href="https://tracker.delivery/#/:carrier_id/:track_id" target="_blank">배송조회</a>
API형
제공되는 웹 페이지를 이용하지 않고 Restful API에 직접 접근하여 데이터를 가져올 수 있습니다.
택배사 목록 조회 API
GET https://apis.tracker.delivery/carriers
[
{
"id": "de.dhl",
"name": "DHL",
"tel": "+8215880001"
},
{
"id": "jp.sagawa",
"name": "Sagawa",
"tel": "+810120189595"
},
{
"id": "jp.yamato",
"name": "Kuroneko Yamato",
"tel": "+810120189595"
},
{
"id": "jp.yuubin",
"name": "Japan Post",
"tel": "+810570046111"
},
{
"id": "kr.chunilps",
"name": "천일택배",
"tel": "+8218776606"
},
{
"id": "kr.cjlogistics",
"name": "CJ대한통운",
"tel": "+8215881255"
},
{
"id": "kr.cupost",
"name": "CU 편의점택배",
"tel": "+8215771287"
},
{
"id": "kr.cvsnet",
"name": "GS Postbox 택배",
"tel": "+8215771287"
},
{
"id": "kr.cway",
"name": "CWAY (Woori Express)",
"tel": "+8215884899"
},
{
"id": "kr.daesin",
"name": "대신택배",
"tel": "+82314620100"
},
{
"id": "kr.epost",
"name": "우체국 택배",
"tel": "+8215881300"
},
{
"id": "kr.hanips",
"name": "한의사랑택배",
"tel": "+8216001055"
},
{
"id": "kr.hanjin",
"name": "한진택배",
"tel": "+8215880011"
},
{
"id": "kr.hdexp",
"name": "합동택배",
"tel": "+8218993392"
},
{
"id": "kr.homepick",
"name": "홈픽",
"tel": "+8218000987"
},
{
"id": "kr.honamlogis",
"name": "한서호남택배",
"tel": "+8218770572"
},
{
"id": "kr.ilyanglogis",
"name": "일양로지스",
"tel": "+8215880002"
},
{
"id": "kr.kdexp",
"name": "경동택배",
"tel": "+8218995368"
},
{
"id": "kr.kunyoung",
"name": "건영택배",
"tel": "+82533543001"
},
{
"id": "kr.logen",
"name": "로젠택배",
"tel": "+8215889988"
},
{
"id": "kr.lotte",
"name": "롯데택배",
"tel": "+8215882121"
},
{
"id": "kr.slx",
"name": "SLX",
"tel": "+82316375400"
},
{
"id": "kr.swgexp",
"name": "성원글로벌카고",
"tel": "+82327469984"
},
{
"id": "nl.tnt",
"name": "TNT"
},
{
"id": "un.upu.ems",
"name": "EMS"
},
{
"id": "us.fedex",
"name": "Fedex"
},
{
"id": "us.ups",
"name": "UPS"
},
{
"id": "us.usps",
"name": "USPS"
}
]
배송 조회 API
GET https://apis.tracker.delivery/carriers/:carrier_id/tracks/:track_id
Example https://apis.tracker.delivery/carriers/kr.epost/tracks/1111111111111
{
"from": {
"name": "",
"time": ""
},
"to": {
"name": " ",
"time": " T00:00:00+09:00"
},
"state": {
"id": "information_received",
"text": "방문예정"
},
"progresses": [],
"carrier": {
"id": "1111111111111",
"name": "우체국 택배",
"tel": "+8215881300"
}
}
아래는 Java에서 사용하는 Method입니다
callLogAPI Method
/*
* 택배사 API 조회
* url : TRACKER_URL / carrier_id : tracker code / track_id : 송장번호
*
* https://apis.tracker.delivery/carriers/:carrier_id/tracks/:track_id
*
* */
public JSONObject callLogAPI(String carrierId , String trackId) {
//trackers HashMap<>은 택배사 정보와 코드를 넣어두었습니다
HashMap<String,String> trackers = tracker.getTrackerName();
String deliComName = trackers.get(carrierId);
//System.out.println(carrierId);
String responseBody = "";
JSONObject retVal = new JSONObject();
String apiURL = TRACKER_URL+carrierId+"/tracks/"+trackId.replaceAll("-", "");
responseBody = GETMethod(apiURL);
//System.out.println(responseBody);
JSONObject statusJson = new JSONObject(responseBody);
JSONObject carrierJson = new JSONObject();
JSONArray progressJson = new JSONArray();
//System.out.println(statusJson.toString());
String mess = statusJson.has("message") ? statusJson.get("message").toString() : "";
//내용이 없는 경우
if(!mess.equals("")) {
retVal.put("description", "보내시는 고객님께서 상품 발송 준비중입니다.");
retVal.put("deliveryWorker", "미정");
retVal.put("time", "미정");
retVal.put("location", "미정");
retVal.put("status", "발송준비");
retVal.put("carrierId", trackId);
retVal.put("company", deliComName);
//System.out.println("발송준비 com = " + deliComName);
JSONObject tempJson = new JSONObject(); //progressJson 대체
JSONObject tempJson2 = new JSONObject(); //progressJson 안의 stateJson 대체
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String datestr = format.format(Calendar.getInstance().getTime());
tempJson.put("description", "");
tempJson2.put("name", "발송준비");
tempJson.put("location", tempJson2);
tempJson.put("time", datestr);
tempJson2 = new JSONObject();
tempJson2.put("id", "at_packing");
tempJson2.put("text", "발송준비");
tempJson.put("status", tempJson2);
progressJson.put(tempJson);
retVal.put("allProgress", progressJson);
return retVal;
}
//Tracker API 결과값 확인
carrierJson = new JSONObject(statusJson.get("carrier").toString());
progressJson = new JSONArray(statusJson.get("progresses").toString());
statusJson = new JSONObject(statusJson.get("state").toString());
for(int i = 0 ; i < progressJson.length() ; i++ ) {
JSONObject initJson = progressJson.getJSONObject(i);
JSONObject stat = initJson.getJSONObject("status");
if(statusJson.get("id").equals(stat.get("id"))) {
String[] delBracketText = new String[2];
try {
delBracketText = deleteBracket(initJson.getString("description"));
stat = initJson.getJSONObject("location");
retVal.put("description", delBracketText[0] == null ? "" : delBracketText[0]);
retVal.put("deliveryWorker", delBracketText[1] == null ? "" : delBracketText[1]);
retVal.put("time", initJson.getString("time"));
retVal.put("location", stat.getString("name"));
retVal.put("company", deliComName);
retVal.put("allProgress", progressJson);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
retVal.put("status", statusJson.getString("text"));
retVal.put("carrierId", carrierJson.getString("id"));
//System.out.println("retval is = " + retVal);
return retVal;
}
배송기사 괄호정보만 따로 추출하는 Method
//괄호내 정보 제거 ( 배송기사 이름 및 전화번호 제거 )
static String[] deleteBracket(String text) throws Exception {
Matcher matcher = PATTERN_BRACKET.matcher(text);
String removeText = text;
String pureText = text;
String VOID = "";
PATTERN_BRACKET = Pattern.compile("\\([^\\(\\)]+\\)");
matcher = PATTERN_BRACKET.matcher(pureText);
while(matcher.find()) {
int startIndex = matcher.start();
int endIndex = matcher.end();
removeText = pureText.substring(startIndex, endIndex);
pureText = pureText.replace(removeText, VOID);
matcher = PATTERN_BRACKET.matcher(pureText);
}
String[] values = new String[2];
values[0] = pureText;
values[1] = removeText;
return values;
}
GET 호출을 하는 Method
private static String GETMethod(String apiUrl){
System.out.println(apiUrl);
try {
URL url = new URL(apiUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setDoInput(true);
int code = connection.getResponseCode();
if(code == 200) {
String api = readBodyAPI(connection.getInputStream());
return api;
}else {
return "{\"message\":\"보내시는 고객님께서 상품 발송 준비중입니다.\"}";
}
} catch (IOException e) {
throw new RuntimeException("API 요청과 응답 실패", e);
}
}
Response된 API 정보를 읽는 Method
private static String readBodyAPI(InputStream body){
InputStreamReader streamReader = new InputStreamReader(body);
try (BufferedReader lineReader = new BufferedReader(streamReader)) {
StringBuilder responseBody = new StringBuilder();
String line;
while ((line = lineReader.readLine()) != null) {
responseBody.append(line);
}
return responseBody.toString();
} catch (IOException e) {
throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
}
}
300x250
반응형
'Back-End > Spring' 카테고리의 다른 글
[JPA] 발생할 수 있는 여러 오류들 (0) | 2023.03.22 |
---|---|
[SpringBoot] Embedded Tomcat 세션 클러스터링 (1) | 2023.03.21 |
[SpringBoot] Unable to compile class for JSP / querydsl 의존성에 의한 JSP 컴파일 에러 (1) | 2023.03.10 |
[SpringBoot] Project에서 특정 Bean을 찾지 못하는 에러 (0) | 2023.03.02 |
[JPA] Spring Boot에서 다중 DB를 사용하기 (0) | 2023.03.02 |