いづいづブログ

アジャイルコーチになりたい札幌在住SEです。アジャイル札幌スタッフ&ScrumFestSapporo実行委員。Like:パクチー/激辛/牡蠣/猫/初期仏教

curlでURLをパラメータに指定するときにハマった話

「画像取得APIを使って、任意の画像を取得する」ということをやってみた時に、「&」エスケープしていなかったためにハマったので記録。

やったこと

FlickerAPIを使って指定した画像を取得したい。

APPキーは事前に登録しておく。APIの引数にりんごの画像を取得するようなクエリを追加して、いざcurlのGETコマンドを実行。

$ curl https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key={APIキー}&format=rest&text=%E3%82%8A%E3%82%93%E3%81%94

実行結果(エラー)

”Invalid API Key”って言われた。

このあと"wget"でも試してみたけど結果として同じエラーが返された。

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="fail">
        <err code="100" msg="Invalid API Key (Key has invalid format)" />
</rsp>

解決方法

途中経過などは省略していきなり結論。

パラメータを複数指定するときは”&”でつなぐ必要があるんだけど、これがシェルの&と競合してしまい、正しく解釈されていなかった。

方法としてはURLをダブルクォートで囲むか、”&”をエスケープする。

1. URLをダブルクォートで囲む

$ curl ”https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=ABCDEFG”

2. ”&”をエスケープする

「&」を「\&」と書いてエスケープする。

$ curl https://api.flickr.com/services/rest/?method=flickr.photos.search\&api_key=ABCDEFG

まとめ

”Invalid API Key”という情報に引っ張られすぎて、キーが悪いキーが悪いキーが悪いと呪いにかかっていた。

「&」エスケープしないとだめだというのは座学で勉強済みだったのに、全く頭に残っていなかった。やっぱりこうやって手を動かしてハマって覚えていくものだと痛感した。