はてなブログでデータフレームの自動投稿を実装する方法

2025-02-15 02:41

この記事はPythonで実装した前提となります。

(Python以外で実装したい人はすみません。。)

 

はてなブログにAtompubなるAPIがあるらしいです。

※APIとは→アプリケーションプログラムインターフェースの略。プログラムとアプリをつなげる機能のこと。例えばテレビとオーディオ機器をつなぐのはオーディオインターフェースとかの一種ぐらいに考えてもらえれば助かります。

 

このAPIを使って、はてなブログへの自動投稿を実装したので困ったところと合わせて紹介します。

というわけで完成形は以下です。

 

    def hatena_entry_remake(title,race_id,prediction_dir="./prediction_results/"):

        # はてなブログの設定情報

        HATENA_ID = "はてなIDを入れる"

        BLOG_DOMAIN = "ブログドメインを入れる"

        API_KEY = "APIキーを入れる。確認方法は気が向いたらまとめるかも※絶対公開しないでください"

        BLOG_URL = f"https://blog.hatena.ne.jp/{HATENA_ID}/{BLOG_DOMAIN}/atom/entry"

        # 記事内容

        timestamp = self.making_timestamp()

        data = pd.read_pickle(f"{prediction_dir}/{timestamp}/{race_id}.pickle")

        html_table = data.to_html(index=False, border=1, classes='dataframe')

        # AtomPubエントリ

        data = self.create_atom_entry(title, html_table)

 

        # リクエストの送信

        response = requests.post(

            BLOG_URL,

            headers={'Content-Type': 'application/atom+xml'},

            data=data,

            auth=HTTPBasicAuth(HATENA_ID, API_KEY)  # 認証

        )

 

        # 結果の確認

        if response.status_code == 201:

            print("記事が正常に投稿されました")

        else:

            print(f"投稿に失敗しました: {response.status_code}")

 

    def create_atom_entry(title, content):

        entry = Element('entry', {'xmlns': 'http://www.w3.org/2005/Atom'})

        # タイトル

        title_elem = SubElement(entry, 'title')

        title_elem.text = title

        # 本文

        content_elem = SubElement(entry, 'content', {'type': 'html'})

        content_elem.text = content

        # カテゴリ(任意)

        category = SubElement(entry, 'category', {'term': 'Python', 'scheme': 'http://www.hatena.ne.jp/categories'})

        return tostring(entry, encoding='utf-8')

 

このコードを作ってスケジュール実行させて実装しました。

スケジュール実行の記事もいつか作りたいなとは思っています。

全体的になんとなく伝わると嬉しいです。

(めちゃくちゃ雑に切り出しているので質問いただければ答えさせていただきます)

 

□困ったこと紹介

・投降後にうまくHTML成形されなかった。→ content_elem = SubElement(entry, 'content', {'type': 'html'})

を含めて解決。

どうやら、明示的にどういう情報かを伝えないとタグとか扱ってくれないらしい。

だから、データ形式に合わせてここを変えてあげればうまくいきそう。

 

□いつか作る予定記事

・Pythonでスケジュール実行

・はてなブログAPIキーの確認方法

 

□実際に投稿しているブログ

(競馬予測を自動投稿しています。完全に自分用なので管理性とかは絶望てきになっています。)

リンク:https://matsuyuu09.hatenablog.com/