日記をXに投稿!Python + Diariumで作る超簡単な投稿スクリプト

日記

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に記録として残せるし、振り返りも楽になりそう! やりたいことが形になっていくのは最高に楽しいね!🔥🚀

コメント

タイトルとURLをコピーしました