ssg_today_menu_slack/menu.py
bumpsoo 1b8b580554 기본 구조 완성. 파일 정리하면 끝. 일단 배포 완료
todo
- tf 파일의 slack_url 환경변수 등으로 정리
- 배포하는 스크립트? 필요할 것 같기도 함
2024-07-03 05:06:54 +09:00

90 lines
2.8 KiB
Python

# menu repository
from dataclasses import dataclass
from datetime import datetime
from typing import Dict, Final, List, Optional
import requests
from PIL import Image
from io import BytesIO
import boto3
BASE: Final[str] = 'https://sfmn.shinsegaefood.com/'
URL: Final[str] = f'{BASE}selectTodayMenu2.do'
HEADER: Final[Dict[str, str]] = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1',
'Content-Type': 'application/json',
'Referer': 'https://sfmn.shinsegaefood.com/selectTodayMenu.do',
}
STORE: Final[str] = '06379'
@dataclass
class Menu:
meal_time: str
meal_type: str
rep_menu: str
detailed_menu: str
calory: str
menu_image: Optional[str]
def __post_init__(self):
if self.menu_image:
self.menu_image = f"https://store.shinsegaefood.com/{self.menu_image}"
def resize_image(self, bucket_name: str, date: str):
if self.menu_image is None:
return
image_url = self.menu_image
filename: str = date + '/' + str(datetime.now().timestamp()) + 'png'
response = requests.get(image_url)
response.raise_for_status()
target_size = 1024 * 1024
image_data = response.content
img = Image.open(BytesIO(image_data))
while len(image_data) > target_size:
resize_factor = 0.9
new_width, new_height = int(img.width * resize_factor), int(img.height * resize_factor)
img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
img_bytes = BytesIO()
img.save(img_bytes, format='png')
image_data = img_bytes.getvalue()
s3 = boto3.client("s3")
s3.put_object(
Body=image_data,
Bucket=bucket_name,
Key=filename,
)
self.menu_image = f"https://{bucket_name}.s3.amazonaws.com/{filename}"
# date should be this form 20240601
def menu(date: str) -> List[Menu]:
menus: List[Menu] = []
res = requests.post(URL, headers=HEADER, json={
'menuDate': date,
'storeCd': STORE,
'cafeCd': '01',
'dispBaseCd': '0',
'userLang': 'K'
})
if res.status_code != 200:
return menus
data: List[Dict[str, str]] = []
try:
data = res.json()['model']['model']
print('data', data)
except:
return menus
for each in data:
try:
menus.append(Menu(
each['MEAL_TYPE_NM'],
each['DINNER_TYPE_NM'],
each['REP_MENU_NM'],
each['MENU_DESC'],
each['TOT_CALORY'],
each.get('WEB_LINK'),
))
except:
pass
return menus