lewisleedev / thecampy

더캠프 인터넷편지 파이썬 라이브러리
https://pypi.org/project/thecampy/
MIT License
22 stars 4 forks source link

인터넷 편지가 전송되지 않습니다 #14

Closed calofmijuck closed 2 years ago

calofmijuck commented 2 years ago

이슈 내용 및 재현 방법

에러 분석

Traceback (most recent call last):
  File "/Users/zxcvber/dev/living-life/env/lib/python3.9/site-packages/requests/models.py", line 910, in json
    return complexjson.loads(self.text, **kwargs)
  File "/opt/homebrew/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/opt/homebrew/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/opt/homebrew/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/zxcvber/dev/living-life/test/run.py", line 15, in <module>
    resp = client.get_soldier(SOLDIER)
  File "/Users/zxcvber/dev/living-life/env/lib/python3.9/site-packages/thecampy/client.py", line 124, in get_soldier
    if not r.json():
  File "/Users/zxcvber/dev/living-life/env/lib/python3.9/site-packages/requests/models.py", line 917, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: [Errno Expecting value]
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta
      name="viewport"
      content="user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, width=device-width, target-densitydpi=medium-dpi"
    />
    <meta name="robots" content="all" />
    <meta name="format-detection" content="telephone=no" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <title>error</title>
    <meta name="format-detection" content="telephone=no" />
    <meta name="apple-mobile-web-app-capable" content="yes" />

    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width" />
    <meta name="apple-mobile-web-app-title" content="THECAMP" />
    <meta name="robots" content="index,nofollow" />
    <meta name="description" content="대국민 국군 소통 서비스" />
    <meta property="og:title" content="더캠프" />
    <meta property="og:url" content="https://www.thecamp.or.kr/" />
    <meta
      property="og:image"
      content="https://www.thecamp.or.kr/images/thecamp.png"
    />
    <meta property="og:description" content="대국민 국군 소통 서비스" />
    <meta name="twitter:card" content="summary" />
    <meta name="twitter:title" content="THECAMP" />
    <meta name="twitter:url" content="https://www.thecamp.or.kr/" />
    <meta
      name="twitter:image"
      content="https://www.thecamp.or.kr/images/thecamp.png"
    />
    <meta name="twitter:description" content="대국민 국군 소통 서비스" />

    <link rel="icon" type="image/x-ico" href="/images/favicon.ico" />
    <link rel="shortcut icon" type="image/x-ico" href="/images/favicon.ico" />
    <!-- CSS Library -->
    <link href="/css/jquery-ui.min.css" rel="stylesheet" />
    <link rel="stylesheet" type="text/css" href="/css/ax5grid.css" />
    <link rel="stylesheet" type="text/css" href="/css/import.css" />
    <link rel="stylesheet" href="/css/swiper.min.css" />
    <!-- CSS Custom -->

    <!-- Google Tag Manager -->
    <script>
      (function (w, d, s, l, i) {
        w[l] = w[l] || [];
        w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" });
        var f = d.getElementsByTagName(s)[0],
          j = d.createElement(s),
          dl = l != "dataLayer" ? "&l=" + l : "";
        j.async = true;
        j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
        f.parentNode.insertBefore(j, f);
      })(window, document, "script", "dataLayer", "GTM-K8M7CTD");
    </script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script
      async
      src="https://www.googletagmanager.com/gtag/js?id=UA-115500731-5"
    ></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag() {
        dataLayer.push(arguments);
      }
      gtag("js", new Date());

      gtag("config", "UA-115500731-5");
    </script>

    <script
      data-ad-client="ca-pub-6575005971712756"
      async
      src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"
    ></script>

    <script type="text/javascript">
      var PAGE_CONTEXT = "";
      var sCdnFileSrcUrl = "https://contents.thecamp.or.kr";
      var serverMode = "real";

      var sVideoCommCd = "0000210001";
      var sImageCommCd = "0000210002";
      var sFileCommCd = "0000210003";
    </script>

    <!-- Javascript Library -->
    <script src="/js/lib/jquery-1.8.2.min.js"></script>
    <script src="/js/lib/jquery-ui.min.js"></script>
    <script src="/js/lib/ax5core.min.js"></script>
    <script src="/js/lib/ax5grid.min.js"></script>
    <script src="/js/lib/moment.min.js"></script>
    <script src="/js/lib/handlebars.min.js"></script>

    <!-- Javascript Custom -->
    <script src="/js/CommonUtil.js"></script>
    <script src="/js/CommonError.js"></script>
    <script src="/js/comUi.js"></script>
    <script src="/js/CodeMgr.js"></script>
    <script src="/js/ThumbSizeMgr.js"></script>
    <script src="/js/handlebarsHelpers.js"></script>
    <script src="/js/MobilePagingUtil.js"></script>

    <script type="text/javascript">
      $(document).ready(function () {});

      //CDN 업로드 파일 full url 세팅
      function fn_getFileSrcUrl(obj) {
        var cdnServerMode = "d";

        if (serverMode == "real") {
          cdnServerMode = "p";
        } else if (serverMode == "stg") {
          cdnServerMode = "s";
        }

        var sFileType = obj.fileTypeCd;
        var sImageThumbnailSize = "";

        if (obj.filePath == "") {
          return "";
        }

        var sFilePath = sCdnFileSrcUrl + obj.filePath + obj.savedFileNm;

        if (
          obj.extNm != null &&
          obj.extNm != "" &&
          typeof obj.extNm != "undefined"
        ) {
          sFilePath += "." + obj.extNm;
        }

        if (sFileType == sImageCommCd) {
          if (
            obj.thumb == null ||
            obj.thumb == "" ||
            typeof obj.thumb == "undefined"
          ) {
            sImageThumbnailSize = thumbSizeMgr.defaultOriginSize;
          } else {
            sImageThumbnailSize = obj.thumb;
          }

          sFilePath += "?d=" + sImageThumbnailSize + "&s=" + cdnServerMode;
        } else {
          sFilePath += "?s=" + cdnServerMode;
        }

        return sFilePath;
      }
    </script>
  </head>

  <body class="wrap">
    <a href="javascript:nativeUtil.goBack();" class="btn-page-pre"></a>
    <h1></h1>
    <!--       <a href="#" class="btn-page-close"></a> -->
    <!-- container-wrap -->
    <div class="container-wrap ty02">
      <section class="section">
        <!-- group -->
        <div class="group">
          <div class="error-wrap">
            <div class="error-img">
              <span>
                <img src="/images/content/error.png" alt="505 에러" />
              </span>
            </div>
            <div class="error-tit">일시적인 오류가 발생하였습니다.</div>
            <div class="error-txt">
              서비스 이용에 불편을 드려 죄송합니다.<br />
              잠시 후 다시 이용해 주세요.
            </div>
          </div>
        </div>
        <!-- //group -->
      </section>
    </div>
    <!-- //container-wrap -->

    <div class="btn-b-area">
      <a href="/main/viewWebMain.do">메인으로</a>
      <!--  비활성화 class="disabled" -->
    </div>
  </body>
</html>
: 1

트러블슈팅

{"resultCd":"0000","resultMsg":"정상처리되었습니다."}

일단 제가 파악한 부분은 여기까지입니다. 혹시나 잘못된 내용이 있을 수 있으니 thecampy 개발자 분들께 확인을 부탁드립니다.

chunccc1004 commented 2 years ago

혹시 괜찮으시다면 traineeRelationshipCd parameter 추가한 코드 공유주실 수 있으신가요??ㅠㅠ

lewisleedev commented 2 years ago

혹시 괜찮으시다면 traineeRelationshipCd parameter 추가한 코드 공유주실 수 있으신가요??ㅠㅠ

parameter를 추가해도 당장은 작동하지 않을겁니다. 단순히 카페등록을 못하는게아니라 기존처럼 훈련병 식별번호를 return하지 않도록 더캠프 내부 시스템이 바뀐 것이 근본적인 문제입니다.

현재 해결방법을 찾고있는 중이지만 시간이 좀 걸릴 것 같습니다.

chunccc1004 commented 2 years ago

넵 ㅠㅠ 안그래도 방금 파라미터 넣고 확인해봤는데, 작동 안하길래 파라미터를 잘못 넣었나했는데 다른 문제였군요ㅠㅠㅠ

답변 주셔서 너무 감사합니다!!

2022년 2월 10일 (목) 오후 10:55, Lewis Lee @.***>님이 작성:

혹시 괜찮으시다면 traineeRelationshipCd parameter 추가한 코드 공유주실 수 있으신가요??ㅠㅠ

parameter를 추가해도 당장은 작동하지 않을겁니다. 단순히 카페등록을 못하는게아니라 기존처럼 훈련병 식별번호를 return하지 않도록 더캠프 내부 시스템이 바뀐 것이 근본적인 문제입니다.

현재 해결방법을 찾고있는 중이지만 시간이 좀 걸릴 것 같습니다.

— Reply to this email directly, view it on GitHub https://github.com/lewisleedev/thecampy/issues/14#issuecomment-1034950439, or unsubscribe https://github.com/notifications/unsubscribe-auth/AMU6CJKDNPW24RID46DYEZTU2O7WZANCNFSM5N4D6DGQ . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

You are receiving this because you commented.Message ID: @.***>

Luavis commented 2 years ago

mobile 주소를 이용하면 뚫리는것 확인했습니다.

https://mobile.thecamp.or.kr/main/cafeCreateCheckA.do

calofmijuck commented 2 years ago

와... 어떻게 찾으셨어요...?

Luavis commented 2 years ago

친구가 가있고 저도 곧 갈 예정이라 좀 성심성의를 다해서 찾았습니다...ㅠㅜㅠㅜ 혹여 이 방법이 막혀도 아래 위문편지를 한통 보내면 위문편지함에 쌓이는데 이 번호를 파싱해오면 될것 같습니다.

image

Luavis commented 2 years ago

FYI: 위 키를 알아내시면 임시방편으로는 soldier 객체에 soldier.soldier_code = 1557355를 입력하고 편지보내면 보내지는것 까지 확인해봤습니다~

lewisleedev commented 2 years ago

모바일 주소로 가능한지 확인 후 반영하겠습니다.

@Luavis 님이 말씀하신 HTML에서 가져오는 방법은 옵션중 하나였지만 깔끔한 방법이 아니라 고민중이었는데 다행입니다 😊 다만 언제 또 막힐진 두고 봐야 할 것 같네요 ㅠ

bighugefoot commented 2 years ago

@Luavis 안녕하세요 알려주신 mobile 주소를 가지고 어디를 수정하면 될까요? 알려주시면 정말감사드리겠습니다 ㅠ 일주일 동안 고생하고있네요..

calofmijuck commented 2 years ago

@bighugefoot 해보지는 않았는데 여기일 것 같습니다! https://github.com/lewisleedev/thecampy/blob/af91f1d121ccced1c0eebc96d2cca1b52cfbdc05/thecampy/client.py#L104

Luavis commented 2 years ago

@calofmijuck 말씀처럼 위 부분으로 보이고 host를 바꿔야 하지 않을까 싶습니다.

lewisleedev commented 2 years ago

mobile 주소 변환도 이제 더 이상 작동하지 않는 것으로 보입니다 앞서 말한 것처럼 웹에서 코드를 받아와야 할 것 같은데.. 추가적인 분석이 필요할 것 같습니다..

근시일내에 패치하도록 하겠습니다.

calofmijuck commented 2 years ago

@lewisleedev 고생많으십니다...

lewisleedev commented 2 years ago

여러 테스트를 해본 결과, 메시지를 보내는 것은 크게 달라진 것이 없습니다. 다만 카페개설확인이 정상처리되었다는 response만 보내고 정작 페이지에선 확인이 되지 않는 문제가 지속적으로 발생합니다.

일단은 추가가 되고 카페 가입까지 완료된 상태에서 beautifulsoup을 통해 훈련병 코드를 받아오는 방법을 사용해 해결했습니다. 다만 인편 특성상 완전 자동으로 유지할 수 있으면 좋겠다는 바람입니다. 해당 버젼은 4.0.0a로 pre-release로 릴리즈했습니다. 추가적으로 분석 후에 정식 릴리즈 하겠습니다.

이 이슈는 닫겠습니다. 추가로 버그가 있다면 새 이슈에 알려주세요.