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

by shigemk2

当面は技術的なことしか書かない

はてなダイアリーのヘッダー、フッター、CSSを自動デプロイするツールを作ってみた

はてな

shigemk2/hate-da-deploy · GitHub

「管理ページ→デザイン→詳細」でCSSやヘッダー、フッターを直接弄ることがあるのだけれど、 毎回ブラウザで操作するのが面倒なんすよ。
CSSとかがバージョン管理できないから「あれ、前に編集したCSSってどんなだったっけ?」ってなるし、かといってローカルでバージョン管理するならコマンド1つでCSSとか反映できるように自動化したいっていうのが人情ですよ。

しかし、はてなダイアリーCSSやヘッダーを直接弄るAPIは用意されていないので、 ローカルでファイルを弄って、コマンド1つでCSSやヘッダーを反映させるようにしました。

そのためのツールとしてwatirを使いました。
Rubyでブラウザを操作できるGem watir - 酒と泪とRubyとRailsと

watirでブラウザを操作してログインしたり、フォームに投稿したりできるわけですね。
本来はテスト用のツールのはずですが、
実際にブログの投稿もwatirで出来たりするので、
CSSやヘッダーの修正をwatirでやることにしました。

Watir.com | Web Application Testing in Ruby

# coding: utf-8
require 'bundler'
Bundler.require
require 'yaml'

# yamlファイル読み込み
yaml = YAML.load_file "hatena.yaml"

# ログイン
browser = Watir::Browser.new :ff
browser.goto(yaml["login_url"])

element = browser.text_field(:id, "login-name")
element.flash
element.value = yaml["user_id"]

element = browser.text_field(:class, "password")
element.flash
element.value = yaml["password"]

element = browser.button(:class, "custom-button")
element.flash
element.click
browser.wait

# デザインページへアクセス
browser.goto(yaml["detail_url"])

# ヘッダーを編集
header = File.open("hatena-header.html", "r")
element = browser.text_field(:id, "textarea1")
element.flash
element.value = header.read.encode("utf-8")
header.close

# フッターを編集
footer = File.open("hatena-footer.html", "r")
element = browser.text_field(:id, "textarea2")
element.flash
element.value = footer.read.encode("utf-8")
footer.close

# CSSを編集
css = File.open("hatena.css", "r")
element = browser.text_field(:id, "textarea3")
element.flash
element.value = css.read.encode("utf-8")
css.close

element = browser.button(:name, "save")
element.flash
element.click

browser.goto(yaml["top_url"])
puts browser.url

id名とかclass名とかはデベロッパーツールでサーチします。

開発にあたってのハマりどころはココ。
というか、フォームに投稿する部分。

へたれたプログラマの憂鬱 watirその2
ruby 1.8 watir 文字化け - 電波素子は電気執事の夢を見るか?

header = File.open("hatena-header.html", "r")
element = browser.text_field(:id, "textarea1")
element.flash
element.value = header.read.encode("utf-8")
header.close

フォームに日本語を投稿すると文字化けするんすよね。
シバンにutf-8って書くとか、
フォームに投稿する前に読み込んだ文字列をutf-8に変換するとかいろいろやったんだけど、
utf-8に変換したうえで、実行するブラウザをChromeからFirefoxに変えると文字化けせずに
ちゃんと投稿できました。なんでだろう。