diff --git a/pom.xml b/pom.xml index cb560f0..e40aee4 100644 --- a/pom.xml +++ b/pom.xml @@ -118,6 +118,24 @@ 3.14.0 + + org.jsoup + jsoup + 1.15.3 + + + + commons-httpclient + commons-httpclient + 3.1 + + + + + com.googlecode.json-simple + json-simple + 1.1 + diff --git a/src/main/java/com/itn/admin/cmn/msg/RestResponse.java b/src/main/java/com/itn/admin/cmn/msg/RestResponse.java new file mode 100644 index 0000000..fe1c1d3 --- /dev/null +++ b/src/main/java/com/itn/admin/cmn/msg/RestResponse.java @@ -0,0 +1,32 @@ +package com.itn.admin.cmn.msg; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class RestResponse { + + private String resultCode = "0"; + + private Object data; + + private LocalDateTime localDateTime = LocalDateTime.now(); + + /** + * 성공 생성자 + * 성공은 resultCode = 0 + */ + public RestResponse(Object data) { + this.data=data; + } + + + +} diff --git a/src/main/java/com/itn/admin/cmn/util/scheduled/ScheduledTasks.java b/src/main/java/com/itn/admin/cmn/util/scheduled/ScheduledTasks.java new file mode 100644 index 0000000..42aa762 --- /dev/null +++ b/src/main/java/com/itn/admin/cmn/util/scheduled/ScheduledTasks.java @@ -0,0 +1,32 @@ +package com.itn.admin.cmn.util.scheduled; + +import com.itn.admin.etc.crawling.morak.service.MorakService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +/** + * packageName : com.itn.mjonApi.cmn.Scheduled + * fileName : ScheduledTasks + * author : hylee + * date : 2023-08-28 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-08-28 hylee 최초 생성 + */ +@Service +public class ScheduledTasks { + + @Autowired + private MorakService morakService; + + @Scheduled(cron = "0 40 10 * * MON-FRI") + public void noonJob() throws IOException { + System.out.println("It's noon!"); + morakService.morakMenu(); + } +} diff --git a/src/main/java/com/itn/admin/cmn/util/slack/SlackUtil.java b/src/main/java/com/itn/admin/cmn/util/slack/SlackUtil.java new file mode 100644 index 0000000..0f2354a --- /dev/null +++ b/src/main/java/com/itn/admin/cmn/util/slack/SlackUtil.java @@ -0,0 +1,57 @@ +package com.itn.admin.cmn.util.slack; + + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.PostMethod; +import org.json.simple.JSONObject; + +import java.io.IOException; + +/** + * packageName : com.itn.mjonApi.util.slack + * fileName : Slack + * author : hylee + * date : 2023-08-28 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-08-28 hylee 최초 생성 + */ + +public class SlackUtil { + public static void sendMorakMenuToSlack(String sendMsg) { + + String url = "https://hooks.slack.com/services/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"; + HttpClient client = new HttpClient(); + PostMethod post = new PostMethod(url); + JSONObject json = new JSONObject(); + + try { + String munjaText = sendMsg; + json.put("channel", "모락메뉴api"); + + json.put("text", munjaText); +// json.put("icon_emoji", ":원하는 아이콘:"); //커스터마이징으로 아이콘 만들수도 있다! + json.put("username", "모락 메뉴"); + + + post.addParameter("payload", json.toString()); + // 처음에 utf-8로 content-type안넣어주니까 한글은 깨져서 content-type넣어줌 + post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + int responseCode = client.executeMethod(post); + String response = post.getResponseBodyAsString(); + if (responseCode != HttpStatus.SC_OK) { + System.out.println("Response: " + response); + } + + } catch (IllegalArgumentException e) { + System.out.println("IllegalArgumentException posting to Slack " + e); + } catch (IOException e) { + System.out.println("IOException posting to Slack " + e); + } finally { + post.releaseConnection(); + } + } +} diff --git a/src/main/java/com/itn/admin/etc/crawling/morak/service/MorakService.java b/src/main/java/com/itn/admin/etc/crawling/morak/service/MorakService.java new file mode 100644 index 0000000..0669e70 --- /dev/null +++ b/src/main/java/com/itn/admin/etc/crawling/morak/service/MorakService.java @@ -0,0 +1,22 @@ +package com.itn.admin.etc.crawling.morak.service; + + +import com.itn.admin.cmn.msg.RestResponse; + +import java.io.IOException; + +/** + * packageName : com.itn.mjonApi.etc.ganpandaum.service + * fileName : GdService + * author : hylee + * date : 2023-06-07 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-06-07 hylee 최초 생성 + */ +public interface MorakService { + RestResponse morakMenu() throws IOException; +// void morakMenu() throws IOException; +} diff --git a/src/main/java/com/itn/admin/etc/crawling/morak/service/impl/MorakServiceImpl.java b/src/main/java/com/itn/admin/etc/crawling/morak/service/impl/MorakServiceImpl.java new file mode 100644 index 0000000..7433f40 --- /dev/null +++ b/src/main/java/com/itn/admin/etc/crawling/morak/service/impl/MorakServiceImpl.java @@ -0,0 +1,109 @@ +package com.itn.admin.etc.crawling.morak.service.impl; + +import com.itn.admin.cmn.msg.RestResponse; +import com.itn.admin.cmn.util.slack.SlackUtil; +import com.itn.admin.etc.crawling.morak.service.MorakService; +import lombok.extern.slf4j.Slf4j; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.springframework.stereotype.Service; + +import java.sql.SQLOutput; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * packageName : com.itn.mjonApi.etc.ganpandaum.service.impl + * fileName : GdServiceImpl + * author : hylee + * date : 2023-06-07 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-06-07 hylee 최초 생성 + */ +@Service +@Slf4j +public class MorakServiceImpl implements MorakService { + + @Override + public RestResponse morakMenu() { +// public void morakMenu() { + String imgUrl = ""; + try { + while (true) { + // 웹사이트에 연결 + Document doc = Jsoup.connect("https://m.blog.naver.com/jh06200/223266997482") + .timeout(60000) // 타임아웃 시간을 60초로 설정 + .get(); + + // img가 있는 태그 가져오기 + Element mainDoc = doc.select(".se-component.se-image.se-l-default").first(); + // img에서 큰사이즈의 이미지 URL 가져오기 + imgUrl = mainDoc.select("img").attr("src"); + + imgUrl = imgUrl.replace("w80_blur", "w800"); + System.out.println("imgUrl : "+ imgUrl); + + // 현재 날짜와 비교 + // true면 오늘 날짜가 맞음 + System.out.println(" befor this.dateComparison(imgUrl) :: "+ this.dateComparison(imgUrl)); + if (this.dateComparison(imgUrl)) { + SlackUtil.sendMorakMenuToSlack(imgUrl); + System.out.println("this.dateComparison(imgUrl) :: "+ this.dateComparison(imgUrl)); + break; + } else { + // 11시 30분이 지났으면 break; + if (isCurrentTime1130()) { + break; + } + Thread.sleep(100000); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + + + return new RestResponse(imgUrl); + + } + + private boolean isCurrentTime1130() { + LocalTime now = LocalTime.now(); + LocalTime targetTime = LocalTime.of(11, 30); + return now.isAfter(targetTime); + } + + private Boolean dateComparison(String imgUrl) { + Boolean result = false; + // imgUrl에서 추출할 날짜 패턴 정수 8개 설정 + Pattern pattern = Pattern.compile("(\\d{8})"); + // 날짜 패턴 추출 + Matcher matcher = pattern.matcher(imgUrl); + + // 찾았으면 if true + if (matcher.find()) { + String extractedDate = matcher.group(1); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); + LocalDate dateFromText = LocalDate.parse(extractedDate, formatter); + LocalDate currentDate = LocalDate.now(); + + if (dateFromText.equals(currentDate)) { + result = true; + } + } else { + System.out.println("No date found in the text."); + } + + return result; + } + +} diff --git a/src/main/java/com/itn/admin/etc/crawling/morak/web/MorakController.java b/src/main/java/com/itn/admin/etc/crawling/morak/web/MorakController.java new file mode 100644 index 0000000..f2fd8a9 --- /dev/null +++ b/src/main/java/com/itn/admin/etc/crawling/morak/web/MorakController.java @@ -0,0 +1,49 @@ +package com.itn.admin.etc.crawling.morak.web; + +import com.itn.admin.cmn.msg.RestResponse; +import com.itn.admin.etc.crawling.morak.service.MorakService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * packageName : com.itn.mjonApi.etc.ganpandaum.web + * fileName : SendRestController + * author : hylee + * date : 2023-02-15 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-02-15 hylee 최초 생성 + */ + +// 치환문자가 있으면 , => §로 치환 + +@Slf4j +@RestController +public class MorakController { + + + @Autowired + private MorakService morakService; + + + /** + * + * @Discription 모락 메뉴 크롤링 컨트롤러 + * @return + */ + @CrossOrigin("*") // 모든 요청에 접근 허용 + @GetMapping("/etc/morak/morakMenu") + public ResponseEntity morakMenu() throws Exception { + return ResponseEntity.ok().body(morakService.morakMenu()); + } + + + + +}