🤖
[Dify]Google Search APIで取得した項目をパースしてスプレッドシートに格納するまで
Google Search APIで取得した項目をパースしてGoogleスプレッドシートに書き込みするまでの流れのメモ
大まかなワークフロー
- SearchAPIで検索したいキーワードを入力
- GoogleSearchAPIにリクエストを飛ばす
- 戻ってきた値をJSON形式にパースする
- GASにPOSTしてスプレッドシートに3の情報を書き込む
セットアップ
Custom Search JSON API
「キーを取得」ボタンからAPIキーを発行
1日あたり100件のクエリは無料
Custom Search JSON API では、1 日あたり 100 件の検索クエリを無料で利用できます。これを超えて必要な場合は、API Console でbillingをお申し込みいただけます。追加リクエストの料金は、クエリ 1, 000 クエリあたり $5 で、1 日あたり 1 万クエリまでです。
Googleスプレッドシートの準備
スプレッドシートの作成
空のスプレッドシートを作成しAppScriptを選択
AppScriptにコードの貼り付け
GASのスクリプトにPOSTで受け取った値を書き込むコードを挿入(受け取る形式によって書き換えが必要)
function doPost(e) {
// スプレッドシートとシート1を取得
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('シート1');
// シートの最終行を取得
var lastRow = sheet.getLastRow();
// POSTデータをパース
var jsonData = JSON.parse(e.postData.contents);
// ヘッダーがなければ追加
if (lastRow === 0) {
sheet.appendRow(['Title', 'Link', 'Description']);
lastRow = 1;
}
// JSONデータをスプレッドシートに書き込む
if (jsonData.items) { // ここを修正
jsonData.items.forEach(function(item) {
sheet.appendRow([item.title, item.link, item.description]);
});
}
// レスポンスを返す
return ContentService.createTextOutput(JSON.stringify({
status: 'success',
message: 'Data written to the spreadsheet successfully.'
})).setMimeType(ContentService.MimeType.JSON);
}
デプロイしてAPIキーを発行する
アクセスできるユーザーは「全員」を選択
発行された「URL」をメモっておく(Difyのセットアップで使います)
Difyのワークフロー設定
開始で検索キーワードを入力
Google Search APIにリクエスト飛ばす
以下のような形でセットアップ
keyに管理画面から取得したAPIキーを入れる
Google Search APIのパラメーターの詳細は以下
q欄には開始時のキーワードを入れる
戻ってきた値をJSON形式にパース処理
実行コード
import json
def main(arg1: str) -> dict:
try:
# 文字列をJSONとしてデコード
response_data = json.loads(arg1)
# itemsが含まれているか確認
if "items" in response_data:
# items内の各エントリから必要な要素を抽出
extracted_items = []
for item in response_data["items"]:
# titleとlinkを取得
title = item.get("title", "")
link = item.get("link", "")
# pagemap.metatagsからdescriptionを取得(存在する場合のみ)
pagemap = item.get("pagemap", {})
metatags = pagemap.get("metatags", [])
description = metatags[0].get("og:description", "") if metatags else ""
# 抽出したデータをリストに追加
extracted_items.append({
"title": title,
"link": link,
"description": description
})
# 結果を辞書形式で返す
return {"result": {"items": extracted_items}}
else:
return {"result": {"error": "No 'items' found in the response"}}
except json.JSONDecodeError as e:
# JSONデコードエラーの場合のエラーハンドリング
return {"result": {"error": f"JSONDecodeError: {str(e)}"}}
except Exception as e:
# その他のエラーをキャッチ
return {"result": {"error": f"Unexpected error: {str(e)}"}}
if __name__ == "__main__":
# Example API response for testing
api_response_body = '''{
"items": [
{
"title": "Solana: Web3 Infrastructure for Everyone",
"link": "https://solana.com/",
"pagemap": {
"metatags": [
{
"og:title": "Solana: Web3 Infrastructure",
"og:description": "Bring blockchain to the people."
}
]
}
},
{
"title": "Solana price today, SOL to USD live price, marketcap and chart ...",
"link": "https://coinmarketcap.com/currencies/solana/",
"pagemap": {
"metatags": [
{
"og:title": "Solana Price",
"og:description": "The live Solana price today."
}
]
}
}
]
}'''
# Call the main function and print the result
result = main(api_response_body)
print(json.dumps(result, indent=2, ensure_ascii=False))
GASにリクエストしてスプレッドシートに書き込む
GASで発行したリクエストURLをPostのところに貼り付ける
JSON欄で変数選択できなかった場合は以下対応をみてください。
参考記事
Discussion