파이썬 웹 크롤링이용 텔레그램 챗봇5

임재성·2024년 1월 10일
0

무엇을 할까?

  • 사용자가 입력한 날짜를 기반으로 챗봇 응답.

작업

  1. 우선 기존 입력 시간에 맞춰 동작하는 코드를 사용자가 입력했을 때, 동작하도록 수정해야 한다.
    python의 telegram-bot 모듈 사용법 홈페이지의 내용을 기반으로 작성하였음.
  • 프로그램의 메인 실행 부분을 다음과 같이 작성.
  • 기존 실행은 단순히 apscheduler 모듈을 사용하였지만 해당 코드를 통해 사용자가 'start'라는 명령을 입력하면 job_function이라는 메서드를 실행시켜줌.
    (채팅에서 명령어 입력시 '/start'와 같이 전송해야 작동함.)
    if __name__ == "__main__" :
       application = ApplicationBuilder().token(secret.token).build()
       
       start_handler = CommandHandler('start', job_function)
       application.add_handler(start_handler)
       
       application.run_polling()
  1. 다음으로 해당 명령에서 뒤에 날짜를 입력하면 입력한 내용을 기반으로 해당 날짜의 IMAX 정보를 출력하도록 하자.
  • 사용자가 start 명령어를 작성하고 띄어쓰기 후 쓴 내용들은 파라미터로 넘어오게 된다.
  • 사용자 입력으로 넘어온 데이터를 확인하는 코드
def check_args(context) :
    
    text_caps = context.args
    
    if len(text_caps) > 0 :
        if re.match(r'^([\s\d]+){8}$', text_caps[0]) and check_is_valid_date(text_caps[0]) :            
            return text_caps[0]
        else :
            return ''
    else :
        return ''


def check_is_valid_date(text) :
    try :
        datetime_format = "%Y%m%d"
        datetime_result = datetime.datetime.strptime(text, datetime_format)

        max_datetime = datetime.datetime.now() + datetime.timedelta(days=22)

        if datetime_result > max_datetime or datetime_result < datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) :            
            return False

        return True
    except ValueError as e :
        return False
  • check_args : 사용자의 입력에 대한 유효성 검사를 진행하고 해당 내용에 대해 결과 값을 반환
    (정규식을 통해 입력된 문자가 8자리수의 숫자로만 구성되어있는지 확인하기)
  • check_is_valid_date : check_args에서 호출하는 메서드로 날짜 포맷이 맞는지 여부를 검사한다.
  • 주의점으로 기존 asyncio.run을 통해 실행하던 내용들은 동일한 스레드에서 다른 asyncio 이벤트 루프가 실행중인 경우 해당 함수를 호출할 수 없기에 바로 호출하는 방식으로 사용.
  • 전체코드는 깃허브에 올라가 있으니 보시면 됩니다.
profile
조금씩 앞으로

0개의 댓글