Building an AI-Powered Product Recommendation App with Scrapingdog APIs
Learn how to build a smart AI-powered product recommendation app using Scrapingdog’s APIs to collect real-time data efficiently and at scale.
seen from Germany
seen from United Kingdom
seen from China

seen from United States

seen from United States

seen from United States
seen from Türkiye
seen from China

seen from United States

seen from Malaysia

seen from Canada

seen from Malaysia

seen from India
seen from Algeria
seen from China
seen from Singapore
seen from Indonesia
seen from Malaysia
seen from Malaysia

seen from United States
Building an AI-Powered Product Recommendation App with Scrapingdog APIs
Learn how to build a smart AI-powered product recommendation app using Scrapingdog’s APIs to collect real-time data efficiently and at scale.
This guide will walk you through the process of using OAuth 2.0 to obtain access and refresh tokens, ensuring secure and efficient integrati
Gain deeper insight into Google API Key. What is the right process to get a free API Key? Get aware of every step of the Google API key in this blog.
APIs are the abbreviation of Application Programming Interfaces. As the name suggests, Google APIs have developed the tech giant Google. You can see the example of Google APIs in the embedded Google Maps on a website. Usually, third-party apps make use of these APIs to enhance the functionality of their existing software. Another great example is Google Calendar API, which allows mobile and web applications to integrate with Calendar. It extends the abilities of software and applications to manage events within the calendar. Many developers use API for different purposes like Custom search in a website, Drive apps for numerous web apps, etc.
New Course: How to Use the Google Maps API
New item has been added on CodeHolder.net https://codeholder.net/code/new-course-use-google-maps-api
Do you want to know how to use Google's huge library of street and satellite maps for your own apps? If so, check out our latest course, How to Use the Google Maps API.
[Ruby]RubyでもGoogle APIを使うためにOauth2.0認証する
前書き
C#でGoogle APIを使う時にも説明しましたが、各言語のライブラリが公開されています。当然Rubyにもあります。
そんなわけでRubyでもGoogle APIが使えるようにしておきましょう。前回の使いまわしなのでInstalled applicationです。Web applicationとかは(省略)
下準備
API Consoleにプロジェクトを登録する方法については前回の記事で説明したので割愛します。
このページを参考にとりあえずGemだけ貰ってきましょう。
gem install google-api-client
InstalledAppFlowを作る
Ruby用のOauth2.0の解説ページはサンプルも結構あるので意外とさくさく作れそうな気がしますが、トラップも結構あります。
ま、とりあえずざっくりコードを引用してみましょう。
require 'rubygems' require 'google/api_client' require 'google/api_client/client_secrets' require 'google/api_client/auth/file_storage' require 'google/api_client/auth/installed_app' require 'logger' require 'json' CREDENTIAL_STORE_FILE = "#{$0}-oauth2.json" client = Google::APIClient.new(:application_name => 'Ruby AdSense sample', :application_version => '1.0.0') file_storage = Google::APIClient::FileStorage.new(CREDENTIAL_STORE_FILE) if file_storage.authorization.nil? client_secrets = Google::APIClient::ClientSecrets.load flow = Google::APIClient::InstalledAppFlow.new( :client_id => client_secrets.client_id, :client_secret => client_secrets.client_secret, :scope => ['https://www.googleapis.com/auth/adsense.readonly'] ) client.authorization = flow.authorize(file_storage) else client.authorization = file_storage.authorization end
サンプルではGoogle Adsenseを例にしているみたいですね。
まずはここ。
CREDENTIAL_STORE_FILE = "#{$0}-oauth2.json" file_storage = Google::APIClient::FileStorage.new(CREDENTIAL_STORE_FILE)
何度もOauth認証しなくとも済むようAccessTokenなどをキャッシュしてくれます。それだけです。別にどんな名前にしてもいいです。
次にここ。
client_secrets = Google::APIClient::ClientSecrets.load
また出ました。client_secretsです。これも前回説明したんで割愛します。
ただ、サンプルだとloadメソッドに何の引数も渡していないんですが、ちゃんとファイルパスを渡さないと「どのファイルだかわかんないんだけど!」とブチ切れられます。ふざけてますね。
勿論用意しなくてもいいです。お任せします。
そしてここ。
flow = Google::APIClient::InstalledAppFlow.new( :client_id => client_secrets.client_id, :client_secret => client_secrets.client_secret, :scope => ['https://www.googleapis.com/auth/adsense.readonly'] )
Google::APIClient::InstalledAppFlowと言うインスタンスを取得しています。client_idとclient_secretはclient_secrets.jsonから取得していますが、勿論直に文字列を渡してしまっても普通に通ります。
scopeも前回説明しましたね。Oauth認証でもらえる許可を指定します。
どのサービスにどんなscopeがあるかはOAuth 2.0 Playgroundで見れます。enumがあればこんなもの必要なかったんですけどね。
最後に
client.authorization = flow.authorize(file_storage)
flow.authorizeを呼び出せば自動でブラウザが立ち上がって認証画面が表示されます。引数に先ほど作ったfile_storageを渡すだけでキャッシュしてくれます。
SSL証明書をインストールする
実際にやってみると、認証後にブラウザが閉じずこんなエラーメッセージが出てくることがあります。
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed.
読んで字の如く、certificateのverifyにfailedしちゃってますね。
この辺は環境によって対処法が違うと思うんですが、Windowsだとhttp://curl.haxx.se/ca/cacert.pemを適当に落としてきて、SSL_CERT_FILEと言う環境変数に落としたファイルのパスを指定すればOKっぽいです。(参考)
その他の環境については興味ありません。各々でぐぐってください。
まとめ
これでまぁ、認証ぐらいなら通ると思います。
折角なので自分でテストしておいたコードも載せておきます。Google Analyticsのやつですが。
ポイントは「kconvか何かでtoutf8しないとマルチバイト文字のパースで死ぬ」ってところです。
# coding:utf-8 require "google/api_client" require "google/api_client/client_secrets" require "google/api_client/auth/file_storage" require "google/api_client/auth/installed_app" require "json" require "kconv" # application_nameもapplication_versitonも何でもいい # 渡す必要があるのかどうかすら不明 client = Google::APIClient.new(:application_name => "Test", :application_versiton => "0.0.1") file_storage = Google::APIClient::FileStorage.new("#{$0}-oauth2.json") if file_storage.authorization.nil? # 面倒だからclient_secrets関連は全部直に書いてる flow = Google::APIClient::InstalledAppFlow.new( :client_id => "", :client_secret => "", :scope => ["https://www.googleapis.com/auth/analytics"] ) client.authorization = flow.authorize(file_storage) else client.authorization = file_storage.authorization end # このclient.discovered_apiで渡す引数の一覧はどこにあるんだろう… analytics = client.discovered_api("analytics", "v3") # api_methodに使いたいメソッド、 # parametersにURIのクエリのハッシュを渡す # 結構面倒臭い result = client.execute( :api_method => analytics.data.ga.get, :parameters => { # idsは自分のをいれてね "ids" => "", "start-date" => DateTime.now.prev_month.strftime("%Y-%m-%d"), "end-date" => DateTime.now.strftime("%Y-%m-%d"), "metrics" => "ga:visitors", "dimensions" => "ga:pageTitle", } ) # result.response.bodyにjsonがそのまま入っている # 折角のライブラリなんだから最初からパースしたハッシュで渡せよハゲ、と思ってはいけない # ちなみにstring.encodeだとどう頑張ってもマルチバイト文字が引っかかってjsonがパースできなかった body = JSON.parse(result.response.body.toutf8) body["rows"].each{|row| puts row.tosjis }
参考
igaiga diary(2013-06-17)
[C#]Google APIを使うためにOauth2認証する
前書き
GoogleのAPI Consoleにプロジェクトを登録すると、Googleの膨大な資産で遊べたり、Googleアカウントを利用して各サービスのAPIを叩いたりすることが出来ます。
更に各言語でGoogle APIを叩くためのライブラリが無料で公開されているため、自分の好きな言語で思っている以上に簡単に遊ぶことが出来ます。
このライブラリはGoogle Data APIsのライブラリとはまったく違うものです。
Google Data APIsのページにも「The Google Data APIs documentation applies only to the older APIs」と書かれている通り、Google Data APIsは古いAPIであり今は使えないので、無駄にインストールしないようにしましょう。私はしてしまいました。
って言うか、Google側でリダイレクトしてくれよ、とも思うんですけどね。巷のGoogle APIに関する記事もGoogle Data APIsの頃に書かれたものが多いので、場合によっては全く参考にならなかったりします。きっとこの記事もそのうち全く役に立たなくなるでしょう。Androidの互換性もこれぐらい派手にぶっ壊してくれないかなぁ。
そんなわけで今回は.NET用のライブラリでInstalled applicationでのOauth2認証をやってみます。Googleと.NETがイメージとして結びつきにくいからでしょうか、ぜーんぜん記事がなくて中々面倒でした。わかると非常に簡単なんですけどね。
Web applicationとかService accountとかだとまた全然やり方が違うんでしょうが、私が興味ないのでやりません。頑張ってね。
API Consoleにプロジェクトを登録する
そもそもAPI Console自体がUIごと派手に更新されまくってるせいで「こうやればいいですよ~」みたいな記事もあっという間に役に立たなくなります。
2014年01月23日時点での登録方法はこんな感じです。画像無しで説明するのが死ぬほど辛いUIなので、リンクを張ってお茶を濁しておきます。
とりあえず今回必要なのはClient IDとClient secretだけなので、頑張って取ってきてください。
Nugetで必要なものをインストールする
まぁ今時.NETでライブラリをインストールさせるのにNugetが用意されてなかったら「おいおい(笑)」みたいな気分になるんですが、ちゃんと用意されてます。流石ですね。
ここから自分の使いたいサービスを選択すると詳細なドキュメントへのリンクとNugetへのリンクが表示されます。
例えばGoogle Play Android Developer API Client Library for .NETとか言うわざわざ.NETでは叩かなそうなサービスを選択すると、「Downloading the library」と言うセクションがちょっと下にあり、nuget galleryへのリンクが紹介されています。
勿論Nuget経由ですので、Oauth認証に必要なライブラリとか、その他依存関係のあるライブラリは全部まとめてインストールされます。
Oauth2認証をやってみる
じゃあいきなりコードです。今回私はGoogle AnalyticsのAPIをゴニョゴニョしたい気分なので、それをNugetでインストールしてあります。
using System; using System.Threading; using Google.Apis.Analytics.v3; using Google.Apis.Auth.OAuth2; using Google.Apis.Util.Store; using Google.Apis.Services; namespace WindowsFormsApplication1 { class AnalyticsServiceWrapper : IDisposable { private const string CLIENT_ID = ""; private const string CLIENT_SECRET = ""; private const string API_KEY = ""; private const string PROFILE_ID = ""; private readonly AnalyticsService _service; public AnalyticsServiceWrapper() { var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = CLIENT_ID, ClientSecret = CLIENT_SECRET }, new[] { AnalyticsService.Scope.Analytics } , "user" , CancellationToken.None , new FileDataStore("TumblingDiceAnalytics") ).Result; _service = new AnalyticsService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "TumblingDice", ApiKey = API_KEY, }); } public void Dispose() { if (_service != null) _service.Dispose(); } ~AnalyticsServiceWrapper() { if (_service != null) _service.Dispose(); } } }
コンストラクタとDisposeとデストラクタしかありません。今リアルにここまでしか書いてないからです。のんびり作ります。
まぁそれはどうでもよくて、Developer’s GuideのOAuth 2.0に関するドキュメントの例と突合せながら解説していきます。
ドキュメントではこんな例が表示されています。
UserCredential credential; using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) { credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, new[] { BooksService.Scope.Books }, "user", CancellationToken.None, new FileDataStore("Books.ListMyLibrary")); }
見ての通りバリバリawaitを使ってます。クールですね。私の環境は4.0なので全部Resultでとってきています。ダサいです。
さて、いきなりFileStreamでjsonを読もうとしてます。なんぞこれ?と思うのは当然なんですが、これはClient Secretsのドキュメントに載っています。こう言ったjsonを作っておくことでコードに依存せずにWeb ApplicationやInstalled applicationを切り替えられるわけですね。
別にハードコーディングしちゃってもいいんだけど、って場合は私が書いたコードのようにしてしまっても問題ありません。
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = CLIENT_ID, ClientSecret = CLIENT_SECRET }, new[] { AnalyticsService.Scope.Analytics } , "user" , CancellationToken.None , new FileDataStore("TumblingDiceAnalytics") ).Result;
次に謎の配列です。
UserCredential credential; using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) { credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, new[] { BooksService.Scope.Books }, "user", CancellationToken.None, new FileDataStore("Books.ListMyLibrary")); }
これはScopeと呼ばれており、どうやらデータを操作できる範囲の許可を選べるみたいです。どのサービスであっても「○○(使いたいサービス)Service.Scope」と言うenumに全部登録されてるので、Intellisenseでそれっぽいやつを選んでください。
次に謎の「user」と言う文字列…なんですが、正直よくわかってません。パラメータ名は「userId」となっているんですが、例のままuserって文字列を渡しても何の問題もありませんし、またuser以外の文字列を渡している例や解説も見つかってません。何なんでしょうね?
CancellationTokenは直感でわかると思うので飛ばしてFileDataStoreについて説明します。
UserCredential credential; using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) { credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, new[] { BooksService.Scope.Books }, "user", CancellationToken.None, new FileDataStore("Books.ListMyLibrary")); }
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = CLIENT_ID, ClientSecret = CLIENT_SECRET }, new[] { AnalyticsService.Scope.Analytics } , "user" , CancellationToken.None , new FileDataStore("TumblingDiceAnalytics") ).Result;
これは再度Oauth認証しなくても済むよう自動でキャッシュしてくれます。認証に成功すると<ユーザ名>AppData\Roamingにコンストラクタで渡した名前のフォルダを作り、その中にJSONがそのまま放り込まれます。オプション引数となっていますが、指定しない or nullを渡すとデフォルトのフォルダが作られます。
で、このAuthorizeAsyncを呼ぶと、自動でブラウザが立ち上がり認証画面が表示されます。
多分皆さんは全然関係ないと思いますが、内部でProcess.Start(url)されてるので、httpsを開けるよう規定のプログラムを設定していないと「ファイルの関連付けがないから開けない」と容赦なくWin32Exceptionが飛んできます。私はこれで半日潰しました。
もし万が一同じ事象に悩まされてしまった人はこれを参考にうまいこと規定のブラウザを設定してあげてください。
認証結果を使ってServiceを作成する
無事に認証が成功したら後は使いたいサービスのインスタンスを作成します。
ドキュメントの例ではこんな感じですね。
// Create the service. var service = new BooksService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Books API Sample", });
私が書いたコードはこんな感じです。API Keyがいるのかいらないのか、よくわかりません。
ApplicationNameは多分何でもいいと思います。
_service = new AnalyticsService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "TumblingDice", ApiKey = API_KEY, });
まとめ
後は各サービスの詳細なドキュメントとにらめっこして思い思いのアプリケーションを作ってみてください。
JSONベースだからか、この後はやたらと引数に文字列を渡させようとしてくると思いますが、APIs Explorerと言う便利なツールがあるのでこれでデバッグしながら頑張りましょう。頑張ります。
参考
Google APIs ConsoleでのProjectの作成方法 | GMaster:IT TRICK
インターネットショートカットを開こうとしたらショートカットエラーが出て開けな… - Yahoo!知恵袋
الإعلاميات للجميع !
دروس الرياضيات للمستويين الإعدادي و الثانوي. أكثر من 300 درس موجهة للجميع. الشرح بالفيديو و باللغة العربية. دراسة الدوال بجميع أنواعها، الحساب المثلثي، حساب التكامل، المعادلات التفاضلية و الأعداد العقدية كلها تم شرحها إضافة لدروس الهندسة و مواضيع أخرى.
دروس الفيزياء موجهة للمستوى الثانوي. أن كنت تدرس بالباكالوريا ستجد جميع الدروس مشروحة بالفيديو. الشرح باللغة العربية و يعتمد على تقديم أمثلة لتبسيط المفاهيم. الديناميك، الميكانيك، الهندسة الكهربائية، العدسات البصرية و فيزياء النواة و الذرة بعض من الدروس التي تم شرحها لحد الآن.
Dear server-side authentication with Google APIs using OAuth2:
Hatred.