勉強会force#4 Chatter Integration

27
Chatter Integration ISV Architect 中嶋 一樹 勉強会force #4

Transcript of 勉強会force#4 Chatter Integration

Page 1: 勉強会force#4 Chatter Integration

Chatter IntegrationISV Architect 中嶋 一樹

勉強会force #4

Page 2: 勉強会force#4 Chatter Integration

Chatterによって変わること

before after

Page 3: 勉強会force#4 Chatter Integration

Summer’12がリリースされました。

Radian6の新しい資料をアップしました。Service Cloudに新機能が追加されました。

HerokuにPHPサポートが追加されました。

A社からオーダーが入っています。B社に訪問してきました。田中CIOが部長の知り合いだそうです。

今日、C社にテレアポしました。1Mを超える案件に膨らむ可能性があります。D社の案件、受注しました。600kです。追加情報。Forceの引き合いもあるそうです。

Chatter Messenger機能が有効化されていますね。php fogとの違いは何ですか?Partner Summitの締め切りが間近です。

今年のCloudforceは100万人の集約を見込んでいます。

Homepageをリニューアルしました。

Heroku

Force受注

新しい資料100万人の集客

田中CIO

Curation

Page 4: 勉強会force#4 Chatter Integration

What is Curation?

キュレーションとは、無数の情報の海の中から、自分の価値観や世界観に基づいて情報を拾い上げ、そこに新たな意味を与え、そして多くの人と共有すること。

~佐々木俊尚 氏の「キュレーションの時代」より引用~

Page 5: 勉強会force#4 Chatter Integration

demo

Page 6: 勉強会force#4 Chatter Integration

Architecture

Chatterフィードを取得

ダッシュボード生成

アクセス

キーフレーズを抽出

Page 7: 勉強会force#4 Chatter Integration

// メンバーとなっているグループ一覧を取得 public function get_my_chatter_groups(){ $url = $this->instance_url . "/services/data/" . $this->api_version . "/chatter/users/me/groups"; $this->logger->logger("URL : " . $url, __CLASS__, __FUNCTION__); $response = $this->callout_for_get($this->access_token, $url); if ($this->logger->error){ $this->logger->set_error("Failed to get my chatter groups.", __CLASS__, __FUNCTION__); return(false); } return($response['groups']); }

// News Feedからフィード情報を取得 public function get_all_feeds(){ $url = $this->instance_url . "/services/data/" . $this->api_version . "/chatter/feeds/news/me/feed-items"; $this->logger->logger("URL : " . $url, __CLASS__, __FUNCTION__); $response = $this->callout_for_get($this->access_token, $url); if ($this->logger->error){ $this->logger->set_error("Failed to get all feeds by group.", __CLASS__, __FUNCTION__); return(false); } return($response['items']); }

Source Code

Page 8: 勉強会force#4 Chatter Integration

Source Code

// Yahoo APIにフィード情報を送信し、キーフレーズを抽出 public function get_keywords($sentence, $min_score){ $api_key = urlencode($this->api_key); $sentence = $this->strip_mention($sentence); $sentence = urlencode($sentence); $url = "http://jlp.yahooapis.jp/KeyphraseService/V1/extract?output=json&appid=" . $api_key; $response = $this->callout_for_post($url, $sentence);

$offset = 0; $keywords = array(); foreach($response as $k => $v){ if ($v < $min_score){ continue; } $keywords[$offset]['value'] = $k; $keywords[$offset]['score'] = $v; $offset++; } return($keywords); }

Page 9: 勉強会force#4 Chatter Integration

海外とのコミュニケーション

before after

Page 10: 勉強会force#4 Chatter Integration

demo

Page 11: 勉強会force#4 Chatter Integration

Architecture

翻訳依頼 (非同期) 翻訳取得 (同期)

Chatterに翻訳を書き込み

Chatterに書き込み ①

②③

Page 12: 勉強会force#4 Chatter Integration

Source Code// Chatterフィードに「=>言語記号」をともなう書き込みがあれば翻訳のためのメソッド(chatter_translate.request_translate)を実行trigger feedItem_to_translate on FeedItem (after insert) { for (feedItem fi : Trigger.new) { string output_lang = ''; if (fi.body.contains('=>en')){ output_lang += 'en,'; } if (fi.body.contains('=>ja')){ output_lang += 'ja,'; } if (fi.body.contains('=>es')){ output_lang += 'es,'; } if (fi.body.contains('=>fr')){ output_lang += 'fr,'; } if (fi.body.contains('=>it')){ output_lang += 'it,'; } if (fi.body.contains('=>zh-CN')){ output_lang += 'zh-CN,'; } if (output_lang != ''){ string instanceUrl = URL.getSalesforceBaseUrl().toExternalForm(); string sid = UserInfo.getSessionId(); string fi_json = System.JSON.serialize(fi); chatter_translate.request_translate(sid, instanceUrl, 'feedItem', 'append', fi_json, output_lang); } }}

Page 13: 勉強会force#4 Chatter Integration

Source Code// 非同期で中間サーバへ翻訳リクエストを送信public with sharing class chatter_translate { @future(callout=true) public static void request_translate(string sid, string instanceUrl, string object_type, string translation_mode, string object_json, string output_lang){ Http http_protocol = new Http(); HttpRequest http_request = new HttpRequest(); // Set the endpoint URL. instanceUrl = EncodingUtil.urlEncode(instanceUrl, 'UTF-8'); sid = EncodingUtil.urlEncode(sid, 'UTF-8'); output_lang = EncodingUtil.urlEncode(output_lang, 'UTF-8'); String endpoint = 'https://chatter-translate.herokuapp.com/chatter/api.php?service=translate&sid=' + sid + '&instanceUrl=' + instanceUrl + '&object_type=' + object_type + '&translation_mode=' + translation_mode + '&output_lang=' + output_lang; http_request.setEndPoint(endpoint); // Set the HTTP verb to GET. http_request.setMethod('POST'); // Set body http_request.setBody(object_json); // set callout timeout to 60sec(max) http_request.setTimeout(60000); // Send the HTTP request and get the response. // The response is in JSON format. if (!Test.isRunningTest()){ http_protocol.send(http_request); } }}

Page 14: 勉強会force#4 Chatter Integration

Source Code

// Google Translate APIにテキストを送信して翻訳 public function translate($input_lang, $output_lang, $text){ if (is_array($text)){ $q = ''; foreach ($text as $k => $v){ $q = $q . '&q=' . urlencode($v); } } else { $q = '&q=' . urlencode($text); } if ($input_lang){ $url = "https://www.googleapis.com/language/translate/v2?format=text&key=" . $this->api_key . $q . "&source=" . $input_lang . "&target=" . $output_lang; } else { $url = "https://www.googleapis.com/language/translate/v2?format=text&key=" . $this->api_key . $q . "&target=" . $output_lang; } $response = $this->callout($url); $array_translation = array(); foreach ($response['data']['translations'] as $k => $v){ array_push($array_translation, $v['translatedText']); } return($array_translation); }

Page 15: 勉強会force#4 Chatter Integration

Chatterで訊く。世界中から答えを得る。

before

質問:XXXXXXXX

回答1

回答2

after

質問:XXXXXXXX

回答1

回答2

回答3

回答4

回答5

回答6

Page 16: 勉強会force#4 Chatter Integration

demo

Page 17: 勉強会force#4 Chatter Integration

Architecture

質問送信 (非同期)

Chatterに類似質問を書き込み

Chatterに質問 ①

② ③④

翻訳取得 (同期)

類似質問取得 (同期)

Page 18: 勉強会force#4 Chatter Integration

Source Code

// Chatterフィードに「=>stackoverflow」をともなう書き込みがあれば、類似QA取得のためのメソッド(chatter_stackoverflow.request_similarを実行)

trigger feedItem_to_stackoverflow on FeedItem (after insert) { for (feedItem fi : Trigger.new) { if (fi.body.contains('=>stackoverflow')){ string instanceUrl = URL.getSalesforceBaseUrl().toExternalForm(); string sid = UserInfo.getSessionId(); string fi_json = System.JSON.serialize(fi); chatter_stackoverflow.request_similar(sid, instanceUrl, fi_json); } }}

Page 19: 勉強会force#4 Chatter Integration

Source Code// 非同期で中間サーバへ類似QA取得リクエストを送信public with sharing class chatter_stackoverflow { @future(callout=true) public static void request_similar(string sid, string instanceUrl, string object_json){ Http http_protocol = new Http(); HttpRequest http_request = new HttpRequest(); // Set the endpoint URL. instanceUrl = EncodingUtil.urlEncode(instanceUrl, 'UTF-8'); sid = EncodingUtil.urlEncode(sid, 'UTF-8'); String endpoint = 'https://chatter-translate.herokuapp.com/chatter/api.php?service=stackoverflow&sid=' + sid + '&instanceUrl=' + instanceUrl; http_request.setEndPoint(endpoint); // Set the HTTP verb to GET. http_request.setMethod('POST'); // Set body http_request.setBody(object_json); // set callout timeout to 60sec(max) http_request.setTimeout(60000); // Send the HTTP request and get the response. // The response is in JSON format. if (!Test.isRunningTest()){ http_protocol.send(http_request); } }}

Page 20: 勉強会force#4 Chatter Integration

Source Code

// StackExchange APIに英語翻訳された質問文を送信して類似QAを取得 public function request_similar($title){ $title = urlencode($title); $filter = urlencode('!BF)_06.x0cLAwTSeXymC1qQAk-hwP.'); $url = "http://api.stackexchange.com/2.0/similar?order=desc&sort=relevance&title=" . $title . "&site=stackoverflow&filter=" . $filter; $response = $this->callout($url); return($response['items']); }

Page 21: 勉強会force#4 Chatter Integration

Chatter連携のパターン

応答型

Q

A&

Feed型 Curation型

変換型

fb

Page 22: 勉強会force#4 Chatter Integration

Object Model

FeedItem FeedComment

UserProfileFeedNewsFeed RecordFeedCollaborationGroupFeed

FeedTrackedChange FeedLike

Page 23: 勉強会force#4 Chatter Integration

Chatter REST API vs. Apex例えばCollaborationGroupFeedまたはRecordFeedに投稿する場合:

Chatter REST API:

Apex:

feedItem fi = new feedItem(body='テスト書き込み', parentId='グループIDまたはレコードID');insert fi;

POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/record/グループIDまたはレコードID/feed-items

{ "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] }}

Page 24: 勉強会force#4 Chatter Integration

Chatter REST API vs. Apex例えばUserProfileFeedに投稿する場合:

Chatter REST API:

Apex:

feedItem fi = new feedItem(body='テスト書き込み', parentId='ユーザーID');insert fi;

POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/user-profile/ユーザーID/feed-items

{ "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] }}

Page 25: 勉強会force#4 Chatter Integration

Chatter REST API vs. Apex例えばFeedCommentに投稿する場合:

Chatter REST API:

Apex:

feedComment fc = new feedComment(commentBody='テスト書き込み', parentId='親FeedのID');insert fc;

POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feed-items/親FeedのID/comments

{ "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] }}

Page 26: 勉強会force#4 Chatter Integration

Chatter REST API vs. Apex例えばNewsFeedを取得する場合:

Chatter REST API:

Apex:

List<NewsFeed> newsFeedList = [select id, parentId, body from newsfeed];

POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/news/me/feed-items

Page 27: 勉強会force#4 Chatter Integration

Follow.@nkjm

http://nkjmkzk.net