90 lines
2.8 KiB
Python
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
|
|
|