안녕하세요! 블로그 자동 포스팅 봇 만들기, 대망의 일곱 번째 시간입니다.
지난 6편 까지 우리는 AI가 글과 그림을 모두 창작하고, Selenium이 이를 블로그에 업로드하는 놀라운 자동화 시스템을
구축했습니다.
하지만 지금까지는 우리가 "시작!" 버튼을 눌러줘야만 움직였죠. 이번 시간에는 APScheduler라는 강력한 스케줄링 도구를 장착하여, 우리 봇이 스스로 시간을 확인하고 정해진 시간에 알아서 포스팅하는, 진정한 의미의 "자동화"를 완성해 보겠습니다.
APScheduler란?
APScheduler (Advanced Python Scheduler)는 Python 코드를 미래의 특정 시간에, 또는 주기적으로 실행할 수 있게 해주는 라이브러리입니다. 마치 똑똑한 비서에게 "이 일, 매일 아침 9시에 반복해줘"라고 지시하는 것과 같습니다.
주요 기능 | 설명 |
---|---|
특정 시간 실행 | 예: 2025년 12월 25일 00시에 실행 |
주기적 실행 (Interval) | 예: 매 60분마다 실행 (우리가 사용할 기능!) |
매일 특정 시간 실행 (Cron) | 예: 매주 월요일~금요일 오전 9시 30분에 실행 |
스케줄링 기능 추가하기
먼저, 터미널에 아래 명령어를 입력해 APScheduler를 설치합니다.
pip install apscheduler
이제 app.py 파일을 수정하여, Flask 웹 앱이 시작될 때 스케줄러도 함께 실행되고, 사용자의 요청에 따라
작업을 등록하거나 중지할 수 있도록 만들어야 합니다.
1 # app.py 파일
2
3 from flask import Flask, render_template, jsonify, request, redirect, url_for, flash
4 from apscheduler.schedulers.background import BackgroundScheduler
5 from apscheduler.jobstores.base import JobLookupError
6 import main
7
8 app = Flask(__name__)
9 # ... (기타 설정)
10
11 # 백그라운드에서 실행될 스케줄러 생성 및 시작
12 scheduler = BackgroundScheduler(daemon=True)
13 scheduler.start()
14
15 # 스케줄러가 호출할 실제 작업 함수
16 def scheduled_job(params):
17 print(f"스케줄된 작업 실행: {params}")
18 main.start_blog_automation(...) # main.py의 함수를 호출
19
20 @app.route('/run', methods=['POST'])
21 def run_automation_route():
22 run_type = request.form.get('run_type') # 'now' 또는 'schedule'
23
24 if run_type == 'schedule':
25 interval = int(request.form.get('interval', 60))
26
27 # 기존에 등록된 작업이 있다면 삭제
28 if scheduler.get_job('my_schedule'):
29 scheduler.remove_job('my_schedule')
30
31 # 새로운 작업 등록
32 scheduler.add_job(
33 scheduled_job,
34 'interval',
35 minutes=interval,
36 id='my_schedule',
37 args=[job_params] # AI 모델, 주제 등 전달
38 )
39 flash(f"{interval}분 간격으로 스케줄이 등록되었습니다.")
40
41 else: # 즉시 실행
42 # ... (기존의 즉시 실행 로직)
43
44 return redirect(url_for('index'))
45
46 @app.route('/stop_schedule', methods=['POST'])
47 def stop_schedule():
48 try:
49 scheduler.remove_job('my_schedule')
50 flash("스케줄이 중지되었습니다.")
51 except JobLookupError:
52 flash("실행 중인 스케줄이 없습니다.")
53 return redirect(url_for('index'))
웹 UI에 스케줄 기능 연동
마지막으로, index.html에 사용자가 직접 실행 방식을 선택하고, 시간을 입력하며, 스케줄을 중지할 수 있는
버튼들을 추가합니다.
1 <!-- templates/index.html 파일 -->
2
3 <!-- 스케줄이 실행 중일 때 보여줄 정보창 -->
4 {% if schedule_status %}
5 <div class="schedule-info">
6 <p><strong>현재 스케줄이 실행 중입니다.</strong></p>
7 <p>{{ schedule_status }}</p>
8 <form action="/stop_schedule" method="post">
9 <button class="stop-btn" type="submit">🚫 스케줄 중지하기</button>
10 </form>
11 </div>
12 {% else %}
13
14 <!-- 스케줄 설정 폼 -->
15 <form id="automation-form" action="/run" method="post">
16 <div class="form-section">
17 <label>실행 방식</label>
18 <label><input type="radio" name="run_type" value="now" checked> 즉시 실행</label>
19 <label><input type="radio" name="run_type" value="schedule"> 스케줄 예약</label>
20 </div>
21 <div class="form-group" id="schedule-group" style="display: none;">
22 <label for="interval">실행 주기 (분)</label>
23 <input type="number" id="interval" name="interval" value="60" min="1">
24 </div>
25 <!-- ... (기타 AI, 주제 선택 옵션) ... -->
26 <button id="submit-btn" type="submit">🚀 포스팅 시작하기</button>
27 </form>
28 {% endif %}
[핵심 로직]
BackgroundScheduler
: Flask 웹 서버와 독립적으로, 백그라운드에서 조용히 실행되는
스케줄러입니다.scheduler.add_job()
: 사용자가 웹에서 설정한 시간 간격(interval)과 작업
내용(main.start_blog_automation)을 스케줄러에 등록합니다.scheduler.remove_job()
: 등록된 작업을 ID로 찾아 제거하여 스케줄을 중지시킵니다.
다음 이야기
드디어 모든 기능이 완성되었습니다! 이제 우리 봇은 AI로 콘텐츠를 창작하고, 웹을 자동화하여 포스팅하며, 심지어 정해진 시간에 스스로 일어나는 완벽한 자동화 시스템이 되었습니다.
긴 여정의 마지막 단계인 다음 포스팅에서는, 이 프로그램을 내 컴퓨터뿐만 아니라 다른 사람들도 쉽게 사용할 수 있도록 .exe
실행 파일로 만들고, 사용자 매뉴얼과 함께 배포하는 방법에 대해 알아보겠습니다.
'코딩 > 블로그 자동화' 카테고리의 다른 글
[자동화 프로젝트 #6] DALL-E 3 연동: AI가 대표 이미지까지! (4) | 2025.07.23 |
---|---|
[자동화 프로젝트 #5] ChatGPT, Claude 등 다양한 AI 모델 연동하기 (0) | 2025.07.23 |
[자동화 프로젝트 #4] Flask로 내 파이썬 스크립트에 웹 UI 입히기 (1) | 2025.07.23 |
[자동화 프로젝트 #3] Selenium으로 티스토리 완전 정복 (2) | 2025.07.23 |
[자동화 프로젝트 #2] Python과 Gemini AI 연동하기 (4) | 2025.07.22 |
※ 위 배너는 쿠팡 파트너스 활동의 일환으로 이에 따른 일정액의 수수료를 제공받습니다