4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pythonでwsse認証を用いて、はてなブログにエントリーを投稿する

Last updated at Posted at 2018-02-18

はじめに

 はてなブログに自動でエントリーを投稿したい事があったので、その時に書いたものをメモ代わりにおいておきます。一応全体的な機能としては、スクレイピングした情報をはてなブログに自動で下書き投稿するというものでしたが、今回は**「はてなブログに下書き投稿する」**というコードだけ置いて置きます。

#コード

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認証自体あまり見ない気もしますが...

参考:はてなブログAtomPub

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?