23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
예전부터 문제적남자 같은 프로그램을 보면서 퀴즈 푸는 것을 아주 좋아했는데요.
한번 멘사 시험에 도전해볼까? 라는 생각을 최근에 가지게 되었습니다. ㅎㅎ
신청을 하려고 멘사코리아 홈페이지에 등록된 테스트 일정들을 확인해 봤는데,
위처럼 테스트 일정이 굉장히 무작위로 열리는 것을 알 수 있습니다.
(일주일 만에 열릴 때도 있고, 1년 2개월 만에 열릴 때도 있고.. 심지어 접수기간도 단 5일정도..)
때문에 몇 번의 신청 기간을 놓쳐버린 저는, AWS 서비스들을 사용해서 멘사 테스트 알람 스케줄러를 만들기로 결심합니다..ㅋㅋ
먼저 알람 메일 발송을 위해 Amazon SES(Simple Email Service)를 구성합니다.
SES는 이름 그대로 별도의 메일 서버 없이 간단하게 메일 발송을 도와주는 AWS 서비스 입니다.
'Amazon SES - 자격 증명' 에서 '자격 증명 생성' 을 클릭해줍니다.
'이메일 주소'에 개인 이메일 주소를 입력하고 생성을 눌러줍니다.
(저는 카톡으로 알람을 받기 위해 수신은 카카오, 발신은 네이버를 사용했습니다.)
처음 생성하면 상태가 '보류중'으로 뜨는데요, 입력한 메일 수신함에서 승인 링크를 클릭하면 '확인됨'으로 바뀌어 발신/수신 용도로 사용이 가능하게 됩니다.
이어서 멘사테스트 페이지를 크롤링하고 메일 발송을 수행하는 코드를 실행할 Lambda를 구성합니다.
Lambda는 간단한 코드를 서버리스로 실행할 수 있는 AWS 서비스 입니다.
'AWS Lambda - 함수' 에서 '함수 생성' 을 클릭해줍니다.
함수 이름을 작성하고 런타임을 선택한 뒤 '함수 생성' 을 클릭해줍니다.
저는 파이썬으로 크롤링 코드를 작성하였으므로, 런타임은 Python 3.12를 선택하였습니다.
아래와 같이 파이썬으로 멘사 테스트 크롤링 코드를 작성하였습니다.
1) 게시물 번호에 해당하는 태그(td.c.f_ver11)를 확인한 후, 가장 최신 게시물 번호를 추출
2) 해당 번호가 지정한 번호보다 클 경우, send_email() 실행
import requests
from bs4 import BeautifulSoup
import boto3
SES_CLIENT = boto3.client('ses', region_name='ap-northeast-2')
FROM_EMAIL = "****@naver.com"
TO_EMAIL = "****@kakao.com"
def check_new_post():
url = "https://www.mensakorea.org/bbs/board.php?bo_table=test"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 게시물 목록에서 가장 최신 게시물 번호 추출
latest_post = soup.select_one('td.c.f_ver11').text.strip()
return int(latest_post)
def send_email():
subject = "멘사 새로운 게시물 알림"
body = "멘사 새로운 게시물이 등록되었습니다: https://www.mensakorea.org/bbs/board.php?bo_table=test"
response = SES_CLIENT.send_email(
Source=FROM_EMAIL,
Destination={
'ToAddresses': [TO_EMAIL],
},
Message={
'Subject': {'Data': subject},
'Body': {'Text': {'Data': body}}
}
)
print(f"Email sent! Message ID: {response['MessageId']}")
def lambda_handler(event, context):
last_checked_post = 211 # 마지막 게시물 번호
current_latest_post = check_new_post()
if current_latest_post > last_checked_post:
send_email()
last_checked_post = current_latest_post
return {
'statusCode': 200,
'body': 'Lambda function executed successfully!'
}이대로 함수를 실행하면 'no module named' 에러가 발생합니다. Lambda 기본 패키지 라이브러리에 requests 등의 모듈이 없기 때문입니다.
로컬에서 관련 패키지를 다운로드&압축 한 뒤, Lambda Layer를 통해 패키지 압축 파일을 업로드 해주어야 합니다.
pip -t 로 패키지를 다운로드한 후, 다운로드한 폴더를 python_lib.zip으로 압축해줍니다.
pip install requests bs4 boto3 -t . --no-user
'Lambda - 계층 - 계층 생성' 으로 들어가서 방금 압축해준 python_lib.zip을 업로드해 줍니다.
이제 다시 'Labmda - 함수' 로 들어와서 이전에 만든 mensa-alarm 함수에 레이어를 추가해줍니다.
마지막으로 Lambda에서 send_email을 호출할 수 있도록 Lambda의 IAM Role에 AmazonSESFullAccess Policy를 추가해줍니다.
이제 Lambda 코드를 Deploy하고 테스트를 수행해보면, 아래와 같이 함수 실행에 성공함을 확인할 수 있습니다.
메일도 잘 발송되는지 테스트하기 위해 Lambda 코드의 마지막 게시물 번호를 210으로 수정하여 배포하니, 아래와 같이 메일도 잘 발송됨을 확인할 수 있습니다.
이제 Deploy된 Lambda 코드가 주기적으로 실행되도록 Amazon EventBridge로 스케줄러를 구성합니다.
'Amazon EventBridge - 일정' 에서 '일정 생성' 을 클릭해줍니다.
일정 이름을 입력하고, 일정 패턴은 아래와 같이 '반복 일정 - Rate 기반 일정' 으로 10분마다 Lambda 함수를 호출하도록 지정 했습니다.
대상은 AWS Lambda Invoke로 선택하고 이전에 배포한 Lambda 함수를 지정하여 스케줄러를 생성해줍니다.
마지막으로 테스트를 위해 Lambda 코드의 마지막 게시물 번호를 210으로 수정하여 배포하니, 아래와 같이 10분마다 알람 메일이 발송되는 것을 확인할 수 있습니다.
이제 다시 소스코드에서 게시물 번호를 211로 수정하고 새 글 알람이 오기만을 기다리면 됩니다.^^ (막상 신청만 하고 합격이 어려운 것은 함정)
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.