ChatGPTに、今日のブックマークを自動ではてなブログに投稿するPythonスクリプトを書いてもらいました

はてなブログの方に書こうか迷ったのですがこっちで。このスクリプトはずっと欲しいと思っていて、15年前にも一度チャレンジしています。

以下のような準備段階の事も含め書こうと思いましたが、

  • ChatGPTを触って得たコードを書いてもらうコツ
  • ChatGPTに書いてもらったコードを補完するノウハウ
  • 必要な下準備(ライブラリのインストールなど)

長くなるので結果だけ。以下がPythonのスクリプトです。

目次

はてなブックマークの投稿を日毎にはてなブログに投稿するPythonスクリプト

はてなブログの管理画面よりアカウント設定に進み、下の方にあるAPIキーをコピーしておいてください。

import base64
import os
import requests
import feedparser
from dateutil.parser import parse as parse_date
from datetime import datetime, timedelta
import pytz

# 環境変数を追加する
HATENA_BLOG_API_KEY = 'ここにはてなブログのAPIキー'

# ユーザー名とブログIDを設定
USERNAME = 'ここにはてなID(※「id:」は不要)'
BLOG_ID = 'example.hatenablog.com(※ドメイン全部を書く必要があります)'

# タイムゾーンの取得
TIME_ZONE = pytz.timezone('Asia/Tokyo')

# はてなブックマークのRSSフィードからブックマーク情報を取得
def get_bookmarks(username, target_date):
    url = f'https://b.hatena.ne.jp/{USERNAME}/bookmark.rss'
    feed = feedparser.parse(url)

    target_start = TIME_ZONE.localize(datetime.combine(target_date, datetime.min.time()))
    target_end = target_start + timedelta(days=1)

    bookmarks = []
    for entry in feed.entries:
        date = parse_date(entry.updated).astimezone(TIME_ZONE)
        if target_start <= date < target_end:
            bookmark = {
                'title': entry.title,
                'link': entry.link,
                'date': date
            }
            bookmarks.append(bookmark)

    return bookmarks

# はてなブログAPIに投稿する関数
def post_to_hatena_blog(title, content, api_key, blog_id):
    url = f'https://blog.hatena.ne.jp/{USERNAME}/{BLOG_ID}/atom/entry'
    auth_string = f'{USERNAME}:{api_key}'.encode('utf-8')
    auth_base64 = base64.b64encode(auth_string).decode('utf-8')
    headers = {
        'Authorization': f'Basic {auth_base64}',
        'Content-Type': 'application/x.atom+xml',
    }
    data = f'''
        <entry xmlns="http://www.w3.org/2005/Atom">
            <title>{title}</title>
            <content type="text/html">{content}</content>
            <updated></updated>
            <author><name>{USERNAME}</name></author>
        </entry>
    '''.encode('utf-8')
    response = requests.post(url, headers=headers, data=data)
    return response.status_code

# 投稿の内容をHTML形式で作成
def generate_html(bookmarks):
    content = '<ul>'
    for bookmark in bookmarks:
        content += f'<li>{bookmark["title"]} {bookmark["link"]} ({bookmark["date"].strftime("%Y/%m/%d %H:%M:%S")})</li>'
    content += '</ul>'
    return content

def main():
    target_date = datetime.now(TIME_ZONE).date()
    bookmarks = get_bookmarks(USERNAME, target_date)
    if bookmarks:
        title = f"{target_date.strftime('%Y/%m/%d')}のはてなブックマークまとめ"
        content = generate_html(bookmarks)
        status_code = post_to_hatena_blog(title, content, HATENA_BLOG_API_KEY, BLOG_ID)
        if status_code == 201:
            print("ブログに投稿しました")
        else:
            print(f"ブログ投稿に失敗しました (HTTP Status: {status_code})")
    else:
        print("当日のブックマークが見つかりませんでした")

if __name__ == "__main__":
    main()

こちらのスクリプトを、

  1. HatebuDailyPosting.pyとし、デスクトップに保存
  2. ターミナルでcd desktopに移動
  3. python3 HatebuDailyPosting.pyと入力しエンター ※python3とするのがポイント
  4. 「ブログに投稿しました」と表示されたら成功です

あとは

  • cronで定期的に回すようにする
  • コメントも入れるようにする
  • WordPressへの投稿バージョンも書いてもらう

事を考えています。

HTMLが入っていますが、はてなブログの仕様上Proプランに入らないとHTML込みの投稿はできないようです。代わりに直接URLを出すようにしてあります。そうすれば自動リンク機能でリンクされるので。(見た目がごちゃごちゃするのが難点ですが)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次