シリコンバレーのマーケター日記

東京、シンガポールを経てシリコンバレーで働く、マーケター。英語、プログラミング、データ分析は次世代マーケターの必須スキルだと信じて進む。

Google Predition APIに触れる

今月はGoogleがクラウド自然言語APIを公開したことが話題になってましたね。

文章からセンチメント(ポジティブかネガティブか)の判断を返すAPIも公開されたようで、ソーシャルメディアを使っているマーケターには朗報です。

以前からpredition APIは公開されていましたが、こちらは学習モデルのみで学習データは自分で集めて精度を上げていかなければいけないようです。

例えば、以下のようにFeeling kind of low....は"悲しい"、OMG!は"興奮している"、Eating eggplant.は"つまらない"のようにラベリングされたデータセットが必要です。

"sad", "Feeling kind of low...."
"excited", "OMG! Just had a fabulous day!"
"bored", "Eating eggplant. Why bother?"

 

ひとまず、Predition APIを以下の手順でいじってみました。週末は自然言語APIを触ってみようと思います。

 

手順

1) アカウントをつくる

2) Projectをつくる

3) Projectに紐づいたCloud Strageを作る

4) Cloud Strageに学習データをuploadする

5) API explorerでいじる

 

Tool

Google APIs Explorer:APIを試すためのページ

Google Cloud Platform:コンソールページ

 

Prediction API 参考ページ

google prediction APIの使い方 - 困ったー:わかりやすい

https://cloud.google.com/prediction/docs/hello_world:Google公式の解説

https://cloud.google.com/natural-language/docs/getting-started:自然言語APIの解説

 

自然言語API 参考ページ

https://cloud.google.com/prediction/docs/sentiment_analysisGoogle公式の解説

Googleクラウド自然言語APIを使ってみた - Qiita

Facebook API 入門

Facebook APIの規約について質問を受けました。海外のプラットフォームの場合、開発者向けサイトは翻訳されていなく、そしてだいぶ曖昧な表現が多く読んでもイマイチわからない。というケースがよくあります。

そんなときは、自分で使ってみるのが一番早い。とはいえ、developer登録してaccess tokenとapp IDを発行して、、と手間がかかります。というわけで、プラットフォームが用意している以下のようなAPIお試しツールを使いましょう。

Facebook Graph API Explorer: https://developers.facebook.com/tools/explorer

Twitter API Concole Tool: API Console Tool | Twitter Developers

 

例:アプリがFacebookの友達リストを入手するための必要条件は?

Step.1: 開発者ページからHTTP APIリクエストのコードを入手

Facebook開発者ページから、friend情報に関するAPIのページをさがします。どうやら、"API用URL/{user id}/friends" と入れると、friend listが返ってくるようです。

f:id:yuyutata:20160504174143p:plain

Step.2: 上記のFacebook Graph API Explorerに行って、実際にsubmitする

friend listが出てきません。あれれ。

f:id:yuyutata:20160504174713p:plain

Step.3: Step.1とStep.2を繰り返す。

ページに戻ると以下のように書いてあります。

- A user access token with user_friends permission is required to view the current person's friends.

- This will only return any friends who have used (via Facebook Login) the app making the request.

- If a friend of the person declines the user_friends permission, that friend will not show up in the friend list for this person.

なるほど。user_friends permission が必要なようです。というわけで、Graph API Explorerに戻って、”Get Token”をクリックして、”Get User Access Token”をクリックします。指示通り、user_friendsを選んで”Get Access Token"!

f:id:yuyutata:20160504181920p:plain

そして、me/friendsと打って"submit"とすると、自分の友達リストが出てきたと思います。しかし、以下のdebugメッセージも出てきました。

f:id:yuyutata:20160504233958p:plain

  • Only friends who installed this app are returned in API v2.0 and higher. total_count in summary represents the total number of friends, including those who haven't installed the app.Learn More
  • Friend list is no longer part of the default permission set and has its own permission: Asking for access to a person's friend list is now a separate permission that your app must request. The new permission is called user_friends.
  • Friend list now only returns friends who also use your app: The list of friends returned via the/me/friends endpoint is now limited to the list of friends that have authorized your app. 

 結論:API v2.0以上では、アプリにuser_friends permissionを付与したユーザーしかfriend listには引っかからない(つまり全ての人がそのアプリにFacebookログインして、user_friends permissionを付与しなければ、全ての友達関係は入手できない)。

試しに、実際のテストアプリ(友達だれもログインしてない)でme/friendsをsubmitしてみると、以下のようになりました。

Tips: 右上のApplicationのドロップダウンメニューでGraph API Expolerから自分でdeveloper登録したアプリに切り替える。

f:id:yuyutata:20160504234930p:plain

f:id:yuyutata:20160504234616p:plain

 

Facebook APIのまとめ

  • 困ったらdeveloper pageでAPIを確認
  • Facebook Graph API ExplorerでAPIの挙動を確認
  • 実際のアプリでの挙動を確認したい場合は、実際に登録したアプリに切り替えてAPI Explorerで確認

 

FBアクセストークン確認ツール: 

https://developers.facebook.com/tools/debug/

 

こんな感じカニ。

XMLの取り扱い

APIを色々いじっている最近ですが、ついにXMLに出会いました。

JSONと勝手が違い躓いてしまったんで、記しておく。

 

1. file_get_contentsではなくcurlを使う。

htmlheaderにアクセストークンを仕込んでJSONと同じようにfile_get_contentsで一発だぜと思っていたのですが、どうしてもうまくいかない。curlを使って解決。

 

$url = 'https://product-search.api.cj.com/v2/product-search?'.
        '&keywords='. rawurlencode($_GET['keywords']);

$curl = curl_init($url); // 初期化

$options = array(
  //HEADER
  CURLOPT_HTTPHEADER => array(
      "Authorization: トークン",
  ),
  //Method
  CURLOPT_HTTPGET => true,//GET
);

//set options
curl_setopt_array($curl, $options); /// オプション値を設定
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

$result = curl_exec($curl); // リクエスト実行

$result2 = simplexml_load_string($result);

2. XML Objectを配列にパースする

ここで、$resultには、XML Objectという形でデータが入っています。foreachで値を取り出せるかなと思いきや、ダメでした。JSONを経由させて配列にかえます。

$json = json_encode($result2);
$array = json_decode($json,TRUE);

これで配列になりました。もーみんなJSONでいいじゃん。。

 

JSONの扱いかた

APIでデータを引っ張ってくるとたいがいJSON形式で返ってきます。JSONデータをサーバーサイド(php)で扱う場合と、フロントサイド(javascript/ Jquery)で扱う場合をまとめます。

 

JSONをPHP内で扱う

$api = file_get_contents(APIのURL);  //この時点ではstring型のjson

$arr = json_decode($api); //ここで、String型のjsonがArray,配列になる

foreach($arr as $value){

};  //配列をまわして値を取り出して行く

 JSONをjsで扱う

$.ajax({
 url: "insta_hashtag.php", //PHPファイルのURL
 type:"GET",
 dataType: "json", //apiで返ってくるデータの形式を指定

 }).done(function(data){  //通信成功時の処理
 $.each(data,function(i,item){
 //配列をまわして値を取り出して行く

 });
}).fail(function(){ //通信失敗時の処理

}).always(function(){ //通信完了時の処理

}); 

foreach, $.eachを活用して効率よく抜き出して行くことが重要です。

Facebookリード獲得広告とウェビナーを繋ぎこむ準備

3週間のアメリカ出張兼新婚旅行からシンガポールに帰国しました。インド旅行から帰国した週からアメリカだったので、ようやくお家でホッとしています。

最初の2週間は出張でベイエリアにいました。一緒に旅行にも行く本当に尊敬していた本社の同僚が起業するために退職を決めていたり、ベイエリアにやよい軒がオープンしていたり、良い刺激をもらいました。最後の1週間はお休みをとり、奥さんとフロリダのディズニーワールド、ユニバーサルスタジオを回り、ニューヨークでラーメンを食べて、NYUのMBAに行っている大学院同級生と金融業界で働く学部同級生と、楽しい時間を過ごしました。どんどん、自分の周りが世界に羽ばたいていて、これまた良い刺激をもらいました。

さて。

私は、B2Bマーケティング部署に所属しているのですが、ウェビナー(オンラインセミナー)はグローバルで重要なチャネルです。

弊社では、CITRIXのGoToWebinarを使っています。いつのまにか日本語にも対応していますね。

Web ミーティング | GoToMeeting™ Japan

ウェビナーでは参加者の数がKPIとなるわけですが、広告を走らせて参加申し込みページに遷移させる施策では、途中でドロップしてしまう人が多くなってしまいます。

デジタル広告->クリック->参加登録ページ->申し込み

たとえばCTRが1%、申し込み率が10%だとすると、1000人に1人しか申し込みしてもらえません。

そこで、Facebookのリード獲得広告とGoToWebinarを繋ぎ込めば、Facebookから外へ遷移せずに申し込みが完了します。

GoToWebinar API詳細ページ

 

ここでハマったポイントとしては、

CITRIXのdeveloper pageを見ると、linuxのサンプルコードは書いてあるが、phpのコードが載っていない。

例えば、LinuxのPOST通信。

curl -X POST -H "Accept:application/json" -H "Content-Type: application/x-www-form-urlencoded" "https://api.citrixonline.com/oauth/access_token" -d 'grant_type=authorization_code&code={responseKey}&client_id={consumerKey}'

これを解読してPHPに書きなおしました。

//青色のところは、都度変える

$url = 'https://api.citrixonline.com/G2W/rest/organizers/{organizerKey}/webinars/

{webinarKey}/registrants?resendConfirmation=true';

$headers = array(
    'Content-Type: application/json',
    'Accept: application/vnd.citrix.g2wapi-v1.1+json',
    'Authorization: OAuth oauth_token={access token}'
);

$regist = array(
    'firstName' => 'taro',
    'lastName' => 'yamada',
    'email' => 'taro@yamada.com',
    'jobTitle' => 'Marketing Manager',
    'organization' => 'taroyamada.inc',
);

$options = array(
    'http' => array(
        'header' => implode( "\r\n", $headers ),
        'method' => 'POST',
        'content' => json_encode($regist)
    )
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);

Learnings

1. Facebookアプリでもそうですが、アプリがユーザーの情報にアクセスするためには、access tokenをその都度もらわないといけない。(それぞれの家の鍵みたいな)

2. phpでcurlをつかってhttp通信できるが、使わなくてもできる

3. phpでPOST送信するときに、JSONなのか、 クエリ文字列なのか、受け取る側のデータ型に合わせないといけない。GoToWebinarはJSON指定でした。

JSON:json_encode()で、ArrayをJSONに変換する

クエリ文字列:http_build_query()で、Arrayをクエリ文字列に変換する

クエリ文字列(URL-encoded query string)は、よく広告計測で使われる data1=neko&data2=inu  みたいな文字列です。

 

雑感

自分のチームのためにつくるならば、難しくないのですが、これを一般化=製品化するとなると複雑になってきて難しい。そろそろプロダクトアウトしたいです。

 

参考コード:

Delhi Bellyならぬ、Goa Belly。SMS API良い感じ。

金曜の夜からインドに来ています。

ムンバイで一泊して、南下したところにあるゴアというリゾート地に来ています。

会社の同僚で僕の結婚式にも来てくれたイギリス人男性とインド人女性の結婚式です。社内婚。招待客もみんな友達でとっても居心地の良い結婚式のはずが、昨夜からずっと下痢。もはや水。なんかザリガニの匂いする水。もともと、Delhiに行った欧米人がみんな下痢するっていうことで、”インドでする下痢”は英語で、Dehli Bellyといいます。というわけで、僕はGoa Belly。

前回のインド出張でもやっぱりずっと下痢でした。インドとは本当に相性が悪いらしい。あーシンガポール帰りたい。明日の深夜便で帰ります。

 

さて、先週、面白いAPIを見つけました。

シンガポールのチリクラブで有名なジャンボや、夜景の綺麗なバーLevel 33で予約をすると、電話をかけた携帯に予約確認のSMSが飛んできます。また、予約日になるとリマインダーSMSも飛んできます。

これ、どうやっているんだろうということで調べてみたら、いろいろありました。そんななか、シンガポール企業が提供しているSMSのAPIを使ってみました。

CommzGate Cloud SMS - SMS Gateway with Push Messaging

無料で、自分のアプリに入れて使うことができました。

 

番号を持たないでSIMカードとメッセージアプリで通話をする尖った友人もいますが、大多数は番号をもっているわけで、E-mailにくらべて、appのpush notificationとSMSは、re-engagementにおいて結構使えるんじゃないかなと思ったりします。ただ、appのpush notificationは、アプリをユーザーの携帯にインストールしてあることが前提。

SMSの難点は、開封率がtrackingできないことと、communicationがTextだけということ。

しかし、そもそも開かれないE-mailよりはずーっと良い気もします。

 

トイレに宇宙を描く俺。嫁は優しく天体観測。

キャリアを考えた

昨日、シンガポールのMBAに合格が決まった友人のキャリア相談にのってきた。自分の中での気づきも多く、人と話をするのは大事だなと。そしてやっぱり頑張る人は好きだなと。

さて、キャリアとは掛け算だといろんな人が言っています。

自分の価値をかけ算して「レアな人材」になれ 2014年、絶対やるべきことリスト[2]:PRESIDENT Online - プレジデント

 

自分のケース:

グローバル×マネージメント×セールス&マーケティング×プログラミング

グローバル:外資系企業の海外オフィスで日本市場とは関係ないところで戦っている。日本人という下駄が一切使えない環境。

マネージメント:インド人とシンガポール人の部下。

セールス&マーケティング:前職でB2Cのマスマーケティング、現在の会社でセールスを経て、デジタルマーケティング部署の立ち上げ責任者。

プログラミング:webアプリ、 iOSアプリ計測ツール開発。

 

しかし、どこまで行っても中途半端感が否めない。

グローバル:結局今でも、ネイティブが幹部の殆どを占めており、英語とリーダーシップじゃ全然敵わないと思ってる。

マネージメント:結局いまの部下は、年下だし、欧米のがちネイティブではない。年上、ネイティブをしっかりマネージメントできるのか。

セールス&マーケティング:本気のセールスほど人脈はない。マスマーケティングは離れて久しい。デジタルマーケティングに関しては、絶対誰にも負けない自信はある。

プログラミング:弊社本気プログラマーには遠く及ばない。その辺の中途半端な文系のプログラマーには負けないとは思ってる。

 

転職市場での話:

日系企業からの転職オファーは、給料、ポジションともに下がるケースが殆どである。扱いづらいキャリアなんだと思う。本当に舐めたオファーが多い。

外資系からの転職オファーは、完全に日本市場と関係なく、韓国、中国、香港と様々なところからデジタルマーケティング領域のマネージメントポジションでのオファーは多い。

 

自分のキャリア観:

人生観は置いておいて、キャリア形成において、価値を築く時期と、価値を売っていく時期があると思っている。一度、自分の価値を売るフェーズに入ると、そこから価値を上げることは難しい。転職し続けてずっと、なんとかマネージャーのまま40歳過ぎちゃうパターン。サラリーマンでも20代、30代の年収500万円の差なんて生涯賃金の中では小さくて、40代超えてからの給料差は数千万円はひらく。でも、結局サラリーマンの上限なんてたかが知れていて、IPO、投資などでジャンプ過程を狙わないと富裕層にはなれない。

 

じゃーどうするのか:

準備を怠らず、チャンスを伺ってビジネスを仕留めにいきます。

 

良い人生を送るためには?