Python과 AWS lambda로 동작하는 최저가 알림 기능 입니다.
가격 요정(..)이 네이버 쇼핑 API를 사용하여 등록한 item의 최저가를 알려줍니다.
혼자서 개발한 toy project 이지만 python과 serverless 개념을 이해하는데 도움이 될 수 있을것 같아 repo 공유합니다.
버그나 설계에 대한 피드백 환영합니다.
python serverless demo를 참고하여 "Cloud 9 시작하기", "AWS Credentials 설정 ", "S3 Bucket 생성하기", "Python 개발 환경 설정" 을 진행합니다.
ec2-user:~/environment $ sudo yum install -y tree
ec2-user:~/environment $ git clone https://github.com/seunghokimj/price-fairy.git
ec2-user:~/environment $ cd price-fairy/
ec2-user:~/environment/price-fairy (master) $ git checkout -t origin/step0
ec2-user:~/environment/price-fairy (step0) $ tree
.
├── aws
│ └── ses.py
├── callback.py
├── price_fairy_policy.json
├── price_fairy.py
├── README.md
├── requirements.txt
└── zappa_settings.json
ec2-user:~/environment/price-fairy (step0) $ virtualenv -p python3 venv
Running virtualenv with interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/ec2-user/environment/price-fairy/venv/bin/python3
Also creating executable in /home/ec2-user/environment/price-fairy/venv/bin/python
Installing setuptools, pip, wheel...
done.
ec2-user:~/environment/price-fairy (step0) $ . venv/bin/activate
(venv) ec2-user:~/environment/price-fairy (step0) $
(venv) ec2-user:~/environment/price-fairy (step0) $ pip install -r requirements.txt
슬라이드 참고
(venv) ec2-user:~/environment/price-fairy (step0) $ git checkout -t origin/step1
class ShoppingQuery(MapAttribute):
# ref: https://developers.naver.com/docs/search/shopping/
query = UnicodeAttribute()
display = NumberAttribute(default=50)
sort = UnicodeAttribute(default='sim')
class PriceRecord(Model):
class Meta:
table_name = "price_fairy_price_record"
region = 'ap-northeast-2'
product_id = UnicodeAttribute(hash_key=True)
crawled_at = UTCDateTimeAttribute(range_key=True)
item = MapAttribute()
class Product(Model):
class Meta:
table_name = "price_fairy_product"
region = 'ap-northeast-2'
id = UnicodeAttribute(hash_key=True)
do_crawl = BooleanAttribute(default=False)
created_at = UnicodeAttribute()
last_crawled_at = UTCDateTimeAttribute(null=True)
min_price = NumberAttribute(default=0) # min_price 가격 이상인 결과만 사용
queries = ListAttribute(of=ShoppingQuery)
lprice = NumberAttribute(null=True) # 현재까지 최저 가격
lprice_item = MapAttribute(null=True) # 최저가격의 item 정보
(venv) ec2-user:~/environment/price-fairy (step1) $ python step1/add_example_item.py
Naver Shopping API를 호출하는 기능을 개발합니다.
(venv) ec2-user:~/environment/price-fairy (step1) $ git checkout -t origin/step2
...
naver_shopping_api_endpoint = "https://openapi.naver.com/v1/search/shop.json?query={}&display={}&sort={}"
naver_client_id = os.getenv('NAVER_CLIENT_ID')
naver_client_secret = os.getenv('NAVER_CLIENT_SECRET')
naver_api_header = {
'X-Naver-Client-Id': naver_client_id,
'X-Naver-Client-Secret': naver_client_secret
}
...
(venv) ec2-user:~/environment/price-fairy (step2) $ git checkout -t origin/step2
(venv) ec2-user:~/environment/price-fairy (step2) $ python step2/test_naver_api.py
최저가 알람을 Slack에 push notification 하는 기능을 개발합니다.
슬라이드 참고
(venv) ec2-user:~/environment/price-fairy (step2) $ git checkout -t origin/step3
...
SLACK_WEBHOOK_URL = os.getenv('SLACK_WEBHOOK_URL') # webhook 주소 추가
...
(venv) ec2-user:~/environment/price-fairy (step3) $ python step3/test_slack_message.py
Zappa setup을 하고 Lambda 에 deploy 합니다.
(venv) ec2-user:~/environment/price-fairy (step3) $ git checkout -t origin/step4
기존 model.py 에서 최저가 탐색 로직을 추가합니다.
def update_lprice(self, lprice_item):
...
def update_last_crawled_at(self):
...
def search_lowest_price(self):
...
lambda_handler 에 dynamodb 에서 데이터를 읽어서 앞서 구현한 최저가 탐색 로직을 수행하도록 코드를 추가합니다.
Naver API와 Slack webhook url 을 알맞게 수정합니다.
...
"aws_environment_variables": {
"NAVER_CLIENT_ID": "YOUR_NAVER_CLIENT_ID",
"NAVER_CLIENT_SECRET": "YOUR_NAVER_CLIENT_SECRET",
"SENDER_EMAIL": "[email protected]",
"SLACK_WEBHOOK_URL": "YOUR_SLACK_WEBHOOK_URL"
},
...
"s3_bucket": "",
...
(venv) ec2-user:~/environment/price-fairy (step4) $ zappa deploy production
버전 관리는 SemVer 를 따릅니다. 각 버전은 tag 로 관리 합니다.
- Seungho Kim - Initial work - seunghkimj
MIT License