https://github.com/juragi/KbQuick
국민은행 빠른조회를 통해 거래내역을 긁어오는 웹페이지를 만들 수 있다.
(될때도 있고 에러가 떠서 안될 때도 있다.)
이 기능을 사용하려면 우선 국민은행 빠른조회 서비스에 가입해야 한다.
나에게 가장 익숙한 Spring Framework를 통해 아주 간단하게 구성했다.
DB에 저장하는 것도 가능한데 아직은 구현하지 않았다.
하지만 그에 대비한 준비를 해두었다.
DB에 저장하려면 오래된 순으로 저장해야하기 때문에 Stack을 이용했다.
웹페이지에서 내용을 크롤링하기 위해 Jsoup을 이용했다.
그러기 위해서 pom.xml에 maven 추가가 필요하다.
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.1</version> </dependency>
컨트롤러에 다음과 같이 해당 페이지의 내용을 가져와서 적절하게 가공을 해준다.
Stack에 HashMap<String, Object> 를 넣어서 활용하는게 가장 바람직하다고 판단했다.
리스트 대신 스택에 넣은 이유는 나중에 데이터베이스에 저장할 때 오래된 거래내역이 먼저 insert 되도록 하기 위함이다.
빠른조회를 하면 최신순으로 정렬되기 때문에 최신 데이터를 먼저.... 더이상의 자세한 설명은 생략한다.
(참고로 날짜는 최근 1년간으로 설정했다.)
@RequestMapping(value="/bank", method=RequestMethod.POST) public @ResponseBody Stack<HashMap<String, Object>> bank(HttpServletRequest request){ String account = request.getParameter("account"); String id = request.getParameter("id").toUpperCase(); String password = request.getParameter("password"); Stack<HashMap<String, Object>> stack = new Stack<HashMap<String, Object>>(); try { Calendar today = Calendar.getInstance(); Calendar ago = Calendar.getInstance(); ago.add(Calendar.YEAR, -1); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Response response = Jsoup.connect("https://obank.kbstar.com/quics?asfilecode=524517") .method(Method.POST) .ignoreContentType(true) .data("계좌번호", account) .data("고객식별번호", id) .data("비밀번호", password) .data("빠른조회","Y") .data("응답방법","2") .data("조회구분","2") .data("USER_TYPE","02") .data("_FILE_NAME","KB_거래내역빠른조회.html") .data("_LANG_TYPE","KOR") .data("조회시작일",sdf.format(ago.getTime())) .data("조회종료일",sdf.format(today.getTime())) .execute(); Document document = response.parse(); Elements trs = document.select("tr[align]"); System.out.println(document); for(Element tr: trs) { Elements tds = tr.getElementsByTag("td"); HashMap<String, Object> transfer = new HashMap<String, Object>(); transfer.put("transfer_date", tds.get(0).text()); transfer.put("content",tds.get(1).text()); transfer.put("name", tds.get(2).text()); transfer.put("display", tds.get(3).text()); transfer.put("output", tds.get(4).text().replaceAll(",", "")); transfer.put("input", tds.get(5).text().replaceAll(",", "")); transfer.put("remain", tds.get(6).text().replaceAll(",", "")); transfer.put("bank", tds.get(7).text()); stack.push(transfer); } /*DB에 insert하기 * DB insert 할때는 중복을 피해야 한다는 것을 고려해야 한다. * 그래서 모든 자료를 push하지 않고 우선 db에 있는지 체크를 먼저 하고 없으면 insert한다. * 만약에 db에 이미 있는 자료라면 거기서 for문을 break 해주면 된다. * if(service.select(transfer) == 0) stack.push(transfer); * else break; * * Stack을 사용한 이유는 오래된 내역을 먼저 DB에 넣기 위함 * while(stack.size()>0) service.insert(stack.pop()); // 이런식으로 하나씩 insert 해준다. * */ } catch (IOException e) { e.printStackTrace(); } return stack; }
우선 이 예제에서는 DB에는 저장하지 않고 웹페이지에만 뿌리기로 했다. (DB저장의 여지는 남겨둔채)
다음과 같이 jsp 페이지를 구성한다.
계좌번호, 비밀번호, 인터넷뱅킹 아이디를 입력하면 표에 거래내역이 표시된다.
컨트롤러에서 Stack에 넣어서 ResponseBody로 보내는 것을 json으로 받을 수 있다.
json으로 받으면 아주 손쉽게 화면에 뿌릴 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container-fluid"> <h3>KB 국민은행 거래내역 조회</h3> <h5>조회를 위해 KB국민은행 빠른조회 가입이 필요합니다.</h5> <div class="col-md-4"> <form id="bankForm"> <div class="form-group"> <label for="example-text-input" class="col-2 col-form-label">계좌번호</label> <div class="col-10"> <input class="form-control" type="text" name="account" placeholder="계좌번호" required> </div> </div> <div class="form-group"> <label for="example-text-input" class="col-2 col-form-label">계좌비밀번호</label> <div class="col-10"> <input class="form-control" type="password" placeholder="계좌 비밀번호" autocomplete="off" name="password" required> </div> </div> <div class="form-group"> <label for="example-text-input" class="col-2 col-form-label">인터넷뱅킹 ID</label> <div class="col-10"> <input class="form-control" type="text" placeholder="인터넷뱅킹 ID" autocomplete="off" name="id" required> </div> </div> <button type="submit" class="btn btn-primary" id="autoButton">확인</button> </form> </div> <table class="table"> <thead> <tr> <th>거래일시</th> <th>이름</th> <th>입금금액</th> <th>출금금액</th> <th>잔액</th> <th>은행명</th> <th>입금방식</th> <th>통장표시</th> </tr> </thead> <tbody id='result'> </tbody> </table> </div> <script> $(document).ready(function(){ $("#bankForm").submit(function(event){ event.preventDefault(); $("#result").html(''); $.post("/bank", $(this).serialize(), function(data){ $.each(data, function(i, item){ var html = '<tr>'; html += '<td>'+item.transfer_date+'</td>'; html += '<td>'+item.name+'</td>'; html += '<td>'+item.input+'</td>'; html += '<td>'+item.output+'</td>'; html += '<td>'+item.remain+'</td>'; html += '<td>'+item.bank+'</td>'; html += '<td>'+item.content+'</td>'; html += '<td>'+item.display+'</td></tr>'; $("#result").append(html); }); }); }); }); </script> </body> </html>
참고문헌
'dev' 카테고리의 다른 글
[Python] 유튜브 동영상 다운받기 (youtube-dl) (0) | 2018.03.04 |
---|---|
[Git] .gitignore로 특정 폴더 커밋 제외시키기 (0) | 2018.02.26 |
[Java] 나눗셈 몫, 나머지 구하기 (0) | 2018.02.19 |
[Git] github Permission denied (publickey) 해결하기 (0) | 2018.02.10 |
[Java] Calendar, SimpleDateFormat 날짜 활용 (0) | 2018.02.10 |
[Spring] 스프링에서 쿼리 로그 찍기 (0) | 2018.01.26 |
[Spring] 컨트롤러에 json 데이터 전송하기 (0) | 2018.01.24 |
[Spring] 스케쥴러 사용 설정 (0) | 2018.01.20 |