API に関する投稿を表示しています

Google Analytics API を使ってアシストコンバージョンを取得したかった

Google Analytics の API を使ってアシストコンバージョンをとりたいが、通常のセッション数などを取得できる Core Reporting API にはアシストコンバージョンという指標は無く取得することができない。 Multi-Channel Funnels Reporting API を使うことでその指標は取得できるようになる。がトラップがあり、やりたいことはできなかったので、タイトルが過去形。

なお MCF API のドキュメントにあるサンプルでは Java で書かれているが、言語別のライブラリが持っているインターフェースはおよそ同じなので、読み換えればよい。

Multi-Channel Funnels Reporting API - デベロッパー ガイド  |  アナリティクス Multi-Channel Funnels Reporting API  |  Google Developers

PHP ならこんな具合にして MCF をコールできる。

// セッション準備
session_start();

// API利用のための認証
//==================================================
$client = new \Google_Client();

// クライアントキー、シークレットの設定
// Developer Console で登録すると発行される
$client->setClientId('...');
$client->setClientSecret('...');

// オフラインアクセスを付与するとリフレッシュトークンを使って無期限にアクセスできる
$client->setAccessType('offline');

// 認証画面を都度表示する
$client->setApprovalPrompt('force');

// リダイレクトURLの設定
// Developer Console で設定した値と合わせないとエラーになる
$client->setRedirectUri('.....');

// アクセス権限の設定
$client->addScope([\Google_Service_Analytics::ANALYTICS_READONLY]);


// 認証が通ってくるとcodeがついてくるのでコレを利用して認証を通す
if (!empty($_GET['code'])) {
    unset($_SESSION['refresh_token']);
    $client->fetchAccessTokenWithAuthCode($_GET['code']);
    $_SESSION['refresh_token'] = $client->getRefreshToken();

} else {

    // リフレッシュトークンがなければ認証URLに飛ばす
    // とりあえず試すならセッションから読み込むと良い。
    if (empty($_SESSION['refresh_token'])) {
        header('Location: ' . $client->createAuthUrl());
        exit;
    }

    // リフレッシュトークンで認証する
    $client->refreshToken($_SESSION['refresh_token']);
}


// Google Analytics とのやり取りするオブジェクト準備
//==================================================
$analytics = new \Google_Service_Analytics($client);


// MCF API を実行する
//==================================================
$gaRequestResult = $analytics->data_mcf->get(
    // プロファイルID
    'ga:......',

    // 開始日
    '30daysAgo',
    // 終了日
    'yesterday',

    // 取得するメトリクス
    'mcf:assistedConversions',

    // 追加のオプション
    [
        'dimensions' => 'mcf:source',
        'filters' => 'mcf:source=@.',
    ]
);


// 結果確認
//==================================================
var_dump($gaRequestResult);

この例だと、流入元別のアシストコンバージョンを30日前から昨日まで範囲で取得する。また流入元の値に "." が含まれていることを条件とする。 流入元とは言うが (direct) のような値も入ってきて厄介。そこで「"." が含まれていること」にすればドメインが付いているものだけ抜けるという仕組み。

Google Developer Console で、このあたりから API 登録をすると動かせるようになる。

https://console.cloud.google.com/apis/dashboard

しかし、実はこの MCF API にはトラップがある。それはディメンションの設定にある。

Google Analytics の画面上からはデバイス別のアシストコンバージョンを確認することができるが API からはこれを確認するすべはない。ドキュメントを見ても MCF API のディメンションにはデバイスの話はない。

ディメンションと指標のリファレンス  |  アナリティクス Multi-Channel Funnels Reporting API  |  Google Developers

また MCF API を呼ぶときにディメンションに Core Reporting API の値を設定してもエラーになってしまう。逆に Core Reporting API を呼び出すときに MCF API のもの(アシストコンバージョンなど)を設定してもエラーになる。

ちなみに Core Reporting API で使える指標はここ。

Dimensions & Metrics Explorer  |  アナリティクス Reporting API v4  |  Google Developers

まあ。アシストコンバージョンそんな重要じゃねーからよくね、って話なのかもしれない。

Web Audio API と IBM Bluemix のワトソン君で音声認識(追記あり)

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

こんにちはごみばこです。

この記事はteratailの「Bluemixアドベントカレンダー」の参加記事として書かれました。

昨日は yutori_828 さんによる「クラウドx IoT女子会で推し(二次元)の話をしてきた」でした。
クラウドx IoT女子会で推し(二次元)の話をしてきた – ユニバーサルIoT女子文明

やりたいこと

最近いろいろな人と話すことが多く、手書きなりPCなりスマホなりでメモしているものの、すべてメモしているわけではありませんし、覚えていないことも多くあります。じゃあお手軽にメモするソリューションないかなあというところで、パッと思い浮かんだのが録音×音声認識です。

スマホで録音しつつ、音声認識しつつ、クラウド上にメモすることができれば最高なのでは…?

こんなところから始まっています。

できたもの

こんなかんじのやつ。

watson_audio

※編集していません。クリックしてからしゃべっています。
※5秒録音→文字起こし→5秒録音→文字起こし→... という処理になっています。

使ったもの

IBM Bluemix

アドベントカレンダーのテーマにもなっている、IBMが提供するAPIやPaaSといったサービスの総称です。

簡単に登録手順をおさらいしておきます。

Bluemix への登録

bluemix_register

以下の URL から Bluemix への登録ができます。

https://console.ng.bluemix.net/registration/

僕の場合は IBM ID を登録してから Bluemix をしましたが、Bluemix だけの登録もできるようです。

登録するとメール認証が求められます。メールからリンクを踏むと登録完了です。ここから30日間はトライアルということで無料で Bluemix のすべて(?)の機能を使うことができます。思う存分に楽しみましょう!

アプリケーションの登録

Bluemix では Cloud Foundry アプリ と呼ばれる、heroku のような、環境が整っていてコードを自由に設置することができる、PaaS を利用することで、Web サイトを制作することができます。

Cloud Foundry アプリは以下のような手順で登録していきます。

アプリケーションの画面を開いて新規追加。

bluemix_app

テンプレートが選べるので使いたいものを選びます。僕はPHPを選択しています。

bluemix_app_template

あとは勝手に環境が作られ、アプリケーションが動き始めます。すごい。

bluemix_app_run

この画面上で「アプリの表示」を押すと、ブラウザでその Cloud Foundry アプリの URL が開かれます。この URL で確認をしていくことになります。

IBM Bluemix Watson

IBM Bluemix には Watson という人工知能なAPI群があります。この中に Speech to Text という音声認識を行うことのできるAPIがあります。ここに対して、音声データを送ることで、Watsonが解析し、最適な文章を取得することができます。

Watson のすごいポイントは、英語だけでなく、日本語にも対応し、さらに漢字変換もされているところです。

中身に詳しいわけではありませんが、いくつか結果を見ての推測ですが、音声をある程度区切り区切りにし、それぞれに対する適切な文章を機械学習なもので割り出しているようです。その文章はすでに漢字変換されているものなので、変換されている文章が取得できるのでは?と思っています。さらに出来上がった文章の前後関係を見て、補正し、最終的により整合性の高そうな文章を提供している……のかなあ、なんて。

Watsonを利用するには、まず、Bluemix上でWatsonを接続する必要があります。

アプリケーションを開いたとき、サイドメニューに「接続」があります。これを開くと次のような画面が開き、接続したサービスの一覧が表示されます。

bluemix_app_connect

新規接続を選び、画面をよしなに進めていくと、Watson を選べる画面になります。ここでは Speech to Text を選択しました。
ほかにもたくさんサービスがあって面白そうですね;)

bluemix_app_connect2

そうすると、先ほどの接続したサービス一覧に出てくるようになり、認証情報を得ることができます。

bluemix_app_connect3

認証情報に書かれている情報をもって以下のようなAPIを実行することになります。


※Speech to Text の例

■HTTP リクエスト
○URL
https://stream.watsonplatform.net/speech-to-text/api/v1/recognize?continuous=true&model=ja-JP_BroadbandModel

○HTTP ヘッダ
Authorization: Basic {base64_encode("username:password")}
Content-Type: {audio content type}

※ HTTP ヘッダの例
Authorization: Basic dGVzdDp0ZXN0
Content-Type: audio/wav

○HTTP メソッド
POST


■HTTP レスポンスの例
{
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.106,
          "transcript": "うん "
        }
      ],
      "final": true
    },
    {
      "alternatives": [
        {
          "confidence": 0.32,
          "transcript": "看板 見る "
        }
      ],
      "final": true
    }
  ],
  "result_index": 0
}

API詳細な説明については公式ドキュメントを見るとよいでしょう。

Speech to Text - API | IBM Watson Developer Cloud

Web Audio API と MediaStream Processing API

録音の部分では、スマホで、という想定ではありますが、やはり世界はWebに集約されるよう動いている(?)ので、ここはWebの資産を利用しましょう。

Web Audio APIを利用すると、音声に関する取り扱いを行うことができます。
そこに合わせて MediaStream Processing API を利用することで、ブラウザのみで動画や音声の記録ができます。

組み合わせることで、録音したデータをバイナリとして取得することができます。

作業していて、ちょっとだけ詰まったのですが、Chrome ではいつからか https な URL でないと Web Audio API を利用することができませんでした。音も隠さないといけない情報なので、というところだと思います。録音して外に送るってときに、パスワードとか個人情報とか社内機密をしゃべっているようなデータを http で送るとかめっちゃ怖いですよね…笑

詳しい仕様や実装などは僕もあまり詳しくないので、詳細はこちらの記事を参考にしました。

Media Capture and Streams と Web Audio API で実現する録画・録音・ WAVファイルの生成 | CYOKODOG

IBM Bluemix DevOps Services

Bluemix に初めて登録して、アプリケーションを登録したところで、いろいろ眺めていたのですが、 heroku のような、PaaSの触感がありました。

コードをデプロイするにはCLIを入れてね!なんて書いてあったのですが、ちょっとローカルPCにあれこれ入れるのは避けたいなあと思い、ひとまずなるべく手をかけずに…。

と思っていたら、Git からデプロイできるそうなので、そちらを試してみました。リモートリポジトリが提供されて、ローカルのコードを Push したらデプロイされる、といったものを想像していたのですが、それだけの機能ではありませんでした。

アプリケーションの Git を有効化すると「コードの編集」というボタンが現れます。

まさか、と思い押してみると、そこにはかっこいいオンラインエディタが…!

bluemix_web_editor

この中では、コードの編集はもちろんのこと、Gitの操作も行うことができます。そして何より、編集して、そのままデプロイができます。これにより、とりあえずBluemixを試す、という動きをサクサク行っていくことができました。

bluemix_web_editor2

まとめ

結果として出来上がったものは、微妙な精度ではあるものの、IBM Bluemix を初めて触ってみて、便利そうなところを体感するには十分でした。

ばーーーっと書いてみた程度のものですが、gistに貼ってあります。試してみたい方はどうぞ!

https://gist.github.com/sters/46e042e5976b6244119baaf26b096e82

登録してから30日間は無料で使えるので、もうしばらく無料枠の間に遊んでみようと思います。Speech to Text 以外の Watson API も、画像認識を始め言語に関するものなど、楽しそうなものが多いので、あんなものやこんなものが作れるんじゃないだろうか、なんて思っています。

追記:ドキュメントを眺めていたら WebSocket をつなげるそうなので、それを使えるとさらに良いかも…!

明日以降もお楽しみに! -> Bluemixアドベントカレンダー

話題のLINE BOTでちょっとだけ遊んでみた

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

目次

  • ムムッ!8秒に1人登録者が増えるんです!
  • 実装について
  • SSLが通らない
  • API Gatewayの設定を間違える
  • でばっぐがむづかしい
  • 画像サイズ制限
  • 構成上の問題
  • おわりに

Qiitaやはてブでよく見るほどに巷で話題のLINE BOTですが、私も参戦してみました。

BOT API Trial Accountのご紹介 | LINE BUSINESS CENTER

ムムッ!8秒に1人登録者が増えるんです!

できたbotがこちらです。
13000133_1058043724268365_4544060361943443361_n

顔写真を送るとムムッなカードを結合して送り返してくれます。

ちゃんと複数人も認識してます。

1460689208363

(社内の人に協力してもらいました。ありがとうございます!)

出来たこのbotを公開したい気持ちはやまやまですが、ムムッな版権や、アーキテクチャやら実装の問題もあってちょっとNGです。

コードなら公開できるので、またのちほど。。

実装について

LINE BOTのコールバックとして、画像の場合はテキストとは異なるデータがやってきます。
そのとき、LINE側に対してメッセージIDでリクエストをすると、そのデータに紐づくコンテンツ(画像、動画、スタンプ…)を受け取ることができます。
(詳細はドキュメント参照: LINE Developers - BOT API - API reference

こうして受け取った画像をそのまま顔認識に送っています。この部分には、Face++というサービスを利用しています。

Face++: Leading Face Recognition on Cloud

戻ってきた情報には、顔の位置を始め、目の位置や口の位置、さらには表情データなども含まれています。
この顔の位置、目の位置を計算し、カードの画像に対してサイズ調整・回転を施して、合成しています。

出来上がった画像を、LINEに送信することで、BOTのレスポンスになります。


はてさて、参戦していくなかで、初めてやることだらけで非常にわくわくするとともに、
すごい詰まったことがいくつかあったので、それらを書き綴っておきます。

SSLが通らない

LINE BOTには、コールバックとしてSSLなURLを指定しなければいけません。
しかし、すでに各所で話題に上がっているように、Let’s Encryptでは通信の確立がうまくできないいようです。

そこで、今回はAWSのAPI Gatewayを利用してみることにしました。

Amazon API Gateway (API を容易に作成・管理) | AWS

「ひとまず試してみる」というこで構成としては以下のようになっています。

<span class="hljs-constant">LINE </span>-> <span class="hljs-constant">AWS API Gateway </span>-> <span class="hljs-constant">VPS </span>-> <span class="hljs-constant">LINE</span>

API Gatewayの設定を間違える

これは完全にうっかりミスです。

LINE BOTのコールバックはPOSTメソッドで飛んでくるのですが、GETメソッドしかAPI Gatewayに登録してなくて、数時間を無駄にしました。。ちゃんとドキュメントを読もう!

また、API Gatewayでは指定したHTTPヘッダがプロキシされていくので、シグネチャについても指定しないといけません。

でばっぐがむづかしい

LINEでメッセージや画像を送ってはサーバのログをみて、という結構無駄な開発作業をしていました。

よくよく考えれば、メッセージやりとり部分は後で繋ぐようにし、コアな処理を別に実装したほうがよいですきっと。
メッセージやりとりをあとで繋ぐようにすることで、LINE以外にも各種bot系に組み込むことも簡単にできると思います。
そしてテストも書きやすくなるので…。。

画像サイズ制限

これもドキュメント読もう案件です。。

LINEにメッセージを送る際、画像はJPEG限定、1024px x 1024px以下にしないといけないようです。
また、プレビュー用の画像を用意する必要があり、こちらもJPEG、240px x 240px以下にしないといけません。

どちらの画像もURLとしてアクセスできる場所に設置し、そのURLをLINEに伝えることでbotが送信してくれます。

構成上の問題

いまはお試しということで、コールバックへのリクエストが来たら、メッセージを送信を含むすべての処理をしています。しかし、この方法では、人が増えてきたときにサーバ負荷が上がり、快適なレスポンスが得られなくなってしまいます。
(※現状でも顔認識や画像処理でラグがあるので快適とそうでないのぎりぎりくらいです。。)

どうすれば快適なレスポンスが得られるかについては、すごい分かりやすく深い記事が上がっています。

大量メッセージが来ても安心なLINE BOTサーバのアーキテクチャ - Qiita

今の構成は以下のようになっています。

<span class="hljs-constant">LINE </span>-> <span class="hljs-constant">AWS API Gateway </span>-> <span class="hljs-constant">VPS </span>-> <span class="hljs-constant">LINE</span>

これを・・・例えばこう、えいやっと・・・

<span class="hljs-constant">Callback </span>     <span class="hljs-symbol">:</span> <span class="hljs-constant">LINE </span>-> <span class="hljs-constant">AWS API Gateway </span>-> <span class="hljs-constant">AWS Lambda </span>-> <span class="hljs-constant">AWS SNS </span>-> <span class="hljs-constant">AWS SQS</span>
<span class="hljs-constant">Execute Batch </span><span class="hljs-symbol">:</span> <span class="hljs-constant">AWS SQS </span>-> <span class="hljs-constant">AWS Lambda </span>-> <span class="hljs-constant">Another API </span>-> <span class="hljs-constant">AWS SNS </span>-> <span class="hljs-constant">AWS SQS</span>
<span class="hljs-constant">Response Batch:</span> <span class="hljs-constant">AWS SQS </span>-> <span class="hljs-constant">AWS Lambda </span>-> <span class="hljs-constant">LINE</span>

うーん、どうなんでしょうかね…w

あとは記事に書かれているように、メッセージに対する並列処理をできるようにすると、快適なレスポンスが得られるようになってくるのかなあ、と思います。


おわりに

Facebookもメッセンジャーbotやるよ!と発表があったように、botの波が来ています。

みなさんが開発したり運営しているようなWebサービスであったり、流行りつつあるIoT、TensorFlowといった機械学習、などなどなどに加えたメッセンジャー系botのコラボは、きっと新たなユーザー獲得やユーザー体験をもたらすと思います。

まずは触ってみて、どんなことができそうかを考えていくときっと楽しいとおもいます!