애플스토어 픽업 재고 확인 프로그램 만들기

요즘 반도체 부족이니 뭐니 하는 이유로 칩이 들어간 제품 사는 게 참 힘들어졌습니다. PS5는 정가의 두 배에 팔리고 그래픽 카드는 광산으로 다 끌려가서 정가의 3배 정도에 팔리는 안타까운 상황이죠. 이번에 새로 나온 맥북프로도 이런 상황을 피해 갈 수는 없었는지 지금 애플 공홈에서 주문하면 한 달 정도 후에 배송해 준다고 하더군요. 이런 기다림이 싫으신 분들은 매일 아침 애플스토어에 재고가 소량 입고되는 걸 매장 내 픽업으로 주문하시면 됩니다. 근데 이게 쉬운 일은 아닌 것 같더군요. 예전에 아이폰 13과 애플워치 SE 나왔을 때 후기 보면 오전 6시부터 1분마다 새로 고침 해서 겨우 했다는 사람도 있고 잠꾸러기인 저에게는 상당히 힘든 일 같았습니다. 그래서 포기했냐고요? 아니요. 파이썬의 힘을 빌렸습니다.

우선 현재 애플스토어에 재고가 있는지 확인하는 정상적인 방법을 알려드리겠습니다. 애플 공홈에서 원하시는 제품의 선택 버튼 아래에 픽업 부분을 보시면 재고 확인이 있습니다.

재고 확인을 누르시면 우편번호를 입력하라고 나오는데 입력하시면 가까운 순으로 애플스토어가 나열되고 재고가 있으면 가능, 없으면 불가라고 나옵니다.

이 과정이 어떻게 이루어질지 생각해 봅시다. 사용자가 매장 검색을 누르면 사용자 컴퓨터의 웹브라우저가 애플 서버에 요청을 보낼 것입니다. 애플 서버는 요청에 대한 응답을 사용자의 컴퓨터에게 보내줄 것이고 받은 응답을 활용해 픽업 가능 유무를 출력해 줄 것입니다.

그러면 요청에 대한 응답을 분석해서 1분마다 요청을 보내고 재고가 있다는 답변이 오면 알림을 보내주는 프로그램을 만들면 되겠죠?

매장 검색 버튼을 눌렀을 때 애플 서버로 어떤 요청이 가는지 웹브라우저의 개발자 도구를 열어서 확인해 봤습니다.

https://www.apple.com/kr-edu/shop/fulfillment-messages?searchNearby=true&parts.0=부품번호&location=우편번호

요청을 보내면 이런 응답이 옵니다.

이 응답을 분석하면 현재 애플스토어에 재고가 있는지를 알 수 있겠죠. 다행히 제가 했으니 여러분들은 이 글만 읽으시면 됩니다.

body.content.pickupMessage.stores[스토어].partsAvailability[부품번호"].pickupSearchQuote

스토어라고 적힌 부분은 가까운 스토어가 0부터 시작하는 배열입니다. 어차피 한국엔 두 개밖에 없으니 0 하고 1만 넣어서 확인하면 됩니다. 부품번호는 위처럼 Get 요청 분석하면 알 수 있습니다.

이것을 활용해 1분마다 재고를 확인하고 재고가 나오면 알림을 주는 프로그램을 만들어 볼까요? 저는 텔레그램 Bot API를 이용해 알림이 오도록 만들었습니다. 이 부분은 적절히 수정해서 디스코드에 연동을 하시던, 이메일을 전송하시던, 카카오톡을 쓰시던, 노래를 재생하시던 편하신 대로 하시면 됩니다.

import requests
import telegram
import time

TOKEN = '텔레그램_봇_토큰(문자열)'
CHAT_ID = 텔레그램_채팅_ID(정수)
bot = telegram.Bot(TOKEN)
bot.sendMessage(chat_id=CHAT_ID, text="맥북 재고 확인 프로그램 가동")

MODEL = "MK183KH/A" #16인치 기본형 부품번호
LOCATION = "06028" #06028은 가로수길 우편번호
URL = "https://www.apple.com/kr-edu/shop/fulfillment-messages?searchNearby=true&parts.0={}&location={}".format(MODEL,LOCATION)

while(True):
	r = requests.get(URL)
	d = r.json()
	store1 = d['body']['content']['pickupMessage']['stores'][0]['partsAvailability'][MODEL]['pickupSearchQuote']
	store2 = d['body']['content']['pickupMessage']['stores'][1]['partsAvailability'][MODEL]['pickupSearchQuote']

	if (store1 != "픽업 불가"):
		#가로수길 재고 나옴
		bot.sendMessage(chat_id=CHAT_ID, text="가로수길 재고 나옴")
		break
	elif (store2 != "픽업 불가"):
		#여의도 재고 나옴
		bot.sendMessage(chat_id=CHAT_ID, text="여의도 재고 나옴")
		break
	time.sleep(60)
	
bot.sendMessage(chat_id=CHAT_ID, text="맥북 재고 확인 프로그램 종료")

이렇게 해서 저는 1월 8일 토요일에 알림을 받고 깨서 주문을 하고 오전에 가로수길 가서 받아왔습니다. 그런데 안타깝게도 아이폰, 애플워치와 달리 고가의 제품이라서 그런지 생각보다 그렇게 빨리 안 나가더라고요. 신학기 프로모션 시작 후 첫 주말이라 경쟁이 치열할 줄 알았는데 그냥 적당히 9시쯤 일어나서 주문했었어도 충분했을 거 같긴 합니다.

저희 부모님이 이거 보시고 “이거 DDOS 하고 비슷한 거 아니냐” 걱정하시던데 1분에 한 번 정도만 보냈고 어차피 새로 고침 수시로 해서 HTML 파일까지 다 받아 보는 것보다 이 편이 더 애플 측 부담도 적을 테니 별문제는 안될 것 같습니다. 그리고 뭐 300만 원짜리 물건 사줬는데 이 정도 트래픽이야 뭐 신경도 안 쓰겠죠. 나중에 애플에서 또 뭔가 좋은 거 내놨을 때 배송 오래 걸리면 재활용해야겠네요.