ぜのぜ

しりとりしようぜのぜのぜのぜ

218日目 コミットメッセージをブログに投稿する

こんにちはこんにちは。僕は今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