こんにちはこんにちは。僕は今Gitのコミットメッセージを書いています。これが見えているということは成功です。
動機
ご存知の通り、なにかコードを書いてブログを更新するというのを毎日しているが、たまにプッシュし忘れたり下書きだけで投稿し忘れたりする。そうなると悲しいのでどちらかだけで両方達成できるようにしたかった。
コード
はてなブログにAPI*1があったのでそれをGitのHooksで叩いている。
HATENA_ID
: Settings > Advanced > AtomPub > Root endpointにあるhttps://blog.hatena.ne.jp/{HATENA_ID}/{HATENA_BLOG_ID}/atom
HATENA_BLOG_ID
: Settings > Advanced > AtomPub > Root endpointにあるhttps://blog.hatena.ne.jp/{HATENA_ID}/{HATENA_BLOG_ID}/atom
HATENA_BLOG_API_KEY
: Settings > Advanced > AtomPub > API keyにある- 投稿用のメールアドレスを作っていない場合は作るとAPI keyが生成される
- 作っていない場合はリンクが表示されているはず
# .git/hooks/post-commit curl -X POST -u $HATENA_ID:$HATENA_BLOG_API_KEY https://blog.hatena.ne.jp/$HATENA_ID/$HATENA_BLOG_ID/atom/entry -H 'Content-type: text/xml' -d "$($(dirname $0)/xml_builder.rb)"
APIにタイトルや本文を含むXMLをPOSTすることで投稿できる。XMLを手で書いているのが微妙なので今度元気があるときにいい感じにする。
#!/usr/bin/ruby # .git/hooks/xml_builder.rb require 'git' last_commit = Git.open(File.expand_path(__dir__ + '/../../')).log.first raw_title, raw_categories, raw_body = last_commit.message.match(/(.*?)(?:\r?\n)+(.*?)(?:\r?\n)+(.*)/m).captures title = raw_title.strip is_draft = title.start_with?('x') categories = raw_categories.split(',').map(&:strip).reduce('') { |result, category| result + "<category term=\"#{category}\"/>" } body = raw_body.strip puts <<XML <?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.encode(xml: :text)}</title> <content type="text/plain">#{body.encode(xml: :text)}</content> #{categories} <app:control> <app:draft>#{is_draft ? 'yes' : 'no'}</app:draft> </app:control> </entry> XML