読者です 読者をやめる 読者になる 読者になる

TDUPRESS公式ブログ

コラムやエッセイなどをゆる〜く発信中。

委員会Webサイトのコラムページをはてブロ対応した話

委員会技術担当(?)の中の人です。前々から書こうと思ってたネタを書いていきたいと思います。

はてブロ対応ってなに

今年の始め私が一方的に騒いで委員会のコラムページを作りました。コラムを公開する場所としては委員会の公式サイトがある大学管理のFTPサーバ上としました。しかし当時は静的サイトジェネレータ等も使わず、ページは全て静的ファイルを直接修正する事で作っており、コラムが追加される毎にファイルを追加、コラムのエントリーページも直接編集という涙ぐましい努力の上で成り立っておりました。

保守・運用に中指を立てる様な運営方法を何とかしなければと思いつつ一先ずそれでやっていきました。

でも流石にそれは使いづらいどころか、今後後輩に色々と引き継いでいく中であまりにも負担がデカすぎるのでは無いかという事ではてブロ対応に踏み切った訳です。

どうやって対応させたか

はてなブログAtomPub

まずははてなブログのエントリーを取得する必要があります。そこで調べてみると、
はてなブログAtomPub - Hatena Developer Center
こんな便利なものがあるではありませんか!認証方法に関してはOAuthはめんどくさすぎるのでWSSE認証を用いることにしました。

CGIを使ってみる

以前大学のFTPサーバでCGIを動かしてみた経験により既にPythonが動く事は知っていました。となると問題はモジュールです。どんなモジュールがインストールされているか調べてみると、今回の機能を実現する為に利用できそうなモジュールは一通り網羅している事が分かりました。

  • hashlib,base64
  • urllib2
  • xml.etree.ElementTree,xml.sax.saxutils

XMLのパース

個人的な話ですが、APIを叩く時によく使う手法がRequests+BeautifulSoupです。でも今回は標準モジュールでどこまで戦えるかという意味も含めてurilib2とxmlで勝負しました。既にAtomPubのWSSE認証をPythonでやっている方は沢山居たのでそれを漁りつつやりましたがXMLのパースで少し迷いました。

root = ET.fromstring(data)

for entry in root.findall("{http://www.w3.org/2005/Atom}entry"):
    link = escape(entry.findall("{http://www.w3.org/2005/Atom}link")[1].get("href"))
    title = escape(entry.find("{http://www.w3.org/2005/Atom}title").text).encode("utf-8")
    summary = escape(entry.find("{http://www.w3.org/2005/Atom}summary").text).encode("utf-8")

findallメソッドには要素名を渡す必要がありますが、entryとかlinkのみでは何も取得できませんでした。{http://www.w3.org/2005/Atom}という文字列を要素名の前に追加する必要がありました。まぁただ、それだけです。(めっちゃ悩みましたけど…)

対応はできたけど

AtomPubの仕様っぽいんですが、エントリーを取得すると下書きを含めて取得してしまいます。パラメータとかあるのかなって見てみても特に無いっぽいので、現在は下書き状態の記事のタイトルに"si"と追加する事で下書きを弾く様にしています。

それと、AtomPubが一度に取得できるページ数は7件までです。それ以降の取得にはもう一回APIを叩く必要がありますがまだそこには対応していません。(まだ記事も少ないし)

みんなもどんどんコラムを書いてね!

一発目から技術ネタを書いてしまった私が言うのもあれですが、委員会コラムは基本的に何を書いても大丈夫です!技術ネタも楽しいですが、iPhoneの画面を割ってしまった話とか最近買った物の話とかでも大歓迎です。次号に向けてコラムも充実させていきましょう:)