재입고 알림 봇 만들기(python + telegram bot)

Update 2020-02-02

개발환경 만들기 부터 다루는 상세한 포스트를 만들고 있습니다.

개발환경 만들기

발단

일시품절!!

사고 싶은 물건이 있는데 게다가 돈도 있는데! 재고가 없는 경우가 있습니다. 하루에도 몇 번씩 사이트에 들러 확인을 하곤 하죠. 그런 물건이 10개쯤 되면 매번 체크하기 번거롭겠죠. 사이트에서 재입고 알림 서비스를 해주면 좋겠지만 없는 경우가 많습니다.
간단하게 스크래핑을 하고 챗봇을 만들어 구매가 가능해지면 메시지를 주도록 만들어 보았습니다.

스크래핑

스크래핑은 사이트마다 달라질 수 밖에 없습니다. 이번에 노린 물건은 레고 아이디어 프렌즈 입니다. 레고 사이트를 분석해 봅시다.

브라우저에서 개발자 도구를 켜고 “일시품절” 이라고 써진걸 선택합니다. 다음으로 “구매가능”한 아이템을 선택하고 DOM 탐색기에서 선택을 해줍니다.

  • 품절인 경우
  • 구매 가능한 경우

대략 보니 p 태그에 data-test 속성이 product-overview-availability 인 것을 찾으면 될것 같습니다. p 엘리먼트에 “품절” 이라는 단어가 있으면 계속 품절인 것으로, 없으면 구매가능한 것으로 판단할 수 있을 것 같습니다. 다른 사이트에 대해서도 쉽게 추가할 수 있도록 체크하는 로직 부분은 분리해서 클래스에 전달하는 방식으로 만들어 봅시다. 뚜닥뚜닥 이런 코드를 만들어 봤습니다.

  • 1라인 :일단 파이썬 스크래핑의 기본인 requests 를 모듈을 가져옵니다.
  • StockCheck 클래스는 재고 확인의 전반적인 로직을 담당합니다. 체크할 URL과 품절 확인 메서드를 전달받아 실행한 뒤 이전에 확인된 품절 상태와 비교합니다.
  • 43라인 : main 부분은 테스트를 위한 코드 입니다. 파이썬이나 루비에서 많이 사용하는 방식이죠.
  • 44 라인의 legoshopCheck 함수는 레고 사이트의 품절을 체크합니다. BeautifulSoup 라이브러리로 HTML을 파싱하고 p 엘리먼트 중 특정 요소를 가지고 있는 것을 찾아냅니다. 그 안에 ‘품절’ 이라는 단어가 있으면 품절 상태로 판단합니다.

챗봇

메신저는 텔레그램으로 선택했습니다. 무료이고 API 지원이 잘 되는 편이라.. 다른 메신저는 어떤지 모르겠네요.

우선 텔레그램 봇을 만들어줘야 합니다. 검색하면 상당히 많이 나오는데 저는 이분 포스팅을 참조했습니다.

봇이 만들어졌으니 간단히 API 를 만들어 봅니다. python-telegram-bot 이라는 모듈을 사용했습니다.

보시다시피 엄청 간단합니다. 그냥 API 래핑한거죠. 사실 챗봇이 아닙니다. 그냥 메시지를 보내주는 역할만 하니까요.

구동하기

코드를 깔끔하게 만들기 위해 설정 부분(토큰, 스크래핑 주기)을 밖으로 빼줍니다.

마지막으로 메인 코드 부분입니다.

  • 15라인 : legoshopCheck는 위에 나왔던 코드와 동일합니다.
  • 44라인 : check 함수는 여러 개의 아이템을 한 번에 체크할 수 있도록 만들었습니다.
  • 49, 53~56라인 : 각 아이템별로 체크를 하고 입고 상태가 바뀐 것들에 대해 텔레그램으로 메시지를 보내줍니다.

이 프로그램은 계속 돌아가야 의미가 있으므로 집에 있던 시놀로지 Docker에 miniconda 이미지를 받아 프로그램을 설치하고 실행했습니다. (시놀로지 NAS에서 Docker 사용하기 참조)

내가 찾던 물건이 입고가 되면 이런 메시지가 옵니다.

Received message when restocked

발전시킬 부분

일단 기본적인 기능은 작동하지만 발전시킬 부분이 많아 보입니다. 재입고를 체크하는 부분은 크게 손볼게 없어 보입니다. 챗봇과 스케줄링 하는 부분을 발전시켜볼 수 있을 것 같습니다.

  • 서비스 시작과 종료, 상태 질의
  • 등록/삭제/임의 실행/리스팅
  • 스케줄 조정 – 체크 주기 바꾸기 등.
  • 여러 사람에게 메시지를 보낸다. 동일한 아이템을 구독하는 방식으로 바꾸기.
  • 여러 사람이 운영한다(배포)

재입고 알림 봇 만들기(python + telegram bot)”의 66개의 생각

  1. 서도진 답글

    우선 저는 개발에 개 자도 모르는 그냥 민간인 입니다.

    ebay에 제가 구입하고 싶은 물건이 있는데 재고 입고가 불규칙합니다.

    그러나 보니 자꾸 놓치게 되는데

    마침 위 블로그 내용을 보게 되었습니다.

    위 글을 보고 따라서 만들어 보려 했지만… 그냥 민간인이다 보니 어렵네요

    혹시 개발에 개 자도 모르는 일반인이 따라하기 쉽게 가이드를 만들어 주실 의향이 있으실까요?

    부탁드립니다.

  2. 답글

    안녕하세요ㅎㅎ
    다름이 아니라 프로그램에 ㅍ 도 모르는 사람이
    따라서 만들수 있을까요ㅠㅠ?
    가지고 싶은 물건이 있는데 맨날 품절이네요ㅠㅠ
    도와주시면 ㅠㅠ 깊폰 사례 드리겠습니다ㅠㅠ

    • samsee 글쓴이답글

      웹 사이트마다 조금씩 다른 부분이 있어서 품절을 체크하는 방법이 달라집니다. 어느 사이트인지 알려주시면 방법을 찾아볼 수 있을 것 같네요. 링크나 사이트 주소 알려주세요!

    • samsee 글쓴이답글

      물온 가능합니다! 오픈마켓으로 예제 하나 만들어 올려야겠네요.

  3. SS 답글

    혹시 “이 프로그램은 계속 돌아가야 의미가 있으므로 집에 있던 시놀로지 Docker에 miniconda 이미지를 받아 프로그램을 설치하고 실행했습니다.” 이 부분 포스팅 할 계획이 없으신가요?

    찾아서 miniconda3 설치는 했는데 그 뒤에 어떻게 해야 되는지를 모르겠네요.

    • samsee 글쓴이답글

      알림은 쉬운데 자동구매는 넘어야할 산이 많을 것 같네요.

      • SOMEONE 답글

        알림 및 자동 페이지 열람은 가능할까요?

        • samsee 글쓴이답글

          페이지 자동 열람은 어떤 걸까요? 폰에서 자동으로 구매 페이지가 열리는 그런 걸까요?

  4. ez 답글

    아 어렵다 어려워 마스크때문에 이런것도 해야하네 ㅠㅠ 하다 모른면 여쭤봐도 되나요

  5. ez 답글

    텔레그램 봇까지는 만들었는데 그 뒤로는 모르겠네요 OTL

  6. JungHun 답글

    안녕하세요.
    http://www.welkeepsmall.com/shop/shopdetail.html?branduid=1007206&xcode=023&mcode=001&scode=&type=X&sort=manual&cur_code=023&GfDT=bmp8W1w%3D
    이 사이트 기준으로 만들어 보기위해 시도 했어요.
    일단 기반 프로그램 설치하구 쥬피터에서 복사 붙여넣기 했는데..
    조금 막막해서 뎃글 남겨요.

    ValueError Traceback (most recent call last)
    in
    66 stock = lego_friends_perk.check()
    67 print(lego_friends_perk.name, “Available? “, stock)
    —> 68 (status_changed, last_status, current_status) = lego_friends_perk.statusChanged()
    69 print(lego_friends_perk.name, “Status Changed? “, status_changed, “, Last Status? “, last_status, “, Current Status? “, current_status)
    70

    ValueError: too many values to unpack (expected 3)

    일단 이렇게 떠서 막혔는데.. 조금 염치없지만 카카오톡 오픈톡으로 모르는것들을 도움 받을 수 있을까요?
    기초가 없어서 막히는게 .. 조금 많네용 ㅜㅜ
    https://open.kakao.com/o/sO2oSjYb

    • JungHun 답글

      AttributeError Traceback (most recent call last)
      in
      32 # main script
      33 if __name__ == “__main__”:
      —> 34 bot = TelegramBot(config[‘TELEGRAM’][‘TOKEN’])
      35 bot.sendMessage(config[‘TELEGRAM’][‘RECEIVER_ID’], “Monitoring started.”)
      36

      5 def __init__(self, token):
      6 self.token = token
      —-> 7 self.bot = telegram.Bot(token = self.token)
      8
      9 def sendMessage(self, chat_id, message):

      AttributeError: module ‘telegram’ has no attribute ‘Bot’

      메인 스크립트 구동중 요렇게 오류가 뜨네용 ㅠㅠ

  7. samsee 글쓴이답글

    telegram 모듈을 정상적으로 불러오지 못한 것 같습니다.
    우선 python-telegram-bot 설치가 되었고 import 가 되었는지 확인해보세요.
    python 실행하고
    import telegram
    했을 때 에러가 나면 안됩니다. 에러가 나면 파이썬에서 나가셔서( exit() )
    pip install python-telegram-bot –upgrade
    해보시기 바랍니다.
    안되면 알려주세요~

      • samsee 글쓴이답글

        일단 해당 몰에 맞도록 legoshopCheck 함수를 조금 수정해주셔야 합니다. 레고샵에서만 통하는 방식이라서요. 사이트 확인해봤는데 soup.find_all(“a”, class_=”soldout”) 로 바꿔주시면 될것 같습니다.

        telegram_bot.py 는 16라인에 jh_zz -> ‘jh_zz’로 바꿔서 python telegram_bot.py 를 실행해 보세요. 정상적인 토큰이면 텔레그램 앱으로 메시지가 들어와야 합니다.
        코로나 조심하세요 ㅠ

        • JungHun 답글

          필자님두 코로나 바이러스 조심하세요.
          Find_all 함수 사용시 아래와 같은 에러가 발생하네요 ㅜㅜ
          >>> ResultSet object has no attribute ‘text’. You’re probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?

          그래서 Find로 바꾼다음 (stock 파일과 main파일 두개를 수정)
          실행을 돌리니 챗봇에 ture 값으로 변경되었다는 메세지가 한번 뜬 이후
          조용하네요.
          아래는 실행내역입니다.
          2020-02-22 17:37:22 [(True, False, True, )]
          2020-02-22 17:38:22 [(False, True, True, )]
          2020-02-22 17:39:22 [(False, True, True, )]

          이게 작동이 되고있는건지 잘 구분이 안되어서 질문을 남깁니다ㅜ ㅜ

          • samsee 글쓴이

            저도 해봤는데 계속 품절상태라 그런 것 같습니다.. 상품 입고되면 나올거예요 ㅠ 설명 부족했는데 잘 하셨네요.

          • JungHun

            감사합니다. 정상 작동 하는것 같아요,
            혹시 한가지 문제가 있는데 해결 가능할까요?
            (‘Connection aborted.’, TimeoutError(10060, ‘연결된 구성원으로부터 응답이 없어 연결하지 못했거나, 호스트로부터 응답이 없어 연결이 끊어졌습니다’, None, 10060, None))

            During handling of the above exception, another exception occurred:

            이런식으로 간혈적으로 TimeoutError가 발생합니다. 해결 가능할까요?

          • samsee 글쓴이

            어느 파일의 몇 라인에서 나오는 에러인가요?

  8. 질문 답글

    여러개 아이템을 동시에 재고파악 하는 방법이 있나요?
    있다면 어떤 부분을 수정하면 되나요?

    • samsee 글쓴이답글

      1. 사이트에 맞도록 legoshopCheck 함수를 만들고
      2. 37~39 라인처럼 체크하는 객체를 만든 뒤
      3. 49라인의 [lego_friends_perk] 배열에 넣어주시면 됩니다. 예를 들어 2가지 종류의 사이트에 있는 상품을 체크하는 경우

      def nnmarketCheck(res):
      soup = BeautifulSoup(res.text, 'html.parser')
      stock_div = soup.find("div", {"class": "prd-btns"}).find('div')

      // 생략
      def legoshopCheck(res):
      // 생략

      처럼 해당 사이트에 맞는 함수를 만들어 줍니다.
      그리고 2. 체크 객체를 만들어 줍니다.

      zelda_amiibo = StockCheck("Zelda Amiibo from nnmarket"
      , "http://www.nnmarket.co.kr/shop/shopdetail.html?branduid=232728&xcode=024&mcode=001&scode=&special=3&GfDT=bmp7W10%3D"
      , nnmarketCheck, "euc-kr")

      3. 마지막으로 체크 객체를 체크 대상 배열에 넣어줍니다.

      returns = check([zelda_amiibo, lego_friends_perk])

      기존 코드도 2가지 아이템을 체크하기 위해 만든거라 1번 부분의 체크하는 함수만 만들면 쉽게 추가할 수 있을 것입니다.

      • 질문 답글

        감사합니다.
        재 검색 시간 간격을 조절하기 위해서는
        58 라인의 * 60을 수정하면 되는가요? ( min -> sec 로 검색하기 위함 )

        • samsee 글쓴이답글

          넵 그 라인 수정하시면 됩니다. 다만 스크래핑하는 사이트에서 너무 많은 접근이 들어오면 공격으로 보고 IP를 차단할 수 있습니다. 주의하세요.

      • samsee 글쓴이답글

        span 요소가 중첩되어 들어가 있네요. 대략 이렇게 하면 될 것 같습니다.
        naver_store_suop.find(“span”, class_=”buy”).findAll(‘span’)[1][‘class’][0] == ‘blind’ # 품절
        구매하기 텍스트가 들어 있는 span 태그의 클래스가 blind 이면 품절인 것으로 판단하면 될 것 같습니다.
        옵션 별로 구매가 가능하고/불가능한 경우에는 좀 더 복잡해지겠죠..

  9. 이지훈 답글

    안녕하세요. 정말 감사하게도 이런 글을 올려주셨더라고요. 감사합니다.
    근데 실례지만 질문좀 해도 될까요??
    정말 아무것도 모르고 입문했다가 그래도 당일치기로 어느정도는 숙지하며 거진 완성? 했습니다.
    하지만 궁굼증과 문제가 생겼어요. 궁굼한것은 저 3가지의 목록을 다 실행시켜놔야 하는건가요?
    아니면 메인만 켜도 나머지 것들이 다 적용이 되는건가요?
    ‘구동하기’ 까지 합치면 4개더라고요. 근데 이건 미관상 빼셨다는게 무슨말인지 이해를 못하겠더라고요… 필요없어서 뺀건가요??
    그리고 문제로는 에러가 뜹니다… 다른건 다 수정해서 고쳤는데
    ‘메인 코드’에서 1. Unable to import ‘restock’ [3,1] 옆에 희미한 글자로 pylint(import-error) 라고 적혀있네요
    2. Unable to import ‘telegram_bot’ [4,1] 여기에도 희미한 글자로 pylint(import-error) 적혀있구요.
    도움받고 염치없지만 이렇게 질문 남깁니다… 답변해주시면 정말 감사하겠습니다ㅜㅜ

  10. 질문드립니다 답글

    안녕하세요. 정말 감사하게도 이런 글을 올려주셨더라고요. 감사합니다.
    근데 실례지만 질문좀 해도 될까요??
    정말 아무것도 모르고 입문했다가 그래도 당일치기로 어느정도는 숙지하며 거진 완성? 했습니다.
    하지만 궁굼증과 문제가 생겼어요. 궁굼한것은 저 3가지의 목록을 다 실행시켜놔야 하는건가요?
    아니면 메인만 켜도 나머지 것들이 다 적용이 되는건가요?
    ‘구동하기’ 까지 합치면 4개더라고요. 근데 이건 미관상 빼셨다는게 무슨말인지 이해를 못하겠더라고요… 필요없어서 뺀건가요??
    그리고 문제로는 에러가 뜹니다… 다른건 다 수정해서 고쳤는데
    ‘메인 코드’에서 1. Unable to import ‘restock’ [3,1] 옆에 희미한 글자로 pylint(import-error) 라고 적혀있네요
    2. Unable to import ‘telegram_bot’ [4,1] 여기에도 희미한 글자로 pylint(import-error) 적혀있구요.
    도움받고 염치없지만 이렇게 질문 남깁니다… 답변해주시면 정말 감사하겠습니다ㅜㅜ

    • samsee 글쓴이답글

      Unable to import .. 이런 에러는 파일이 없으루때 발생합니다. restock.py 라는 파일이 메인 프로그램 파일과 같은 디렉토리에 있어야 합니다.
      미관상 뺐다는 것은 텔레그램 키 부분이나 스크래핑 주기 등 프로그램 코드가 아닌 설정에 해당되는 것들을 프로그램에서 빼내고 다른 파일로 관리한다는 의미였습니다. 프로그램 코드를 바꾸지 않아도 실행주기 같은걸 바꿀 수 있도록요.

  11. 질문드립니다 답글

    와… 하루 시간동안 벼락치기로 공부해가면서 도전 해봤지만
    정말 어렵네요… 아무것도 모르는 민간인은 다가가기 힘든 프로그램이었네요.
    에러가 뜨면 정보 찾기도 힘들고 얼마 없는데 심지어 이해까지 안되네요 ㅠㅠ 속상합니다
    JUNGHUN 님처럼 같은 사이트에서 구매하려고 세팅을 엄청 해봤는데 안되네요.
    저분이 질문했던 내용들이 저한테도 다 해당이 되더라고요.
    그리고 늦은감이 있는 질문이지만, 결국 메인코드 하나만 구동하면 되는건가요??
    아니면 4개의 페이지인 코드들을 다 구동해야 하는건가요??

    • samsee 글쓴이답글

      메인 코드만 실행하시면 됩니다. 나머지들은 부품이예요.

  12. 질문드립니다. 답글

    설명 정말 정말 정~말 감사합니다 ㅠㅠㅠ 복받으실거예요.
    코로나 바이스러스 때문에 힘든 시기이지만 예방 잘하셔서 무탈하시길 바랍니다.

    • samsee 글쓴이답글

      잘 봐주셔서 감사합니다. 코로나 조심하세요!

  13. 질문이요 답글

    해보고 싶은데 아직 초짜민간인 수준이라 할 수가 없네요 ㅠㅠ 이 시국에 물건 구하기가 너무 힘들어서 ..ㅠㅠ 도와 주시면,,헤

    • samsee 글쓴이답글

      어느 부분에서 막히셨나요? 스크래핑 하려는 사이트 주소 알려주시면 봐드리겠습니다.

  14. vitamin 답글

    안녕하세요!
    마스크 구하기가 너무 어려워서
    알아보다가 결국 여기까지 오게됐습니다

    아직 파이썬이라는 프로그램으로 뭔가 해볼 수 있다
    라는것 까지만 알고 사실 나머지는
    무슨 말인지 잘 모르겠습니다 ^^;;

    혹시 상품정보가 아예 없다가
    입고되면 상품정보가 뜨는 경우에도
    공부하면 만들어볼 수 있을까요?

    아래 사이트에서 “KF”를 검색했을때 페이지인데
    물건이 나왔을때 페이지에 변화가 일어난걸
    감지한다던지 하는식으로
    https://www.costco.co.kr/search/?text=kf

    너무 기본지식이 없어 질문도 맞게 한건지 모르겠지만;;
    만약 가능하다면
    어떻게든 공부해서 도전해보겠습니다 ^^;

    • samsee 글쓴이답글

      가능합니다! 결과건수 같은걸 저장해두고 그게 바뀌었을 때 알려주는 방법이 있을 것 같네요.

      • vitamin 답글

        감사합니다!
        열심히 알아보고 공부해봐야겠네요
        건강 조심하시고
        행복한 하루 되세요!

  15. ganadaramabasa 답글

    입고 메세지를 보낼 때 입고된 제품의 url을 추가하려면 어디를 수정해야할까요…?

    • samsee 글쓴이답글

      main.py 프로그램 56라인에 sendMessage 부분을 “{} status has changed to {} : {}”.format(item[3].name, item[0], url) 로 하시면 될 것 같습니다.
      url 에 링크를 넣어주시면 되구요~

  16. 지나가던 문과생 답글

    대박… 지나가던 문과생입니다. 재입고 봇 원리가 궁금해져 검색하다 우연히 들어왔는데, 그 내용은 당연히 이해하지 못했지만 주인장님 친절함에 반하고 가요. 어떤 질문에도 세심히 알려 주시는 모습 너무 멋지십니다.👍👍

    • samsee 글쓴이답글

      좋게 봐 주신 점 감사드립니다. 사실 별거 없습니다. 코드도 초보적인 수준이구요 🙂 인터넷이 어떻게 돌아가는지만 조금 이해하면 누구나 할 수 있는 거라고 생각해요.

  17. 원종범 답글

    안녕하세요. 네이버 마이쇼핑에서 리스트 들이 재고 보유 시 알림뜨게 코드 작성 중인데 잘 안되네요.ㅠㅠ
    DIV 클래스가 _21ANqK1Xo- 안의 자식 태그 중 span 텍스트에 품절 또는 구매불가가 없는 태그(혹은span class 가 _21-OP-fDyx 인 태그가 없을 시) 있을 시 알람을 뜨게 하고 싶거든요

  18. 원종범 답글

    n_shop = “https://shopping.naver.com/my/keep-products”
    driver.get(n_shop)
    req = urllib.request.Request(n_shop)
    res = urllib.request.urlopen(req)
    data = res.read();
    buynow = False

    soup = BeautifulSoup(data.decode(“utf-8”), ‘html.parser’)

    product_yes = soup.find_all(“div”, {“class”:”_21ANqK1Xo-“})

    for span in product_yes :
    if span.find_all(‘span’).text != ‘품절’ or ‘구매불가’ :
    buynow = True;
    break
    else :
    continue

    if buynow :
    print(str(loopIdx) + ” : Buy now”)
    break

    else:
    print(“Not yet !!!!!!”)

    • samsee 글쓴이답글

      우선 마이쇼핑 같은 경우에는 로그인이 되어 있어야 나올 것 같아요. 다른 브라우저에서 로그인을 해서 쿠키 값을 가져와 header에 넣어주거나 로그인 처리를 해야할 것 같습니다. 이런건 requests 라이브러리로는 좀 번잡해질 것 같습니다. scrapy나 selenium 같은 라이브러리를 쓰는게 나을 것 같습니다.

      • 원종범 답글

        답글 감사합니다. 로그인 함수는 생략하고 그 후에 값만 위에 표기했어요. for 와 if 조건식에서 잘 잡아내지를 못하는 것 같습니다 .

        2020.02.25.


        품절상품 텍스트

        품절이 없을 시 10개의 _21ANqK1Xo- 클래스 태그 안에 _21-OP-fDyx 스판태그가 사라지는데 조건문을 어떻게 만들지 모르겠네요 ㅠㅠ

        • samsee 글쓴이답글

          이렇게 해보세요. zzim_list ul 안의 item 목록을 돌면서 비활성화(disabled) 클래스 가진 경우 아이템 이름을 출력하는 코드입니다.

          item_list = soup.find(“ul”, class_=”zzim_list”)

          for item in item_list.findAll(“li”):
          if (‘disabled’ in item.get(“class”)):
          item_name = item.find(“div”, class_=”_21ANqK1Xo-“).find(“a”).find(“span”).nextSibling
          print(item_name)

  19. 김선생 답글

    비슷한 프로그램이 필요해서 검색하다가 들어오게 되었습니다.. 저같은 경우는 수업예약을 해야하는데 항상 놓치는데 예약 가능이 뜨면 알려주는 프로그램을 짜보고자 합니다.

    https://engoo.co.kr/tutors/35915

    이싸이트구요. 알려주신대로 DOM 탐색기에서 예약관련 코드는 찾은거같은데
    그뒤부터는 전공이 아니다보니 막막하네요. 도움 좀 요청해도 될까요?
    감사합니다.

  20. 김선생 답글

    댓글을 남겼는데 삭제된건지 안뜨네요.. ㅠ
    혹시 무슨 문제가 있던건가요??

    • samsee 글쓴이답글

      스팸 방지 기능 때문에 그렇습니다 ^^; 올려주신 사이트 확인해봤는데 가입 안하면 예약 버튼이 아예 안 보이는 것 같아서 도와드리기 어렵네요 ㅠ

      • 김선생 답글

        답변 감사합니다. 혹시 제가 아이디와비밀번호를 하나 드린다면 봐주실 수 있을까요? 저한테는 좀 중요한 문제다보니 이렇게 해결법을 찾고 있는중이라서요.. ㅠ 부담되신다면 어쩔 수 없고요 . ㅎㅎ

        • samsee 글쓴이답글

          아이디 비번 알려주시는 것 보다는 html을 저장해서 보내주시는게 좋을 것 같아요. Ctrl + S 로 저장하실 수 있습니다. sxxxxx@gmail.com으로 메일 보내주세요.

          • 김선생

            메일 보내드렸습니다 . 감사합니다 ^^

          • 김선생

            혹시 제 메일 받으셨나요? 아직 피드백이 없으시길래요 ^^

          • samsee 글쓴이

            어제 메일로 회신 드렸어요. 도움 되시길 바래요. 더 궁금하신 점 있으시면 메일 주세요.

  21. 조준갑 답글

    안녕하세요 개발자님

    저는 컴퓨터에 컴자도 모르는 일반인 입니다

    우연하게 찾아보다 실례를 무릎쓰고 댓글 남깁니다

    갖고싶은 레고가 있는데 잠깐 들어왔다 계속 품절이 나서 구매 하는데 어려웁을 겪고있습니다

    혹시 저도 위에 댓글 남기신 분 처럼 쉽게 따라할수 있는 가이드를 만들어 주실수 있을까요?

    염치 불구하고 댓글 남깁니다

    감사합니다

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다