はじめに
はてなブログに自動でエントリーを投稿したい事があったので、その時に書いたものをメモ代わりにおいておきます。一応全体的な機能としては、スクレイピングした情報をはてなブログに自動で下書き投稿するというものでしたが、今回は**「はてなブログに下書き投稿する」**というコードだけ置いて置きます。
#コード
import datetime
import random
import hashlib
import base64
import requests
import time
def create_wsse(username, password):
created = datetime.datetime.now().isoformat() + "Z"
b_nonce = hashlib.sha1(str(random.random()).encode()).digest()
b_digest = hashlib.sha1(b_nonce + created.encode() + password.encode()).digest()
s = 'UsernameToken Username="{0}", PasswordDigest="{1}", Nonce="{2}", Created="{3}"'
return s.format(username, base64.b64encode(b_digest).decode(), base64.b64encode(b_nonce).decode(), created)
def get_entry_data(news_cards):
TEMPLATE = """<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom"
xmlns:app="http://www.w3.org/2007/app">
<title>{title}</title>
<author><name>{name}</name></author>
<content type="text/plain"><![CDATA[{content}]]></content>
<updated></updated>
<app:control>
<app:draft>yes</app:draft>
</app:control>
</entry>
"""
#投稿するコンテンツの作成
entry_data = ''
for news_card in news_cards:
entry_data += news_card + "\n"
#テンプレにtitle, name, contentを挿入
entry = TEMPLATE.format(
title = <title>,
name = <name>,
content = entry_data,
draft = "yes"
)
return entry
def post_news_hatena(END_POINT,username, api_key, entry):
wsse = create_wsse(username, api_key)
r = requests.post(END_POINT + "/entry", data=entry.encode('utf-8'), headers={'X-WSSE': wsse})
if r.status_code == 201:
print(r.text)
print(u"\n投稿しました。")
else:
print(r.text)
print(u"\n投稿に失敗しました。")
実行するコードは↓です。今回はエントリーの作成をnews_cards
というリストを引き数にとって作成しています。今回は例として、スクレイピングした情報をリストに変換していたのでこの様にしました。この辺はやりたいことに応じて変えると良いと思います。
USER_NAME = <USER_NAME>
API_KEY = <API_KEY>
END_POINT = 'https://blog.hatena.ne.jp/{username}/{username}.hatenablog.com/atom'.format(username=USER_NAME)
#エントリーの作成
entry = get_entry_data(news_cards)
#投稿
post_news_hatena(END_POINT,USER_NAME, API_KEY, entry)
#おわりに
ブログに自動で投稿する機会はあまりないかもしれませんが、wsse認証を作ったリクエストの送り方としては使えるかもしれません。wsse認証自体あまり見ない気もしますが...