티스토리 뷰
들어가며
어벤져스 마지막 편이 나올 무렾
개발자들은 아이맥스를 그 누구보다 빠르게 예매하기 위해 예매 알리미를 만들게 된다.
그리고 아직도 텔레그램엔 용아맥(CGV 용산 아이맥스) 알림 봇도 따로 있다.
하지만 특별한 날 가고 싶은 이런 특별관에 대한 알림은 따로 없는 것 같았다.
특별관은 40명 정도의 인원만 예매가 가능한데, 크리스마스처럼 특별한 날에는 예매를 못할거 같은 삘이 왔다.
그래서 나도 한 번 간단하게 특별관 예매 알림 봇을 만들어 보기로 했다.
API 서버를 만들자
Back 쪽 API 통신할 수 있는 서버가 필요했고, 독학으로 끄적이고 있던 Node.js로 만들어보기로 했다.
하지만 급 많아진 회사일 + 공부와 병행하며 만들어야 하는 노드 등의 이유로 만드는 기간의 압박이 생겼다.
이대로는 직접 예매 확인하는거보다 느릴거 같아서 익숙한 JAVA로 눈을 돌렸다.
나름 공부도 하기 위해 현재 업무에서 사용하지 않는 조합으로 만들어보기로 했다.
(작업환경 : IntelliJ + Spring Boot + Gradle)
상영정보를 받아오자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
public class CgvApplication {
public static void main(String[] args) {
SpringApplication.run(CgvApplication.class, args);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
프로젝트를 만들면 스프링부트 어플리케이션을 돌릴 수 있는 Application.java 파일이 만들어진다.
여기에 스케줄링을 위해 약간의 설정을 추가한다.
@EnableScheduling
일정 시간마다 체크해주기 위해서 스케줄 어노테이션을 사용하려고 한다.
이를 위해서 실행되는 부분에 @EnableScheduling 추가해 '스케줄링을 사용할거야'라고 알려준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
@Service
public class TheaterService {
@PostConstruct
public void getMovieListAtCineNForet() {
try {
URL url = new URL("http://www.cgv.co.kr/common/showtimes/iframeTheater.aspx?areacode=01&theatercode=0001&date=20191225&screencodes=&screenratingcode=24");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
conn.disconnect();
} catch(Exception e) {
e.printStackTrace();
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
CGV에서 영화 상영 시간을 읽어올 서비스 클래스를 만들었다.
나는 크리스마스에 특별관인 씨네앤포레(CINE & Foret)를 이용하고 싶었기에 해당 상영시간표를 찾았다.
개발자도구로 상영시간표 부분을 확인해보면 다음과 같은 URL을 얻을 수 있다.
areaCode : 지역코드 (01 == 서울)
theaterCode : 영화관 코드 (0001 == 강변)
date : 날짜
screenratingCode : 영화관 내 상영관 코드(?) (24 == 씨네앤포레관)
@Service 객체 선언 후 @PostConstruct를 통해 서버 기동 시 실행되도록 세팅해준다.
HttpURLConnection 객체로 해당 사이트와 통신 후 해당 사이트의 html 소스를 한 줄 씩 가져온다.
이런 소스를 받아오게 되는데, 여기서 필요한 부분을 필터링 해주면 된다.
나는 25일 씨네앤포레에서 상영하는 영화의 예매가 떴는지 확인하고 싶었다.
URL을 통해 25일과 상영관에 대한 정보를 이미 GET 방식으로 넘겨줬기에 이 부분은 따로 필터링 할 필요는 없다.
하지만 원하는 일자에 대한 정보가 없으면 오늘 자 상영시간표로 리다이렉트 된다.
(ex. URL의 date 부분을 date=20191232 로 바꾸면 오늘 날짜에 대한 상영시간표 페이지가 뜬다.)
따라서 원하는 날짜가 상영 스케줄에 있는지 확인해야한다.
상영 스케줄은 위 처럼 되어있는데, 만들어 놓은 소스는 한 줄 씩 받아오기 때문에 "25</strong>"을 체크하기로 했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
boolean xmasFlag = false;
while ((line = br.readLine()) != null) {
System.out.println(line);
//25일이 떴는지 확인
if(line.contains("25</strong>")) {
xmasFlag = true;
continue;
//안떴으면 손절
} else if (!xmasFlag && line.contains("sect-guide")) {
break;
}
//떴으면 알림
if(line.contains("info-movie")) {
System.out.println("Give Me The Alert!!!");
break;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
"25</strong>" 포함된 라인이 있다면 25일의 상영스케줄을 조회할 수 있다는 뜻이다.
URL을 받아올 때, 위에서부터 차례로 읽어들이는데 25일이 포함되어 있지 않다면 굳이 아래의 데이터까지 읽을 필요가 없다고 생각했다.
따라서 해당 상영스케줄이 있는 div 블록(<div class="sect-schedule">)의 바로 다음 블록인 sect-guide(<div class="sect-guide">)에서 25일에 대한 정보가 없으면 더 이상 URL 데이터들을 받지 않도록 설정했다.
25일에 대한 정보가 있으면 continue를 통해 추가적으로 아래 데이터를 읽어온다.
데이터를 쭉 읽어오다가 "sect-showtimes" div 블록을 통해 영화가 떴는지 안떴는지 확인할 수 있다.
해당 블록 아래, 영화가 있으면 "info-movie", 없으면 "nodata" 라는 클래스명의 블록이 생긴다.
이걸로 영화리스트가 떴는지 알 수 있고, 영화가 떴을 때 알림메세지를 주면 끝!
'토이프로젝트' 카테고리의 다른 글
CGV 특별관 영화 예매 알림 봇 만들기 with 텔레그램 (3) (0) | 2019.12.27 |
---|---|
CGV 특별관 영화 예매 알림 봇 만들기 with 텔레그램 (2) (0) | 2019.12.26 |
코르도바(Apache Cordova) 사용기 (2) | 2019.04.20 |
- Total
- Today
- Yesterday
- 문자열 내 마음대로 정렬하기
- 쇠막대기
- 완주하지 못한 선수
- 기능개발
- 타겟 넘버
- 알고리즘
- cgv
- AWS
- 안드로이드 스튜디오
- 프로그래머스
- 예매 알림
- 텔레그램
- 스프링 부트
- 카카오인턴
- 객체지향과 디자인패턴
- FrogJmp
- 자바
- 최솟값
- 노션트렐로광고X
- 파이팅코리아
- json
- K번째수
- java
- 더 나은 내일
- API
- 124 나라의 숫자
- codility
- Spring
- 맵 api
- 다음 맵 api
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |