わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

goo.glの短縮URLはRubyスクリプトからcurlコマンドへ

昨日の記事では,goo.glの短縮URLを記載しました.
そのURLを生成するのに,自作のRubyスクリプトを用いたのですが,その際,次のようなエラーが発生しました.

(略)/ruby/lib/ruby/gems/2.1.0/gems/multi_json-1.8.0/lib/multi_json.rb:108:in `rescue in load_adapter': Did not recognize your adapter specification. (ArgumentError)

エラーの詳細によると,自作スクリプトからgoogl-0.6.3,httparty-0.10.2,multi_json-1.8.0と呼び出していました.multi_json.rbのエラー発生箇所の近辺を見たものの,不具合解消には至りませんでした.
別の手段を…なんと,Google本家に,実行コマンドが書かれていました.

curl https://www.googleapis.com/urlshortener/v1/url \
  -H 'Content-Type: application/json' \
  -d '{"longUrl": "http://www.google.com/"}'
Actions

これをもとに,zsh用のfunctionを書きました.

function googl_url () {
  local longurl=$1
  local apiurl=https://www.googleapis.com/urlshortener/v1/url
  local json="{\"longUrl\": \"${longurl}\"}"

  echo "curl $apiurl -H 'Content-Type: application/json' -d '${json}'"
  curl $apiurl -H 'Content-Type: application/json' -d $json
}

function ggl () {
  for url in $@; do googl_url $url; done
}

コマンドラインで使うのは,gglのほうです.各引数をURLとみなして,ひとつずつ短縮URLを求めます.1個のURLから短縮URLを求めるのは,googl_urlとして定義しています.
動作は:

$ ggl http://d.hatena.ne.jp/takehikom/ http://www.google.{com,co.jp}
curl https://www.googleapis.com/urlshortener/v1/url -H 'Content-Type: application/json' -d '{"longUrl": "http://d.hatena.ne.jp/takehikom/"}'
{
"kind": "urlshortener#url",
"id": "http://goo.gl/t4PJE",
"longUrl": "http://d.hatena.ne.jp/takehikom/"
}
curl https://www.googleapis.com/urlshortener/v1/url -H 'Content-Type: application/json' -d '{"longUrl": "http://www.google.com"}'
{
"kind": "urlshortener#url",
"id": "http://goo.gl/fbsS",
"longUrl": "http://www.google.com/"
}
curl https://www.googleapis.com/urlshortener/v1/url -H 'Content-Type: application/json' -d '{"longUrl": "http://www.google.co.jp"}'
{
"kind": "urlshortener#url",
"id": "http://goo.gl/hLp4",
"longUrl": "http://www.google.co.jp/"
}


それでも,Rubyでどう書けばいいかを調査していくと,次のページを見つけました.

試したところ,require "json"が必要な一方で,keyの設定はすることなく,動作しました.
もう一つ,WebのAPIRubyスクリプトなどからアクセス(作成)しやすい短縮URLサービスにbitlyがあります.Amazon商品のURLを送ると,bit.lyではなくamzn.toになってくれるという特色もあります.
こちらについても,いろいろ参照して自作してみましたが,次のエントリに載っているスクリプトが,非常に洗練されていました.

ですが,OAuth認証のほうを使って,手元で動かしたところ,エラーが発生しました*1.「OpenSSL::SSL::VERIFY_PEER」を「OpenSSL::SSL::VERIFY_NONE」に書き換えると,うまく動作するようになりました.

*1:Cygwinだから?