Apps Scriptリファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

ラベル Custom Search API の投稿を表示しています。 すべての投稿を表示
ラベル Custom Search API の投稿を表示しています。 すべての投稿を表示

2018年5月4日金曜日

Custom Search APIで画像の検索結果を取得する


Custom Search APIの設定をしてから
以下の検索URLの「取得したAPIKEY」「取得したCSE_ID」「検索したいテキスト」を置き換えてブラウザで開くと検索結果を得られる


検索URL:
https://www.googleapis.com/customsearch/v1?key=取得したAPIKEY&cx=取得したCSE_ID&searchType=image&q=検索したいテキスト




Google Custom Search APIの設定

1日あたり100件の検索クエリまでは無料など、利用上の制限もあるようです
http://www.pre-practice.net/2017/12/google-custom-search-api.html#limit



HTML Serviceで試したときの検索例を書き残しておきます

このアプリケーションでできること

  1. テキストボックスに検索テキストを入力して
  2. 検索ボタンを押すと
  3. 検索URLをUrlFetchして内容を取得して
  4. title, link, snippet, contextLinkなどを取得して
  5. HTML要素を作って結果を表示する




コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile('index');
}

var API_KEY = "取得したAPI_KEY";
var CSE_ID = "取得したCSE_ID";

var BASE_URL = "https://www.googleapis.com/customsearch/v1?key=";
var CX = "&cx=";
var IMAGE = "&searchType=image";
var Q = "&q=";

function get_value_gs(query) {
  var url = BASE_URL + API_KEY + CX + CSE_ID + IMAGE + Q + encodeURIComponent(query);
  var fetch = UrlFetchApp.fetch(url).getContentText();
  var obj = JSON.parse(fetch);
  var items = obj["items"];
  var array = [];
  for (var i = 0; i < items.length; i++) {
    var obj_items = {};
    var item = items[i];
    var title = item["title"];
    var link = item["link"];
    var snippet = item["snippet"];
    var context_link = item["image"]["contextLink"];
    obj_items["title"] = title;
    obj_items["link"] = link;
    obj_items["snippet"] = snippet;
    obj_items["contextLink"] = context_link;
    
    array.push(obj_items);
  }
  return array;
}
意訳
この機能がやること
指定したHTMLファイルを表示する


取得したAPI_KEY
取得したCSE_ID

BASE_URL
CX
IMAGE
Q

この機能がやること
受け取ったqueryでurlを作ってエンコードして
customsearchAPIから返ってきた内容を取得して
JSONを解析してオブジェクトに変換して
itemsを取得して
結果の入れ物を配列で用意して
itemsの数だけ以下を繰り返す
obj_itemsという名で新規オブジェクトを作る
itemsを一つずつ取得して
titleを取得して
linkを取得して
smippetを取得して
imageのcontextLinkを取得して
obj_items { "title": title,
"link": link,
"snippet": snippet,
"contextLink": contextLink} を作る

array配列にobj_itemsを追加する

出来上がったarrayを返す



上のコード.gsはHTML Serviceで使うためにqueryを受け取ってarrayを返してしています


HTML ServiceでUIを作る


index.html
<!DOCTYPE html>
<html>
<head>
  <style>
    .card {
      width: 25%;
      height: auto;
      padding: 15px;
      border-radius: 2px;
      border: solid 1px lightgray;
      box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3);
      overflow-wrap: break-word;
    }

    .break_word {
      overflow-wrap: break-word;
    }

    .flex_div {
      display: flex;
      flex-direction: row;
    }
    
    .img_size {
      width: 60%;
      height: auto;
    }
    
    .underline_none {
      text-decoration: none;
    }
  </style>
</head>
<body>
  <input type="text" id="tb">
  <button id="bt">画像検索</button>
  <div id="main_div"></div>

  <script>
    var bt = document.getElementById("bt");
    var tb = document.getElementById("tb");
    bt.onclick = bt_clicked;

    function bt_clicked() {
      var value = tb.value;
      google.script.run
        .withFailureHandler(onFailure)
        .withSuccessHandler(onSuccess)
        .get_value_gs(value);
    }

    function onSuccess(array) {
      create_elements(array);
    }

    function onFailure(e) {
      alert(["error" + e.message, e.stack]);
    }

    function create_elements(array) {
      for(var i = 0; i < array.length; i++){
        var div_h = create_div_horizontal();
        var div_img_card = create_card(div_h);
        create_image(div_img_card, array[i]["link"]);
        var div_link_card = create_card(div_h);
        create_link(div_link_card, array[i]["title"], array[i]["contextLink"]);
        var div_text_card = create_card(div_h);
        create_text_div(div_text_card, tb.value);
       }
    }

    function create_div_horizontal() {
      var main_div = document.getElementById('main_div');
      var div_h = document.createElement("div");
      div_h.setAttribute("class", "flex_div");
      main_div.appendChild(div_h);
      return div_h;
    }

    function create_card(div_h) {
      var div_link_card = document.createElement("div");
      div_link_card.setAttribute("class", "card");
      div_h.appendChild(div_link_card);
      return div_link_card
    }

    function create_link(div_h, title, item) {
      var link = document.createElement("a");
      link.setAttribute("class", "underline_none");
      link.setAttribute("href", item);
      link.setAttribute("target", "_blank");
      link.textContent = title;
      div_h.appendChild(link);
    }

    function create_image(div_img_card, item) {
      var link = document.createElement("a");
      var img = document.createElement("img");
      link.setAttribute("href", item);
      link.setAttribute("target", "_blank");
      img.setAttribute("class", "img_size");
      img.setAttribute("src", item);
      img.textContent = item;
      
      link.appendChild(img);
      div_img_card.appendChild(link);
    }

    function create_text_div(div_h, text) {
      var div = document.createElement("div");
      div.textContent = text;
      div_h.appendChild(div);
    }
  </script>
</body>
</html>



2017年12月12日火曜日

Custom Search APIで欲しい情報を抽出する

Custom Search APIをたたいて取得した検索結果を
スプレッドシートに書き出す例です


検索結果の最初の10件の title link snippet を抽出してシートに書き出します


書き出した結果


やってみる


Google Custom Search APIで検索結果を取得するで取得したように

https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CSE_ID&q=検索ワード

↑にAPI_KEY, CSE_IDを入れて
検索ワードを「栄養素」とすると以下のような結果が返って来ます

{
 "kind": "customsearch#search",
 "url": {
  "type": "application/json",
  "template": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json"
 },
 "queries": {
  "request": [
   {
    "title": "Google Custom Search - 栄養素",
    "totalResults": "1540000",
    "searchTerms": "栄養素",
    "count": 10,
    "startIndex": 1,
    "inputEncoding": "utf8",
    "outputEncoding": "utf8",
    "safe": "off",
    "cx": "CSE_ID"
   }
  ],
  "nextPage": [
   {
    "title": "Google Custom Search - 栄養素",
    "totalResults": "1540000",
    "searchTerms": "栄養素",
    "count": 10,
    "startIndex": 11,
    "inputEncoding": "utf8",
    "outputEncoding": "utf8",
    "safe": "off",
    "cx": "CSE_ID"
   }
  ]
 },
 "context": {
  "title": "Google"
 },
 "searchInformation": {
  "searchTime": 0.273824,
  "formattedSearchTime": "0.27",
  "totalResults": "1540000",
  "formattedTotalResults": "1,540,000"
 },
 "items": [
  {
   "kind": "customsearch#result",
   "title": "栄養素 - Wikipedia",
   "htmlTitle": "\u003cb\u003e栄養素\u003c/b\u003e - Wikipedia",
   "link": "https://ja.wikipedia.org/wiki/%E6%A0%84%E9%A4%8A%E7%B4%A0",
   "displayLink": "ja.wikipedia.org",
   "snippet": "栄養素(えいようそ、nutrient)とは、. (栄養学等)栄養のために摂取する物質を要素\nとして指す言葉。蛋白質、脂肪、炭水化物の三大栄養素のほかに、無機質、ビタミンなど\nを指す。 (生物学等)栄養のために摂取される物質。 生物学等では、「栄養素」と言うと、\n生物が代謝する目的で外界から吸収する物質のことを指している。栄養素は生体内で\n代謝され、生体内物質の原料やエネルギーを産生するのに利用されるとされる。 栄養学\n等では、上記の(生化学等での栄養素の他に)健康を維持するための食事由来の成分を\n含め ...",
   "htmlSnippet": "\u003cb\u003e栄養素\u003c/b\u003e(えいようそ、nutrient)とは、. (栄養学等)栄養のために摂取する物質を要素\u003cbr\u003e\nとして指す言葉。蛋白質、脂肪、炭水化物の三大\u003cb\u003e栄養素\u003c/b\u003eのほかに、無機質、ビタミンなど\u003cbr\u003e\nを指す。 (生物学等)栄養のために摂取される物質。 生物学等では、「\u003cb\u003e栄養素\u003c/b\u003e」と言うと、\u003cbr\u003e\n生物が代謝する目的で外界から吸収する物質のことを指している。\u003cb\u003e栄養素\u003c/b\u003eは生体内で\u003cbr\u003e\n代謝され、生体内物質の原料やエネルギーを産生するのに利用されるとされる。 栄養学\u003cbr\u003e\n等では、上記の(生化学等での\u003cb\u003e栄養素\u003c/b\u003eの他に)健康を維持するための食事由来の成分を\u003cbr\u003e\n含め&nbsp;...",
   "cacheId": "3Ut4C2sD0UAJ",
   "formattedUrl": "https://ja.wikipedia.org/wiki/栄養素",
   "htmlFormattedUrl": "https://ja.wikipedia.org/wiki/\u003cb\u003e栄養素\u003c/b\u003e",
   "pagemap": {
    "metatags": [
     {
      "referrer": "origin-when-cross-origin"
     }
    ]
   }
  },
...2件目以降省略


この中の items に検索結果の最初の10件が入っているので
今回はそれらの title と link と snippet を抽出して
シートに書き出すコードの例を書きました


コード.gs
var API_KEY = "取得したAPI KEY";
var CSE_ID = "取得したCSE ID";
var BASE_URL = "https://www.googleapis.com/customsearch/v1?key=";
var PARAM1 = "&cx=";
var PARAM2 = "&q=";

function get_data() {
  var query = "栄養素";
  var url = BASE_URL + API_KEY + PARAM1 + CSE_ID + PARAM2 + query;
  var fetch = UrlFetchApp.fetch(url).getContentText();
  var obj = JSON.parse(fetch);
  var items = obj["items"];
  var array = [];
  for (var i = 0; i < items.length; i++) {
    var title = items[i]["title"];
    var link = items[i]["link"];
    var snippet = items[i]["snippet"];
    array.push([title, link, snippet])
  }
  set_values(array);
}

function set_values(array){
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  var start_row = last_row + 1;
  var start_col = 1;
  var num_rows = array.length;
  var num_cols = array[0].length;
  var range = sh.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(array); 
}
意訳
API_KEYを設定する
CSE_IDを設定する
BASE_URLは"https://www.googleapis.com/customsearch/v1?key="
PARAM1は"&cx="
PARAM2は "&q="

この処理は以下を実行する
検索キーワードを決める(例では栄養素)
urlにBASE_URL + API_KEY + PARAM1 + CSE_ID + PARAM2 + queryを入れて
結果を取得する
JSON 文字列をオブジェクトに変換して
itemsを取得する
結果を入れるarrayという入れ物を用意する
itemsの数だけ以下を繰り返す
titleを取得して
linkを取得して
snippetを取得して
arrayに入れて

set_valuesに渡す


この処理は以下を実行する
開いているシートを取得して
データの入っている最終行を取得して
その次の行を入力を開始する行に設定して
入力を開始する列を設定する(例では1列目を指定)
入力する行数はarrayの長さから取得して
入力する列数はarrayの中の1行内のデータ数を取得して
入力を開始する行, 入力を開始する列, 入力する行数, 入力する列数で範囲を指定して
arrayのデータを入力する



2017年12月10日日曜日

Google Custom Search APIで検索結果を取得する


Custom Search JSON/Atom API
https://developers.google.com/custom-search/json-api/v1/overview?hl=ja

これを利用するとGoogle検索結果を APIで取得できるようになります
今回はCustom Search API を使えるようにするまでの手順を書きます


実際にどのような情報を取得できるかは以下の記事に書きました





利用上の制限があるので先に書いておきます


  • 1日あたり100件の検索クエリまでは無料
  • 追加のリクエストは1000クエリあたり5ドル
  • 1日あたり最大10000クエリまで

というようなことがここに書いてありました

それを承知で試してみたい場合は以下の手順で実行できるようになるはずです
(2017/12/10現在試した手順です)



結果を取得する手順
  1. API KEYを取得する
  2. 検索エンジン ID(CSE ID)を取得する
  3. https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CSE_ID&q=検索ワード
    を開く

ではこの手順を順番にやっていきます



1. APIを取得する


まずはAPIを取得するため以下のページにアクセスします
Custom Search JSON/Atom API/Prerequisites



次に「GET A KEY」をクリックします


表示される画面の内容を読んで「Yes」を選択してNEXTをクリックします


しばらく待つと API KEY が表示されます
「DONE」をクリックして閉じます



2. 検索エンジン ID(CSE ID)を取得する


1と同じく以下のページにアクセスします
Custom Search JSON/Atom API/Prerequisites


Control Panel」のリンクをクリックします



「Add」をクリックします

新しい検索エンジンを作成します
 ①検索するサイトに「https://www.google.co.jp/」を入力します
 ②言語を「日本語」に設定します
 ③検索エンジンの名前を任意で変更します
 ④「作成」をクリックします



作成完了後「コントロール パネル」をクリックします


「検索エンジン ID」ボタンをクリックすると検索エンジン IDが表示されます
画像検索がデフォルトでオフになっているので使いたい場合は「オン」にしておきます


以上でAPI KEYと検索エンジンID(CSE ID)を取得できました


試してみる


API_KEYとCSE_IDと検索ワードを以下のurlに設定して
ブラウザのアドレスバーに入れて開くと検索結果をJSONで取得できます

https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CSE_ID&q=検索ワード


検索ワードを「栄養素」とすると以下のような結果が表示されます

itemsの中に検索結果の最初の10件の情報が入っています


{
 "kind": "customsearch#search",
 "url": {
  "type": "application/json",
  "template": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json"
 },
 "queries": {
  "request": [
   {
    "title": "Google Custom Search - 栄養素",
    "totalResults": "1540000",
    "searchTerms": "栄養素",
    "count": 10,
    "startIndex": 1,
    "inputEncoding": "utf8",
    "outputEncoding": "utf8",
    "safe": "off",
    "cx": "CSE_ID"
   }
  ],
  "nextPage": [
   {
    "title": "Google Custom Search - 栄養素",
    "totalResults": "1540000",
    "searchTerms": "栄養素",
    "count": 10,
    "startIndex": 11,
    "inputEncoding": "utf8",
    "outputEncoding": "utf8",
    "safe": "off",
    "cx": "CSE_ID"
   }
  ]
 },
 "context": {
  "title": "Google"
 },
 "searchInformation": {
  "searchTime": 0.273824,
  "formattedSearchTime": "0.27",
  "totalResults": "1540000",
  "formattedTotalResults": "1,540,000"
 },
 "items": [
  {
   "kind": "customsearch#result",
   "title": "栄養素 - Wikipedia",
   "htmlTitle": "\u003cb\u003e栄養素\u003c/b\u003e - Wikipedia",
   "link": "https://ja.wikipedia.org/wiki/%E6%A0%84%E9%A4%8A%E7%B4%A0",
   "displayLink": "ja.wikipedia.org",
   "snippet": "栄養素(えいようそ、nutrient)とは、. (栄養学等)栄養のために摂取する物質を要素\nとして指す言葉。蛋白質、脂肪、炭水化物の三大栄養素のほかに、無機質、ビタミンなど\nを指す。 (生物学等)栄養のために摂取される物質。 生物学等では、「栄養素」と言うと、\n生物が代謝する目的で外界から吸収する物質のことを指している。栄養素は生体内で\n代謝され、生体内物質の原料やエネルギーを産生するのに利用されるとされる。 栄養学\n等では、上記の(生化学等での栄養素の他に)健康を維持するための食事由来の成分を\n含め ...",
   "htmlSnippet": "\u003cb\u003e栄養素\u003c/b\u003e(えいようそ、nutrient)とは、. (栄養学等)栄養のために摂取する物質を要素\u003cbr\u003e\nとして指す言葉。蛋白質、脂肪、炭水化物の三大\u003cb\u003e栄養素\u003c/b\u003eのほかに、無機質、ビタミンなど\u003cbr\u003e\nを指す。 (生物学等)栄養のために摂取される物質。 生物学等では、「\u003cb\u003e栄養素\u003c/b\u003e」と言うと、\u003cbr\u003e\n生物が代謝する目的で外界から吸収する物質のことを指している。\u003cb\u003e栄養素\u003c/b\u003eは生体内で\u003cbr\u003e\n代謝され、生体内物質の原料やエネルギーを産生するのに利用されるとされる。 栄養学\u003cbr\u003e\n等では、上記の(生化学等での\u003cb\u003e栄養素\u003c/b\u003eの他に)健康を維持するための食事由来の成分を\u003cbr\u003e\n含め&nbsp;...",
   "cacheId": "3Ut4C2sD0UAJ",
   "formattedUrl": "https://ja.wikipedia.org/wiki/栄養素",
   "htmlFormattedUrl": "https://ja.wikipedia.org/wiki/\u003cb\u003e栄養素\u003c/b\u003e",
   "pagemap": {
    "metatags": [
     {
      "referrer": "origin-when-cross-origin"
     }
    ]
   }
  },
...2件目以降省略



パラメータに
&start=11
などを追加すれば11件目以降の結果も取得できる



おまけ


検索結果が少ない場合

試してみて検索結果が少ない場合は以下の設定を変更すると良いかもしれません


検索するサイト:追加したサイトを重視して、ウェブ全体を検索する


変更する手順

Control Panel」を開いて作成した検索エンジンを選択する(例ではGoogle)


検索するサイトで「追加したサイトを重視して、ウェブ全体を検索する」


「更新」をクリックする


参考

Custom Search JSON/Atom API
https://developers.google.com/custom-search/json-api/v1/overview?hl=ja

Using REST to Invoke the API
https://developers.google.com/custom-search/json-api/v1/using_rest?hl=ja

CSE: list
https://developers.google.com/custom-search/json-api/v1/reference/cse/list?hl=ja

Latest post

Google Formsでクイズを作りたい

Googleフォームには回答を判定するクイズモードがあります 今回はそのクイズモードで回答の判定とフィードバックについて書いていきます 「クイズモード」の表記: 日本語の表記は「テストにする」ですが 英語の表記は「Make this a quiz」となっています この記事ではそれ...