自宅やオフィスのMac miniを使い、週に2回(火曜・金曜)にAIで記事を生成してWordPressへ下書き投稿する自動化ワークフローを、制作現場で使える実例としてまとめます。OpenAIなどの生成APIを用い、macOSネイティブの起動スケジューラ(launchd)で定期実行する構成です。セキュリティやログの取り方、実装でつまずきやすいポイントも併せて説明します。
全体像と前提
今回の構成は次のとおりです。
- Mac mini(macOS)でスクリプトを実行
- PythonスクリプトでAI(例:OpenAI API)に記事生成を依頼
- 生成結果をWordPress REST APIで下書き(status: draft)として投稿
- スケジュールはlaunchdで火曜・金曜の午前9時に実行
前提条件
- Mac miniにPython 3(Homebrewやpyenvで管理しておくと便利)
- OpenAI等のAPIキー(環境変数で管理)
- WordPressのApplication Password(または適切な認証)
- ネットワーク接続、必要なポートが開いていること
ステップ1:Pythonで記事生成+WordPress投稿スクリプト
まずは動作するスクリプトを作ります。依存はrequestsとopenaiを想定します。
requirements.txt
requests>=2.25.0
openai>=0.27.0
python-dotenv>=0.21.0
.env(ローカル開発用の例)
# .env
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
WP_SITE=https://example.com
WP_USER=your_wp_username
WP_APP_PASSWORD=abcd efgh ijkl mnop
generate_and_post.py(主要コード)
#!/usr/bin/env python3
import os
import requests
import openai
from dotenv import load_dotenv
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
WP_SITE = os.getenv('WP_SITE')
WP_USER = os.getenv('WP_USER')
WP_APP_PASSWORD = os.getenv('WP_APP_PASSWORD')
if not (OPENAI_API_KEY and WP_SITE and WP_USER and WP_APP_PASSWORD):
raise SystemExit('Missing environment variables')
openai.api_key = OPENAI_API_KEY
def generate_article(topic='Web制作の最新トレンド'):
system = 'あなたは日本語で分かりやすく、制作現場ですぐ使える記事を書くアシスタントです。見出し(H2/H3)、導入、まとめを含むHTMLを出力してください。'
user = f'記事テーマ: {topic}\n目安: 600〜900文字、HTMLで出力。'
resp = openai.ChatCompletion.create(
model='gpt-4o-mini',
messages=[{'role':'system','content':system},{'role':'user','content':user}],
max_tokens=1200
)
content = resp['choices'][0]['message']['content']
return content
def post_to_wordpress(title, html_content, excerpt=''):
url = f"{WP_SITE.rstrip('/')}/wp-json/wp/v2/posts"
data = {
'title': title,
'content': html_content,
'excerpt': excerpt,
'status': 'draft'
}
resp = requests.post(url, auth=(WP_USER, WP_APP_PASSWORD), json=data)
resp.raise_for_status()
return resp.json()
if __name__ == '__main__':
topic = '週刊Web制作: 自動化ワークフロー' # ここは動的に変えてもOK
html = generate_article(topic)
# 投稿タイトルは最初のH2を抜粋する等、簡易処理
title = topic
try:
result = post_to_wordpress(title, html, excerpt='AIで生成した下書きです。')
print('Posted draft id:', result.get('id'))
except Exception as e:
print('Failed to post:', e)
ポイント:APIキーやApplication Passwordは.envで管理し、リポジトリに含めないようにします。WordPress側は「ユーザー > プロフィール > Application Passwords」から生成するのが簡単です。
ステップ2:launchdで火曜・金曜に実行
macOSではlaunchdを使うのが自然です。LaunchAgentsにplistを置くと、指定の曜日・時刻に実行できます。Weekdayは1=日曜、2=月曜…7=土曜ですので、火曜は3、金曜は6になります。
plistの例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.yourname.ai-article-generator</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python3</string>
<string>/Users/youruser/path/to/generate_and_post.py</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Weekday</key>
<integer>3</integer>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>6</integer>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</array>
<key>StandardOutPath</key>
<string>/Users/youruser/logs/ai_gen_stdout.log</string>
<key>StandardErrorPath</key>
<string>/Users/youruser/logs/ai_gen_stderr.log</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
保存場所は ~/Library/LaunchAgents/com.yourname.ai-article-generator.plist にし、次のコマンドで読み込みます。
launchctl unload ~/Library/LaunchAgents/com.yourname.ai-article-generator.plist
launchctl load ~/Library/LaunchAgents/com.yourname.ai-article-generator.plist
注意点:launchdはログインユーザーの環境変数を読みません。スクリプト内で絶対パスを使う、.envを明示的に読み込む、またはplistでEnvironmentVariablesキーを追加して必要な変数を渡す方法があります。
運用上の注意と改善案
- コスト管理:OpenAI等はトークン消費が発生します。生成トークンの上限を設定し、頻度や品質とのバランスを調整してください。
- 品質チェック:生成記事は必ず下書きで受け取り、編集者が確認してから公開するフローにしてください(事実誤認や著作権リスクを避けるため)。
- ログと障害検知:stdout/stderrをログに残し、異常時にSlackやメールで通知する仕組みを入れると運用が楽になります。
- 安全性:APIキーやApplication Passwordは最小限の権限にし、漏洩対策(定期ローテーション)を行ってください。
- バージョン管理:生成モデルの指定やスクリプトをGitで管理し、変更履歴を追えるようにします。
トークン消費ですが月20〜30投稿くらいなら¥500/月もあれば充分ではあります。
ここに記事内に生成画像をいくつも挿れるとなると変わって来る感じです。
トラブルシューティングのヒント
- launchdで動かない場合:ログファイルと
launchctl listの出力を確認し、権限やパスをチェックします。 - WordPressの認証エラー:Application Passwordの形式(スペース含む)とユーザー名が正しいか確認します。HTTPSが必須です。
- API呼び出し失敗:レート制限やネットワークエラー、APIキーの権限を確認します。
まとめ
Mac miniとlaunchdを使った定期実行と、OpenAI+WordPress REST APIによる下書き投稿の組み合わせは、少ない手間で週2回のコンテンツ生成ワークフローを実現できます。まずはローカルでスクリプトを動かして動作を確認し、ログと下書き運用により公開前のチェックを入れることをおすすめします。運用が安定したら、トピックの自動切替やメタデータ(カテゴリ・タグ)の自動付与などを段階的に追加していくと良いでしょう。


コメント