임승현

Enable to Select the Movie filtered by the theater and the date

...@@ -96,10 +96,12 @@ public class CGVExample { ...@@ -96,10 +96,12 @@ public class CGVExample {
96 Scanner scanner = new Scanner(System.in); 96 Scanner scanner = new Scanner(System.in);
97 String url_movies = "https://www.cgv.co.kr/movies/?lt=1&ft=1"; //끝의 쿼리 0은 개봉 전 영화도 포함하는 것. 예매율 순위 가져오기 97 String url_movies = "https://www.cgv.co.kr/movies/?lt=1&ft=1"; //끝의 쿼리 0은 개봉 전 영화도 포함하는 것. 예매율 순위 가져오기
98 String url_theaters = "https://www.cgv.co.kr/theaters"; //영화관 정보 가져오는 링크. 98 String url_theaters = "https://www.cgv.co.kr/theaters"; //영화관 정보 가져오는 링크.
99 + String url_ticketing = "https://www.cgv.co.kr/ticket/"; //상영중인 영화 정보 가져오는 링크.
99 100
100 ArrayList<LinkedHashMap<String, String>> theaters = new ArrayList<>(); //지역별 영화관 HashMap(Key: 영화관, value:영화관별 고유코드)으로 이루어진 Arraylist 101 ArrayList<LinkedHashMap<String, String>> theaters = new ArrayList<>(); //지역별 영화관 HashMap(Key: 영화관, value:영화관별 고유코드)으로 이루어진 Arraylist
101 ArrayList<CGVMovieInfo> Movies = new ArrayList<>(); //CGVMovieInfo 클래스의 인스턴스들을 원소로 가지는 Arraylist 102 ArrayList<CGVMovieInfo> Movies = new ArrayList<>(); //CGVMovieInfo 클래스의 인스턴스들을 원소로 가지는 Arraylist
102 103
104 + // 여기부터 영화관 및 영화관별 고유코드 가져오는 부분.
103 try{ //드라이버 설정 105 try{ //드라이버 설정
104 System.setProperty(WEB_DRIVER_ID,WEB_DRIVER_PATH); 106 System.setProperty(WEB_DRIVER_ID,WEB_DRIVER_PATH);
105 }catch (Exception e){ 107 }catch (Exception e){
...@@ -109,15 +111,15 @@ public class CGVExample { ...@@ -109,15 +111,15 @@ public class CGVExample {
109 ChromeOptions options = new ChromeOptions(); //크롬 설정을 담은 객체 생성 111 ChromeOptions options = new ChromeOptions(); //크롬 설정을 담은 객체 생성
110 options.addArguments("headless"); //브라우저가 눈에 보이지 않고 컴파일러 내부에서 작동됨. 112 options.addArguments("headless"); //브라우저가 눈에 보이지 않고 컴파일러 내부에서 작동됨.
111 113
112 - WebDriver driver = new ChromeDriver(options); //위에서 설정한 옵션을 파라미터로 넘겨주고, 드라이버 객체 생성. 114 + WebDriver driver_theaters = new ChromeDriver(options); //위에서 설정한 옵션을 파라미터로 넘겨주고, 드라이버 객체 생성.
113 - driver.get(url_theaters); //WebDriver 객체를 해당 URL로 이동시킨다. 115 + driver_theaters.get(url_theaters); //WebDriver 객체를 해당 URL로 이동시킨다.
114 116
115 //브라우저 이동시 생기는 로드시간을 기다린다. 117 //브라우저 이동시 생기는 로드시간을 기다린다.
116 //HTTP 응답속도 보다 자바의 컴파일 속도가 더 빠르기 때문에 임의적으로 1초를 대기한다. 118 //HTTP 응답속도 보다 자바의 컴파일 속도가 더 빠르기 때문에 임의적으로 1초를 대기한다.
117 try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} 119 try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
118 120
119 //영화관 및 영화관에 대응되는 영화관별 고유 코드 가져오기. 121 //영화관 및 영화관에 대응되는 영화관별 고유 코드 가져오기.
120 - List<WebElement> area = driver.findElements(By.className("area")); 122 + List<WebElement> area = driver_theaters.findElements(By.className("area"));
121 for (WebElement elem : area) { 123 for (WebElement elem : area) {
122 LinkedHashMap<String, String> theaters_info = new LinkedHashMap<>(); 124 LinkedHashMap<String, String> theaters_info = new LinkedHashMap<>();
123 List<WebElement> theaters_by_area = elem.findElements(By.tagName("a")); 125 List<WebElement> theaters_by_area = elem.findElements(By.tagName("a"));
...@@ -130,12 +132,13 @@ public class CGVExample { ...@@ -130,12 +132,13 @@ public class CGVExample {
130 } 132 }
131 133
132 try { 134 try {
133 - driver.close(); //드라이버 연결 해제 135 + driver_theaters.close(); //드라이버 연결 해제
134 - driver.quit(); //프로세스 종료 136 + driver_theaters.quit(); //프로세스 종료
135 } catch (Exception e) { 137 } catch (Exception e) {
136 throw new RuntimeException(e.getMessage()); 138 throw new RuntimeException(e.getMessage());
137 } 139 }
138 140
141 + //여기부터 예매율 순위 가져오는 부분
139 Document doc_movies; 142 Document doc_movies;
140 try { 143 try {
141 doc_movies = Jsoup.connect(url_movies).get(); 144 doc_movies = Jsoup.connect(url_movies).get();
...@@ -179,9 +182,55 @@ public class CGVExample { ...@@ -179,9 +182,55 @@ public class CGVExample {
179 System.out.print("관람 일자를 입력하세요 : "); 182 System.out.print("관람 일자를 입력하세요 : ");
180 int date = scanner.nextInt(); 183 int date = scanner.nextInt();
181 184
185 + String otherFormat = String.format("THEATER_CD=%s&PLAY_YMD=%s", theaterCode, date);
186 + url_ticketing += ("?" + otherFormat);
187 +
188 + WebDriver driver_ticketing = new ChromeDriver();
189 + driver_ticketing.get(url_ticketing);
190 + try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
191 +
192 + WebElement selecting_area = driver_ticketing.switchTo().frame("ticket_iframe").findElement(By.className("theater-area-list"));
193 + List<WebElement> selected_areas_list = selecting_area.findElements(By.cssSelector("ul > li > a > span.name"));
194 +
195 + //지역 코드에 맞게 list element click
196 + selected_areas_list.get(regionCode).click();
197 + try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
198 +
199 + //선택한 지역에 대응되는 영화관 정보 가져오기
200 + WebElement selecting_theaters = selecting_area.findElement(By.cssSelector("ul > li.selected > div > ul"));
201 + List<WebElement> selected_theaters_list = selecting_theaters.findElements(By.tagName("li"));
202 +
203 + //프로그램 내부에서 가지고 있는 영화관코드와 웹에서 받아온 영화관코드가 일치하는 경우, selected_theaters_list element 클릭
204 + for(WebElement theater_element : selected_theaters_list) {
205 + if(theater_element.getAttribute("theater_cd").equals(theaterCode)){
206 + theater_element.click();
207 + try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
208 + break;
209 + }
210 + }
211 +
212 + //선택한 영화관에서, 선택한 일자에 상영하는 영화 목록 들고오기
213 + WebElement selecting_movies = driver_ticketing.findElement(By.className("movie-select"));
214 + List<WebElement> selected_movies_list = selecting_movies.findElements(By.cssSelector("#movie_list > ul > li"));
215 +
216 + //선택불가를 제외한 영화 제목 출력
217 + for(WebElement movie_element : selected_movies_list){
218 + String movie_enabled = movie_element.getAttribute("class");
219 + if(movie_enabled.endsWith("dimmed"))
220 + break;
221 + else
222 + System.out.println(movie_element.findElement(By.cssSelector("span.text")).getText());
223 + }
224 +
225 + try {
226 + driver_ticketing.close(); //드라이버 연결 해제
227 + driver_ticketing.quit(); //프로세스 종료
228 + } catch (Exception e) {
229 + throw new RuntimeException(e.getMessage());
230 + }
231 +
182 try{ 232 try{
183 - String otherFormat = String.format("&THEATER_CD=%s&PLAY_YMD=%s", theaterCode, date); 233 + Desktop.getDesktop().browse(new URI(Movies.get(inputRank - 1).getLink() + "&" + otherFormat));
184 - Desktop.getDesktop().browse(new URI(Movies.get(inputRank - 1).getLink() + otherFormat));
185 } 234 }
186 catch(IndexOutOfBoundsException | URISyntaxException | IOException e){ 235 catch(IndexOutOfBoundsException | URISyntaxException | IOException e){
187 System.out.println(e.getClass()); 236 System.out.println(e.getClass());
......