はてなブログの記事の編集モードを一括で変更する
昨日の記事で「はてなブログ エクスポートスクリプト in Python」を作ったが、その中で「エクスポートしたものをはてなブログにインポートすると編集モードが見たままモードでインポートされる」と書いたが、それの対策スクリプト。
これははてなブログの仕様のようだが、はてなブログのAtomPub APIから記事を上書きすると、ブログに設定している編集モードが採用されるとのこと。
これは「はてなブログ Atom Pub」の「ブログエントリの編集」に「新規ブログエントリの投稿と同じく、編集時にもブログに登録された記法が適用されます。」とあることから「仕様」であることがわかる。今気付いたがBloggerのように記事単位で編集モードを変えることはできない様子。
- 作者: Mark Lutz,夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/02/26
- メディア: 大型本
- 購入: 12人 クリック: 423回
- この商品を含むブログ (133件) を見る
と言う事でスクリプトは例のごとく最下部に貼りつけておく。これも例のごとく使い方は「はてなブログ AtomPub APIのPython WSSEサンプルコード」と同じ。
注意としては、「全ての記事」を上書きするので全ての記事を設定の編集モードにしてしまう。その為記事数が多いブログではそこそこ時間がかかる可能性がある。また、スクリプトを編集する際は間違ってもHTTP DELETE命令を出さないように注意してほしい。
また、PythonでHTTP PUTをするのが少々手間が掛かる様子であったため、requestsモジュールを使うことにした。pipからインストールできるがこれは便利なものだ。
#!/usr/bin/python import datetime import random import hashlib import base64 import urllib2 import requests from xml.dom import minidom userid = "User ID" apikey = "API Key" blogid = "Blog ID" apiurl = "http://blog.hatena.ne.jp/%s/%s/atom/entry" % ( userid, blogid) def make_wsse( userid, apikey): created_at = datetime.datetime.now().isoformat() + "Z" nonce = hashlib.sha1( str( random.random())).digest() digest = hashlib.sha1( nonce + created_at + apikey).digest() return 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"' % ( userid, base64.b64encode( digest), base64.b64encode( nonce), created_at) wsse = make_wsse( userid, apikey) headers = { "X-WSSE": wsse} url = apiurl end = False while True: request = urllib2.Request( url, headers=headers) response = urllib2.urlopen( request) dom = minidom.parseString( response.read()) links = dom.getElementsByTagName( "link") for link in links: if link.attributes["rel"].value == "next": url = link.attributes["href"].value break else: end = True for entry in dom.getElementsByTagName( "entry"): entry_links = entry.getElementsByTagName( "link") for entry_link in entry_links: if entry_link.attributes["rel"].value == "edit": edit_url = entry_link.attributes["href"].value for node in entry.getElementsByTagName( "hatena:formatted-content"): entry.removeChild( node) entry.setAttribute( "xmlns", "http://www.w3.org/2005/Atom") entry.setAttribute( "xmlns:app", "http://www.w3.org/2007/app") new_entry = '<?xml version="1.0" encoding="utf-8"?>\n' + entry.toxml() edit_request = requests.put( edit_url, headers={ "Content-Type": "text/xml", "X-WSSE": wsse}, data=new_entry.encode( "UTF-8")) if end: break
- 作者: 辻真吾
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/24
- メディア: 大型本
- 購入: 19人 クリック: 199回
- この商品を含むブログ (59件) を見る
パーフェクトPython (PERFECT SERIES 5)
- 作者: Pythonサポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
- 出版社/メーカー: 技術評論社
- 発売日: 2013/03/05
- メディア: 大型本
- 購入: 1人 クリック: 65回
- この商品を含むブログ (30件) を見る
- 作者: Mark Lutz,夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/02/26
- メディア: 大型本
- 購入: 12人 クリック: 423回
- この商品を含むブログ (133件) を見る
- 作者: Tarek Ziade,稲田直哉,渋川よしき,清水川貴之,森本哲也
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2010/05/28
- メディア: 大型本
- 購入: 33人 クリック: 791回
- この商品を含むブログ (90件) を見る
- 作者: ビープラウド
- 出版社/メーカー: 秀和システム
- 発売日: 2012/03/26
- メディア: 単行本
- 購入: 6人 クリック: 765回
- この商品を含むブログ (27件) を見る