# 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