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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

6665閲覧

Google Custom Search API で403エラー "The request is missing a valid API key."

cl_

総合スコア9

Google API

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1グッド

1クリップ

投稿2020/04/03 13:09

Google Custom Search APIでgoogleの検索結果データを取得したい。
ここここをパク、参考にやってみたところ、前者であるjavascriptを使うやり方ではうまくいかず、後者のpythonを使うやり方ではうまくいきました。

問題:前者でうまくいくようにしたい

前者(JavaScript)

javascript

1 const API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 2 const CSE_ID = 'xxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxx'; 3 let keywords = '検索ワード'; 4 let cse_url = 'https://www.googleapis.com/customsearch/v1?key=' + API_KEY + '&cx=' + CSE_ID + '&q=' + keywords; 5 const request = new XMLHttpRequest(); 6 request.open('GET', cse_url); 7 request.onreadystatechange = function () { 8 if (request.readyState != 4) { 9 // リクエスト中 10 } else if (request.status != 200) { 11 // 失敗 12 console.log('Damn it!'); 13 } else { 14 // 取得成功 15 const result1 = request.responseText; 16 console.log(result1); 17 } 18 }; 19 request.send();

ローカル開発環境の構築 [macOS編]の上で、検索ワードの文字列をkeywordsに代入し動作させると定数result1

json

1{ 2 "kind": "customsearch#search", 3 "url": { 4 "type": "application/json", 5 "template": "https://www.googleapis.com/customsearch/v1?q=・・・(略)・・・=json" 6 }, 7 "queries": { 8 "request": [ 9 { 10 "count": 10, 11 "startIndex": 1, 12 "inputEncoding": "utf8", 13 "outputEncoding": "utf8", 14 "safe": "off", 15 "cx": "xxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxx" 16 } 17 ] 18 }, 19 "searchInformation": { 20 "searchTime": 0.011195, 21 "formattedSearchTime": "0.01", 22 "totalResults": "0", 23 "formattedTotalResults": "0" 24 } 25}

と入っていました。五行目"template"のURLを辿ると

{ "error": { "code": 403, "message": "The request is missing a valid API key.", "errors": [ { "message": "The request is missing a valid API key.", "domain": "global", "reason": "forbidden" } ], "status": "PERMISSION_DENIED" } }

と表示されます。

後者(Python)

Python

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4import os 5import datetime 6import json 7 8from time import sleep 9from googleapiclient.discovery import build 10 11GOOGLE_API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 12CUSTOM_SEARCH_ENGINE_ID = "xxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxx" 13 14DATA_DIR = 'data' 15 16def makeDir(path): 17 if not os.path.isdir(path): 18 os.mkdir(path) 19 20def getSearchResponse(keyword): 21 today = datetime.datetime.today().strftime("%Y%m%d") 22 timestamp = datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S") 23 24 makeDir(DATA_DIR) 25 26 service = build("customsearch", "v1", developerKey=GOOGLE_API_KEY) 27 28 page_limit = 10 29 start_index = 1 30 response = [] 31 for n_page in range(0, page_limit): 32 try: 33 sleep(1) 34 response.append(service.cse().list( 35 q=keyword, 36 cx=CUSTOM_SEARCH_ENGINE_ID, 37 lr='lang_ja', 38 num=10, 39 start=start_index 40 ).execute()) 41 start_index = response[n_page].get("queries").get("nextPage")[0].get("startIndex") 42 except Exception as e: 43 print(e) 44 break 45 46 # レスポンスをjson形式で保存 47 save_response_dir = os.path.join(DATA_DIR, 'response') 48 makeDir(save_response_dir) 49 out = {'snapshot_ymd': today, 'snapshot_timestamp': timestamp, 'response': []} 50 out['response'] = response 51 jsonstr = json.dumps(out, ensure_ascii=False) 52 with open(os.path.join(save_response_dir, 'response_' + today + '.json'), mode='w') as response_file: 53 response_file.write(jsonstr) 54 55if __name__ == '__main__': 56 57 target_keyword = 'ダイエット' 58 59 getSearchResponse(target_keyword) 60

一方でこちらは参考にしたページの通りのJSONデータが得られました。

詰み

例えばここに同じ名前のメッセージが問われたりしていますがなんだか理解まで辿り着けません。
お願いします。

piroq👍を押しています

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

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

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

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

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

guest

回答3

0

JavaScript版とPython版でリクエストしているURLが異なっていることはお気づきでしょうか。

js

1let cse_url = 'https://www.googleapis.com/customsearch/v1?key=' + API_KEY + '&cx=' + CSE_ID + '&q=' + keywords;

python

1 response.append(service.cse().list( 2 q=keyword, 3 cx=CUSTOM_SEARCH_ENGINE_ID, 4 lr='lang_ja', 5 num=10, 6 start=start_index 7 ).execute())

Python版のほうがlr='lang_ja'num=10start=start_indexが多く含まれています。このライブラリを直接使ったわけではないので推測ですが、ここでURLに含めるパラメータを決定しているのだと思います。

一般に検索系のAPIは結果が膨大になるためページング処理(1回に取ってこれる結果の量を制限する仕組み)が必要になります。num=10が1回に取ってこれる量でstart=start_indexが何ページ目からの結果からかを表すパラメータかと思われます。

投稿2020/04/15 07:22

A_kirisaki

総合スコア2853

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

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

cl_

2020/04/17 09:12

回答ありがとうございます。 そのパラメータを付け足してJS版でやってみました。同じエラーが出ました。一回に取ってこれる量はデフォルトで10ページ(Python版と同じく)のようです。 エラーをみると権限がないとのことで、その権限の付け方がわからず困っています。
guest

0

ベストアンサー

そのまんまかと思うんですが...
何を問題としているのかいまいち理解できませんでした。
全て正しい挙動をしているように思います。
私はこの質問を読んで、初めてCustom Search APIを使いましたから、そのせいで理解できないだけでしょうか。

templateのURLを辿ったとき、
The request is missing a valid API key.
と返ってくるのが問題ですか?
これはメッセージの通り、API keyがないことが原因かと思います。
なぜtemplateのURLを辿ったのかは知りませんが、そのURLにはAPI keyが含まれていません。
その先の情報を得るためには、そのURLの最後に、key=を付け加える必要があるでしょう。
https://www.googleapis.com/customsearch/v1?q=・・・(略)・・・=json&key='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
のように。

結果がないのが問題ならば、
"totalResults": "0"
とあるように、単純にその検索ワードではヒットが無かっただけかと思います。

投稿2020/04/21 05:40

ozraru

総合スコア150

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

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

cl_

2020/04/22 08:06

言葉のレベルでわかってませんでしたありがとうございます。
guest

0

クエリパラメータの作成時にvalueをURLエンコードしてないからかもしれません。
API_KEYに&とか?が含まれているとAPI_KEYが正常に渡せません。

ためしにencodeURIComponentを使ってみたらどうでしょうか。

JavaScript

1let cse_url = 'https://www.googleapis.com/customsearch/v1' + 2 '?key=' + encodeURIComponent(API_KEY) + 3 '&cx=' + encodeURIComponent(CSE_ID) + 4 '&q=' + encodeURIComponent(keywords);

投稿2020/04/17 10:15

draq

総合スコア2577

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

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

cl_

2020/04/20 08:39

回答ありがとうございます。 やってみました。同じエラーが返ってきました。 APIキーは大文字・小文字のアルファベットと数字でできているようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問