はてなブログの方に書こうか迷ったのですがこっちで。このスクリプトはずっと欲しいと思っていて、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()
こちらのスクリプトを、
- HatebuDailyPosting.pyとし、デスクトップに保存
- ターミナルでcd desktopに移動
- python3 HatebuDailyPosting.pyと入力しエンター ※python3とするのがポイント
- 「ブログに投稿しました」と表示されたら成功です
あとは
- cronで定期的に回すようにする
- コメントも入れるようにする
- WordPressへの投稿バージョンも書いてもらう
事を考えています。
HTMLが入っていますが、はてなブログの仕様上Proプランに入らないとHTML込みの投稿はできないようです。代わりに直接URLを出すようにしてあります。そうすれば自動リンク機能でリンクされるので。(見た目がごちゃごちゃするのが難点ですが)
コメント