質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

1回答

6591閲覧

Google Custom search APIで400:invalid argumentが返される

meg-teratail

総合スコア8

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

0グッド

0クリップ

投稿2020/06/16 08:30

初心者です.GoogleのCustom search APIを使って画像収集をしようとしているのですが,
”400:invalid argument”が返されてしまいます.
https://bbbbruno.qrunch.io/entries/QJAH6SmmbFt76WPJ

こちらのサイトを参考に,クエリ「東日本大震災」でヒットする画像のデータを集めようとしています.
APIキーとカスタム検索のIDを取得し,ターミナルで以下のコマンドを入力しました.

curl https://www.googleapis.com/customsearch/v1?key=[*****]&cx=[*****]&searchType=image&q=東日本大震災&lr=lang_ja&safe=off&num=2&start=1

JSON形式で検索結果が返されて欲しいのですが,以下のような結果が返ってきてしまいます.

"error": { "code": 400, "message": "Request contains an invalid argument.", "errors": [ { "message": "Request contains an invalid argument.", "domain": "global", "reason": "badRequest" } ], "status": "INVALID_ARGUMENT" } }

エラーメッセージを調べてみたところ,私が投げているリクエストに問題があるようなのですが,具体的にどこが悪いのかわかりませんでした.日本語のクエリ部分をシングルクオートで囲っても結果は変わりませんでした.Webブラウザ(Chrome)にcurlするURLを入力したところ,問題なくJSONが表示されたので,さらによくわからなくなってしまいました.
使用しているPCはMac,curlのバージョンは7.54.0です. よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私の方で実際に試したわけではありませんが、curlコマンドに渡すGETメソッドのフォームのパラメータの内、q=東日本大震災の部分はいわゆるURLエンコードを施す必要があるはずです。GETメソッドのURL中に、UTF8であろうがシフトJISであろうが、直接、全角文字相当の文字列を指定することはできません。

実際、質問者さんが参考にされた記事中でもそのキーワード部分をちゃんとURLエンコードしています。以下の部分です。

sh

1echo $keyword | nkf -wMQLu | tr = % | tr \n ! | sed -e 's/!//g' -e 's/%%/%/g' > keyword.txt

Google Custom Search APIを使って自動画像収集ツールを作ったった - BlueTechNote 記事中より引用

質問者さんの場合q=の値は「東日本大震災」なわけですから、この文字列をURLエンコードします。

sh

1$ echo '東日本大震災' | nkf -WwMQ | tr = % 2%E6%9D%B1%E6%97%A5%E6%9C%AC%E5%A4%A7%E9%9C%87%E7%81%BD

この値で差し替えると、以下のようなcurlコマンドラインオプションになるでしょうか。

sh

1curl https://www.googleapis.com/customsearch/v1?key=[*****]&cx=[*****]&searchType=image&q=%E6%9D%B1%E6%97%A5%E6%9C%AC%E5%A4%A7%E9%9C%87%E7%81%BD&lr=lang_ja&safe=off&num=2&start=1

もし、これでうまくいかなかった場合、問題の切り分けとしてq=をURLエンコードしなくてもだいじょうぶなパターン、例えば「cat」や「dog」など、英数字のみで構成される簡単な単語に差し替えて試してみて、もしそれで動くのであれば、やはりその部分が問題だということになります。「URLエンコード」については「GETメソッド URLエンコード」などとキーワード指定して検索するなどして別途、調べてみてください。


私の回答へいただいた以下のコメントを読んで追記しました:

Webブラウザに直接URLを入力した場合は,いずれも問題なく返ってきました

curlコマンドの実行で問題が起きているということになりますね。私の方で試したみたところ、質問者さんの問題が再現しました。こちらの記事で提示されている問題が起きているようです。

curlでGETリクエスト送る時の注意点 - Smoky God Express/Hetana Blog

クエリー文字列中で&が多用されているためにcurlコマンドにとって不正なコマンドラインオプションになってしまう、と言うことです。正しくURLエンコードをした上で、curlへ渡すURLを"で括って実行してください。

sh

1# 例 2curl "https://www.googleapis.com/customsearch/v1?key=[*****]&cx=[*****]....."`

投稿2020/06/16 09:56

編集2020/06/16 18:25
dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg-teratail

2020/06/16 11:41

回答ありがとうございます.提案いただいた方法を試してみました. 全角の文字をエンコードする方法,代わりの半角英字をクエリにする方法,いずれも試しましたが,変わらずエラー400が返されてしまいました. (Webブラウザに直接URLを入力した場合は,いずれも問題なく返ってきました) URLエンコードについて少し勉強して参ります.もし他の原因に心当たりがございましたら,お教えいただけるとありがたいです.
dodox86

2020/06/16 18:11

原因が分かりましたので回答へ追記しました。ご覧ください。
meg-teratail

2020/06/17 01:21

追記いただいた回答を参照して試したところ,無事にデータが返ってきました.この度は親切にありがとうございました.またご縁がありましたら,よろしくお願いいたします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問