Diariumの日記をX(旧Twitter)に自動投稿するまでの記録
最近、日記アプリ Diarium に書いた内容を X(旧Twitter) にも投稿したくなった。 手作業でコピペするのは面倒だから、Pythonを使って自動化に挑戦!
※これ、chatGPTを使用したため、記事投稿含めて半日かからずにできた作業です
いやー、ほんとchatGPTすごい・・・
1. 開発環境の準備
まずはMacBook(M3チップ)で Pythonの仮想環境 を作成。
cd ~/Documents/Projects/diarium_to_X
python3 -m venv venv
source venv/bin/activate
X APIを使うために tweepy
と python-dotenv
をインストール。
pip3 install tweepy python-dotenv
APIキーの管理は .env
ファイルで!
touch .env
中身はこんな感じ。もちろんここではキーは隠します
API_KEY="your_api_key"
API_SECRET="your_api_secret"
ACCESS_TOKEN="your_access_token"
ACCESS_TOKEN_SECRET="your_access_token_secret"
GitHubに上げると危険なので、 .gitignore
に追加!
echo ".env" >> .gitignore
2. X API の設定と最初の挫折
X Developer Portal にアクセスし、開発者アカウントを作成。
- 「Web App, Automated App or Bot」 を選択
- 「Read and Write」 の権限を付与
- APIキーとアクセストークンを取得し
.env
に保存
これでX APIを使う準備が整った……はずだった。
最初に tweepy
を使って X API v1.1 の update_status()
でツイートしようとしたけど、 エラー 453 – 「このエンドポイントにはアクセスできません」 というメッセージが。😱
3. APIプランを確認 → X API v2 への移行
調べた結果、X API の 無料プラン(Free)では v1.1 の一部エンドポイントが制限されている ことが判明。
無料でも X API v2 の POST /2/tweets
なら投稿できる可能性があったので、 スクリプトを v2 API に対応させるよう書き直し た。
これで、再チャレンジ!!💪
4. Diariumのデータベースを解析
Diariumは SQLite 形式でデータを保存しているらしい。
データベースの場所はここ。
~/Library/Mobile Documents/com~apple~CloudDocs/Apps/Diarium/Diarium_2025-03-01.diary
SQLiteで中身を確認。
sqlite3 Diarium_2025-03-01.diary
.tables
すると、 Entries
テーブルに 日記の本文が保存されている ことが分かった。
SELECT DiaryEntryId, Heading, Text FROM Entries ORDER BY DiaryEntryId DESC LIMIT 1;
HTMLタグが含まれていたので、Pythonで削除することに。
5. PythonスクリプトでXに投稿(v2対応版)
SQLiteから最新の日記を取得し、Xに投稿するスクリプトを作成。
※Diariumアプリのデータ管理がSQLLiteではなくなり、独自で圧縮または暗号化されているらしく、バックアップ機能で出力しないといけななったみたい。拡張子は.diaryですが、中身はSQLLiteです。ここは非常に残念な状況ですね・・・
import tweepy
import sqlite3
import os
import re
from dotenv import load_dotenv
# .env の内容を読み込む
load_dotenv()
# APIキー設定
client = tweepy.Client(
consumer_key=os.getenv("API_KEY"),
consumer_secret=os.getenv("API_SECRET"),
access_token=os.getenv("ACCESS_TOKEN"),
access_token_secret=os.getenv("ACCESS_TOKEN_SECRET")
)
# データベースのパス
db_path = "~/Library/Mobile Documents/com~apple~CloudDocs/Apps/Diarium/XXXXXX.diary"
# HTMLタグを削除する関数
def remove_html_tags(text):
return re.sub(r'<.*?>', '', text)
# 最新の日記を取得して投稿
def post_to_x():
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute("SELECT Heading, Text FROM Entries ORDER BY DiaryEntryId DESC LIMIT 1")
row = cursor.fetchone()
conn.close()
if row:
heading = row[0] if row[0] else "(No Title)"
text = remove_html_tags(row[1]) if row[1] else ""
post_content = f"{heading}\n{text[:280]}"
print("📌 投稿予定の内容:")
print(post_content)
confirm = input("📝 投稿しますか? (y/n): ")
if confirm.lower() == "y":
client.create_tweet(text=post_content)
print("✅ 投稿成功!")
else:
print("🚫 投稿をキャンセルしました。")
if __name__ == "__main__":
post_to_x()
実行!
python3 post_to_x.py
→ 無事にXに投稿成功!🎉
6. まとめ & 次のステップ
✅ Diariumの日記を自動取得 & Xに投稿できた! ✅ API v1.1 ではなく、v2 API を使うことで無料プランでも投稿可能になった! ✅ 投稿前に確認できる仕様で安心
次は 画像付き投稿 に挑戦予定!📸✨
この仕組みがあれば、日記をXに記録として残せるし、振り返りも楽になりそう! やりたいことが形になっていくのは最高に楽しいね!🔥🚀
コメント