|
| 1 | +from sqlalchemy.orm import Session |
| 2 | +import models |
| 3 | +import database |
| 4 | +from crawler import get_new_posts |
| 5 | +from typing import List, Tuple |
| 6 | +import discord_logging |
| 7 | +import datetime |
| 8 | +import mail |
| 9 | + |
| 10 | +VELOG_DEFAULT_PROFILE_IMG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASbSURBVHgB7Z0tTytBFIYP914BDiQ4cIADB0EhwYFE8ifq7g/hJ2CRSCQ4kOCobF3ruHk3maS5aSnbdnfPOe/7JE0oCTvTnmc+dvbMsNbr9b5M0PLLBDUSgBwJQI4EIEcCkCMByJEA5EgAciQAORKAHAlAjgQgRwKQIwHIkQDkSAByJAA5EoAcCUCOBCBHApAjAciRAORIAHIkADkSgBwJQI4EIEcCkCMByJEA5EgAciQAOX+MhPX1dTs+Prbt7W3b3d21jY2N6ndgPB7bYDCw4XBor6+v9vHxUb1nIL0Ae3t7dn5+XgV9FhABYuC1v79f/Q4SPD8/28vLi2UmrQA/Cfx34O/wwjXu7u7S9gi/z87O/loyELTr62vb2tqyZcFQcXp6Wv2MXiEb6SaBCDwEWDVFqmykEgABOjo6sqbAtbNJkEaAi4uLRoNfQBmXl5eWhRQCIChlnG6Dk5OTVstrkvACYKLXxJg/D5RZ1hEiE14ABGIVs/26IPgZeoHQAiDwbYz7s4AA0XuB0AIsusizKsrycmRCC+Dhyz84OLDIhBUAra/rHgCgDpGHgbAC7OzsmBc81aUuYQXY3Nw0L3iqS13CCtDFrd8sPNWlLsoIIkcCkBNWAE8JGpGTRcIKgPw9L3iqS13CCvD5+Wle8FSXuoQVAJm8HlK0UAfUJSqhJ4Fvb2/WNcgcjkxoAfDld936oieKhhYAwX96erKuwJ6B6Oni4dcBIEAXvQAC//j4aNEJLwCC30UgUGaGzSIpVgLRC7Q5FKCsLFvG0iwFPzw8tBIUlIGyspDqWcD9/X2jEuDaKCMT6R4GIUBNzAlwzWzBByl3ByNYaK23t7dLP6vHfT6u9/7+bhlZ6/V6X5YYpI0jebRu/mD2wBfSHxCBngAv9ASQ4PDwsErhwvvJE0JGo1EV9H6/72KFsS1SCDAZyFngnh2vVUwSUV4WQUILULZnlR06aMGYqDW1QDN56khZho6+Ghh2DoBgXF1dTZ3koZWvcqWubECdtg0NZUQ+QiakAGjxOA9gHhABj4wXeWyMHgX5/j85Zwi9AXoeD4+n6xJOAASk7nbwkjyCGT0meXg/mcWDYOMsIJwShtaO3mWRHT/odaINCaHmAIsEHyCQOP6tHAHXFKVukSQIsxK4aPDbBnWMdG5ACAHwhUYIfgHzEwwjEXAvQFdHwCzLzc1NiC1jrgXA2I31/Ijbr1HnCEfKuRagq/N/VgXuJLzPB9wKgMBnOITJu8RuBUDXnwHvQ4FLAbDkGrnr/x8MBV7vClwKEHHWPw+vn8mdANlaf8FrL+BOgIytv+Dxs7kSAC0kY+sveOwFXAnQ5bGvbdH0A6m6uBLAw8GPTePtaFk3AmTv/gtYF/A0DLgRgKH1Fzx9VjcCIBuHBU89nRsBkKrFgqfNJm5SwpBGVc7fz/CvWKZRUsk9bS1PvzVMfI+OiiVHApAjAciRAORIAHIkADkSgBwJQI4EIEcCkCMByJEA5EgAciQAORKAHAlAjgQgRwKQIwHIkQDkSAByJAA5EoAcCUCOBCBHApAjAciRAORIAHIkADkSgBwJQI4EIOcfGjV2tEfztqEAAAAASUVORK5CYII=" |
| 11 | +TZ_KST = datetime.timezone(datetime.timedelta(hours=9)) |
| 12 | + |
| 13 | + |
| 14 | +def UTC_to_KST(utc_time: datetime.datetime) -> datetime.datetime: |
| 15 | + kst_time = utc_time + datetime.timedelta(hours=9) |
| 16 | + # kst_time = kst_time.replace(tzinfo=TZ_KST) |
| 17 | + return kst_time |
| 18 | + |
| 19 | + |
| 20 | +async def update_new_post_by_blog(db: Session, blog: models.Blog, limit: int = 10, is_init: bool = False) -> List[str]: |
| 21 | + updated_posts: List[str] = list() |
| 22 | + |
| 23 | + posts = await get_new_posts(username=blog.id, limit=limit, return_type="List") |
| 24 | + |
| 25 | + if is_init: |
| 26 | + blog.last_uploaded_at = datetime.datetime(2005, 2, 1) |
| 27 | + |
| 28 | + for post in reversed(posts): |
| 29 | + post_uploaded_at = UTC_to_KST(datetime.datetime.strptime( |
| 30 | + post["released_at"][:19], "%Y-%m-%dT%H:%M:%S")) |
| 31 | + |
| 32 | + print(post_uploaded_at, blog.last_uploaded_at) |
| 33 | + if post_uploaded_at <= blog.last_uploaded_at: |
| 34 | + continue |
| 35 | + |
| 36 | + if db.query(models.Post).filter(models.Post.id == post["id"]).first(): |
| 37 | + continue |
| 38 | + |
| 39 | + updated_posts.append(f"{blog.id} - {post['title']}") |
| 40 | + |
| 41 | + # DB에 추가 |
| 42 | + db_post = models.Post( |
| 43 | + id=post["id"], |
| 44 | + title=post["title"], |
| 45 | + blog_id=post["user"]["username"], |
| 46 | + blog_img=post["user"]["profile"]["thumbnail"] if post["user"]["profile"]["thumbnail"] else VELOG_DEFAULT_PROFILE_IMG, |
| 47 | + link=post["url_slug"], |
| 48 | + short_description=post["short_description"], |
| 49 | + created_at=post_uploaded_at, |
| 50 | + updated_at=UTC_to_KST(datetime.datetime.strptime( |
| 51 | + post["updated_at"][:19], "%Y-%m-%dT%H:%M:%S")), |
| 52 | + ) |
| 53 | + |
| 54 | + db.add(db_post) |
| 55 | + db.commit() |
| 56 | + db.refresh(db_post) |
| 57 | + |
| 58 | + db_users = db.query(models.Bookmark).filter( |
| 59 | + models.Bookmark.blog_id == db_post.blog_id).all() |
| 60 | + |
| 61 | + for bookmarked_user in db_users: |
| 62 | + db_user = db.query(models.User).filter( |
| 63 | + models.User.id == bookmarked_user.user_id).first() |
| 64 | + if not db_user.email: |
| 65 | + continue |
| 66 | + |
| 67 | + if db_user.is_subscribed and not is_init: |
| 68 | + mail.send_new_post_notice_email( |
| 69 | + receiver_address=db_user.email, post=db_post, user_id=db_user.id) |
| 70 | + |
| 71 | + last_uploaded_at = datetime.datetime.now() |
| 72 | + if posts: |
| 73 | + last_uploaded_at = UTC_to_KST(datetime.datetime.strptime( |
| 74 | + posts[0]["released_at"][:19], "%Y-%m-%dT%H:%M:%S")) |
| 75 | + |
| 76 | + db.query(models.Blog).filter( |
| 77 | + models.Blog.id == blog.id).update( |
| 78 | + {"last_uploaded_at": last_uploaded_at, |
| 79 | + "updated_at": str(datetime.datetime.now())}) |
| 80 | + db.commit() |
| 81 | + |
| 82 | + return updated_posts |
| 83 | + |
| 84 | + |
| 85 | +async def update_new_post() -> None: |
| 86 | + db = next(database.get_db()) |
| 87 | + |
| 88 | + total_updated_blog_cnt: int = 0 |
| 89 | + total_updated_posts: List[str] = list() |
| 90 | + |
| 91 | + db_blogs = db.query(models.Blog).all() |
| 92 | + for blog in db_blogs: |
| 93 | + updated_posts = await update_new_post_by_blog(db=db, blog=blog, limit=10) |
| 94 | + if updated_posts: |
| 95 | + total_updated_blog_cnt += 1 |
| 96 | + total_updated_posts.extend(updated_posts) |
| 97 | + |
| 98 | + await discord_logging.logging_new_post_upload(total_updated_blog_cnt, total_updated_posts) |
0 commit comments