반응형

🚀

이제 날이 슬슬 추워지기 시작하는 것 같고 패딩도 좀 필요해서
무신사에서 숏 패딩 하나 구매나 할까 하고 좀 둘러봤습니다.

 

 

괜찮은 상품이 있어서 살려했는데 아쉽게도 L, XL 사이즈 모두 품절 ㅠ.ㅠ

재입고 알림 신청하려고 PC랑 App 모두 뒤져봤는데 찾기 실패.

구글링 해보니 확실히 재입고 알림 신청이 있긴 있는 것 같은데,,,,,

다른 상품들도 확인해보면서 재입고 알림 신청이 있는지 확인해보니
상품마다 있는 것도 있고 없는 것도 있어서, 상품마다 다르다고 결론을 내렸습니다!

 

아무튼 매번 무신사 앱에 들어가서 좋아요 탭에 있는 상품에 원하는 사이즈가 품절인지 확인하기 너무 귀찮을 것 같아서 node로 크롤링하고 내 폰으로 문자메시지를 보내는 프로그램을 만들어보고 싶었습니다.

원래는 유료 메시지 툴 하나 가입해서 1000원 정도 충전해놓고 node로 돌리다가 상품 재고가 들어오면 폰으로 문자 메시지 보내는 식으로 하려 했었는데 카카오 API에 메시지 전송 기능이 있다는 것을 알게 되어 문서를 읽어보고 카카오톡으로 나에게 메시지를 보낼 수 있도록 구현하였습니다.
(나에게 메시지 보낼 수 있는 메시지 수 한도는 하루 3만 건이라고 합니다.)
(나를 제외한 다른 사람에게 보내기는 인당 하루 100건에 총합 3만 건까지)

https://developers.kakao.com/docs/latest/ko/message/common

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

 

Node.js 크롤링

무신사 페이지에서 개발자 도구로 옵션 태그의 id를 알아내었고

 

해당 옵션에서 재고 관련 변수로 jaego_yn를 사용한다는 것을 알게 되었습니다.

const scheduler = require("node-schedule");
var cheerio = require("cheerio");
var request = require("request");

// API url
var url = "https://store.musinsa.com/app/goods/836816";

const schedule = scheduler.scheduleJob("*/2 * * * * *", function () {
  request(url, function (error, response, html) {
    if (error) {
      throw error;
    }

    var $ = cheerio.load(html);

    var S = $(".option1 option")[1];
    var M = $(".option1 option")[2];
    var L = $(".option1 option")[3];
    var XL = $(".option1 option")[4];

    console.log("====");
    console.log(S.attribs.value + " " + S.attribs.jaego_yn);
    console.log(M.attribs.value + " " + M.attribs.jaego_yn);
    console.log(L.attribs.value + " " + L.attribs.jaego_yn);
    console.log(XL.attribs.value + " " + XL.attribs.jaego_yn);

    if (XL.attribs.jaego_yn == "Y") {
      // 카톡으로 나에게 메시지 알림
      // ...

      // 스케쥴 종료
      schedule.cancel();
    }
  });
});

그리하여 request로 해당 값들을 가져왔고 XL.attribs.jaego_yn (XL의 재고)의 값이 'Y'가 되는 순간 카톡으로 나에게 알림을 보내고 스케줄을 종료하도록 하였습니다. 스케줄 같은 경우 request함수를 감싸 2초마다 실행되도록 하였는데, 10분에 한 번씩 돌아가도록 해도 무방할 것 같습니다. 

 

 

카카오톡 나에게 메시지 보내기

var request = require("request");
require("dotenv").config(); // .env 파일에서 환경변수 불러오기
const { accessToken } = process.env;
var headers = {
  "Content-Type": "application/x-www-form-urlencoded",
  Authorization: "Bearer " + accessToken,
};

var dataString = `template_object={
        "object_type": "text",
        "text": "테스트 메시지입니다!",
        "link": {
            "web_url": "https://developers.kakao.com",
            "mobile_web_url": "https://developers.kakao.com"
        },
        "button_title": "바로 확인"
    }`;

var options = {
  url: "https://kapi.kakao.com/v2/api/talk/memo/default/send",
  method: "POST",
  headers: headers,
  body: dataString,
};

function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log("메시지 전송 완료.");
  } else {
    console.log(error);
  }
}

request(options, callback);

액세스 토큰의 경우  env 파일에 숨김 처리하였습니다.

발급은 아래의 사이트에서 발급받으실 수 있습니다.

https://developers.kakao.com/tool/rest-api/open/post/v1-user-logout

 

카카오계정 로그인

여기를 눌러 링크를 확인하세요.

accounts.kakao.com

"developers-sample" 옆에 목록 클릭해서 내 애플리케이션으로 변경해주셔야 합니다.

 

토큰을 발급받기 전에 오른쪽 상단 바에 "내 애플리케이션"을 클릭하셔서 하나를 만드셔야 하고

카카오톡 로그인 - 동의 항목 - 카카오톡 메시지 전송 => 선택 동의를 해주셔야 합니다.

이것 외에도 인증 관련해서 오류들이 되게 많았었는데
요기 포럼에서 검색해보면 대부분 해결 가능할 것이라 생각됩니다.

https://devtalk.kakao.com/

 

카카오 데브톡

카카오 데브톡. 카카오 플랫폼 서비스 관련 질문 및 답변을 올리는 개발자 커뮤니티 사이트입니다.

devtalk.kakao.com

 

 

📋 main.js 전체 코드

const scheduler = require("node-schedule");
var cheerio = require("cheerio");
var request = require("request");
var request = require("request");
require("dotenv").config(); // .env 파일에서 환경변수 불러오기
const { accessToken } = process.env;
var headers = {
  "Content-Type": "application/x-www-form-urlencoded",
  Authorization: "Bearer " + accessToken,
};

// API url
var url = "https://store.musinsa.com/app/goods/836816";

const schedule = scheduler.scheduleJob("*/5 * * * * *", function () {
  request(url, function (error, response, html) {
    if (error) {
      throw error;
    }

    var $ = cheerio.load(html);

    var S = $(".option1 option")[1];
    var M = $(".option1 option")[2];
    var L = $(".option1 option")[3];
    var XL = $(".option1 option")[4];

    console.log("====");
    console.log(S.attribs.value + " " + S.attribs.jaego_yn);
    console.log(M.attribs.value + " " + M.attribs.jaego_yn);
    console.log(L.attribs.value + " " + L.attribs.jaego_yn);
    console.log(XL.attribs.value + " " + XL.attribs.jaego_yn);

    if (XL.attribs.jaego_yn == "Y") {
      var dataString = `template_object={
            "object_type": "text",
            "text": "XL 사이즈 품목이 재입고 되었습니다.",
            "link": {
                "web_url": "https://developers.kakao.com",
                "mobile_web_url": "https://developers.kakao.com"
            },
            "button_title": "바로 확인"
        }`;

      var options = {
        url: "https://kapi.kakao.com/v2/api/talk/memo/default/send",
        method: "POST",
        headers: headers,
        body: dataString,
      };

      function callback(error, response, body) {
        if (!error && response.statusCode == 200) {
          console.log("[XL 사이즈 품목이 재입고] 메시지 전송 완료.");
        } else {
          console.log(error);
        }
      }

      request(options, callback);

      schedule.cancel();
    } else if (XL.attribs.jaego_yn == "N") {
      var dataString = `template_object={
            "object_type": "text",
            "text": "XL 사이즈 품절",
            "link": {
                "web_url": "https://developers.kakao.com",
                "mobile_web_url": "https://developers.kakao.com"
            },
            "button_title": "바로 확인"
        }`;

      var options = {
        url: "https://kapi.kakao.com/v2/api/talk/memo/default/send",
        method: "POST",
        headers: headers,
        body: dataString,
      };

      function callback(error, response, body) {
        if (!error && response.statusCode == 200) {
          console.log("[XL 사이즈 품절] 메시지 전송 완료.");
        } else {
          console.log(error);
        }
      }

      request(options, callback);
    }
  });
});

👨🏻‍💻 결과

 

 

궁금하신 점이나 질문있으시면 댓글 환영입니다!

 

 

🔗 Github Link

https://github.com/K-Junyyy/MUSINSA-CRWALING

 

GitHub - K-Junyyy/MUSINSA-CRWALING

Contribute to K-Junyyy/MUSINSA-CRWALING development by creating an account on GitHub.

github.com

 

반응형

+ Recent posts