利用条件の変更に注意:2026年10月確認。Google公式はCustom Search JSON APIの新規受付終了と、既存利用者が2027年1月1日までに代替へ移行する必要があることを案内しています。以下を新規の無料検索API導入手順として使わないでください。
根拠: Google公式の利用状況・終了時期・料金案内。この案内と、過去の画面/サンプルを分けて読んでください。
既存システムで先に確認すること
- 対象のGoogle Cloudプロジェクト、既存の利用資格、検索エンジンIDと検索対象を運用担当と照合する。
- 呼び出し箇所と利用量/割当・課金を把握し、終了前に移行できる計画を立てる。キー作成やAPI有効化だけで継続資格が得られるとは考えない。
- 移行先は検索対象・料金/契約・応答形式・言語/画像/ページング・利用条件を個別比較する。別サービスをURLだけ変更すれば置換できると保証しない。
- HTTP/JSON/0件/エラーを分けて扱い、エラーを空結果として隠さない。キー・検索語・応答本文を無条件にログへ出さない。
| この記事の要点 |
|---|
|
本稿は既存のCustom Search JSON APIを点検する保守資料です。下の画面と要求例は旧環境の記録として保持し、新規導入の成功を保証する手順とは区別します。
JSON APIとは?
プログラムを通じてJSON APIを利用することでGoogleの検索結果をJSON形式で受け取ることが出来ます。
カスタムサーチエンジンの作成
下は旧管理画面の操作例です。まず既存のAPI利用資格と検索エンジンIDを確認します。新しく検索エンジンを作成できることと、JSON APIの新規利用可否は別です。
旧資料の管理URLは下に保持しています。現在の管理画面/利用条件を公式案内で確認し、移行計画なしに新しいAPI前提の構成を増やさないでください。
https://cse.google.com/cse/all

サーチエンジンを作成したらEdit search engine → Setupの項目で更に詳細設定をすることが出来ます。
下のImage search/Language/Search the entire webは旧画面の表示です。現在も同じ項目や検索範囲を新規設定できるとは限りません。既存エンジンの検索対象・言語・画像検索の有効性を、実際の設定と公式の現行条件で照合してください。

API Keyの取得
既存の許可されたプロジェクト/キーを運用担当と確認します。キーを作成すれば受付終了を回避できるわけではありません。利用APIとアプリケーションの制限・割当を確認し、キーを記事/ソース管理/画面出力/ログへ公開しないでください。
キーの扱いはGoogle公式のAPIキー管理指針を確認してください。画面やログを共有するときも秘密値を除外します。
Custom Search Engine の有効化
以下は旧有効化URLです。対象プロジェクトの利用資格/既存設定を先に確認し、リンクを開けば新規APIを利用できるとは扱いません。既存設定や課金をこの記事の点検のために変更する必要はありません。
https://console.developers.google.com/apis/library/customsearch.googleapis.com
APIの使用
必須パラメータは以下の通りです。
・API Key: Google Cloud Consoleから取得することが出来ます。
・Custom search engine ID: 「Edit search engine」→「Setup」から確認できます。
・q: 検索キーワードです。
下はキーを含む旧URLの構造例で、改行を含む表示をそのまま送信する手順ではありません。ブラウザ履歴やアクセスログ等に秘密値が残り得るため、実キー入りURLをそのまま共有/記録しません。検索語はURLエンコードし、許可された既存利用の範囲でタイムアウト/割当を設計します。
|
https://www.googleapis.com/customsearch/v1 |
その他のパラメータおよびレスポンスに関しては以下の公式ドキュメントを参照してください。
https://developers.google.com/custom-search/v1/cse/list?hl=ja
取得後のJSONをオフラインで確認する例
次はPython 3の解析関数だけです。API通信・キー取得・課金・再試行は行いません。HTTP状態と取得済み本文を渡し、検索応答のkindと使用する項目の型を検査します。items省略/空配列は0件、不正JSONやAPIエラーは別に扱い、エラー本文をそのまま例外へ含めません。応答スキーマ全体を検証する関数ではありません。
"""Parse a completed API response only; no network, retries or raw-response logging."""
import json
from urllib.parse import urlsplit
def read_search_result(status, body):
if type(status) is not int or not 100 <= status <= 599:
raise ValueError("invalid_status")
if not 200 <= status < 300:
raise ValueError("http_error")
try:
data = json.loads(body)
except (ValueError, TypeError, UnicodeError):
raise ValueError("invalid_json") from None
if not isinstance(data, dict) or "error" in data:
raise ValueError("api_error_or_invalid_response")
if data.get("kind") != "customsearch#search":
raise ValueError("unexpected_response")
items = data.get("items", [])
if not isinstance(items, list):
raise ValueError("invalid_items")
results = []
for item in items:
if not isinstance(item, dict):
raise ValueError("invalid_item")
title, link, snippet = item.get("title"), item.get("link"), item.get("snippet", "")
if not all(isinstance(v, str) for v in (title, link, snippet)):
raise ValueError("invalid_item_fields")
try:
url = urlsplit(link)
valid = url.scheme in ("https", "http") and bool(url.hostname) and not url.username and not url.password
except ValueError:
valid = False
if not valid or any(ord(c) < 33 for c in link):
raise ValueError("invalid_result_url")
results.append({"title": title, "url": link, "snippet": snippet})
return results
title/snippetはHTMLとして挿入せず、表示先に応じてエスケープする文字列です。この関数は結果のHTTP(S) URLを検査しますが、リンク先の安全性/信頼性を保証するものではありません。応答サイズ制限・通信タイムアウト・ページング・利用規約への適合は呼び出し側の別設計です。実API接続の成功や代替サービスへの移行を検証した例ではありません。
空結果・権限・割当を混同しない
正常応答でitemsが無い場合と、403等のHTTPエラーは別です。同じHTTP状態でも理由は異なり得るため、受付条件・キーの制限・対象API・割当を確認します。無限再試行や制限解除で回避せず、診断情報を共有する場合も秘密値と検索語を除外してください。
公式の要求パラメータと応答スキーマを参照してください。関連項目は親のGoogle Custom Search APIページの子ページから選んでください。古いスクリーンショット2点と元の要求例は本文中に保持していますが、現行UIや新規利用可否の根拠にはしません。
子ページはありません
同階層のページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09