勉強会force#4 Chatter Integration
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,243
On Slideshare
1,243
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
15
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 勉強会force #4Chatter Integration ISV Architect 中嶋 一樹
  • 2. Chatterによって変わることbefore after
  • 3. A社からオーダーが入っています。B社に訪問してきました。田中CIOが部長の知り合いだそうです。 田中CIO 今日、C社にテレアポしました。1Mを超える案件に膨らむ可能性があります。 Force 追加情報。Forceの引き合いもあるそうです。 D社の案件、受注しました。600kです。 受注 Summer’12がリリースされました。 Partner Summitの締め切りが間近です。 HerokuにPHPサポートが追加されました。 Heroku php fogとの違いは何ですか? 100万人の集客 今年のCloudforceは100万人の集約を見込んでいます。 Service Cloudに新機能が追加されました。 Chatter Messenger機能が有効化されていますね。 Radian6の新しい資料をアップしました。 新しい資料 Homepageをリニューアルしました。 Curation
  • 4. What is Curation?キュレーションとは、無数の情報の海の中から、自分の価値観や世界観に基づいて情報を拾い上げ、そこに新たな意味を与え、そして多くの人と共有すること。 ∼佐々木俊尚 氏の「キュレーションの時代」より引用∼
  • 5. demo
  • 6. Architecture キーフレーズを抽出 ③ ② ④Chatterフィードを取得 ダッシュボード生成 アクセス ①
  • 7. Source Code// メンバーとなっているグループ一覧を取得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]);}
  • 8. 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);}
  • 9. 海外とのコミュニケーションbefore after
  • 10. demo
  • 11. Architecture 翻訳依頼 (非同期) 翻訳取得 (同期) ③ ② ④ Chatterに翻訳を書き込みChatterに書き込み ①
  • 12. 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); } }}
  • 13. Source Code// 非同期で中間サーバへ翻訳リクエストを送信public with sharing class chatter_translate { @future(callout=true) public static void request_translate(string sid, string instanceUrl, string object_type, stringtranslation_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); } }}
  • 14. 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); }
  • 15. Chatterで く。世界中から答えを得る。 質問:XXXXXXXX 回答1 質問:XXXXXXXX 回答2 回答1 回答2 回答3 回答4 回答5 回答6 before after
  • 16. demo
  • 17. Architecture 翻訳取得 (同期) 質問送信 (非同期) ③ ② ④ ⑤ Chatterに類似質問を 書き込み 類似質問取得 (同期)Chatterに質問 ①
  • 18. 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); } }}
  • 19. 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); } }}
  • 20. 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]); }
  • 21. Chatter連携のパターン Feed型 Curation型 fb Q & A 応答型 変換型
  • 22. Object Model FeedItem FeedComment FeedTrackedChange FeedLikeNewsFeed UserProfileFeed CollaborationGroupFeed RecordFeed
  • 23. Chatter REST API vs. Apex例えばCollaborationGroupFeedまたはRecordFeedに投稿する場合: Chatter REST API: POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/record/グルー プIDまたはレコードID/feed-items { "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] } } Apex: feedItem fi = new feedItem(body=テスト書き込み, parentId=グループIDまたはレコードID); insert fi;
  • 24. Chatter REST API vs. Apex例えばUserProfileFeedに投稿する場合: Chatter REST API: POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/user- profile/ユーザーID/feed-items { "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] } } Apex: feedItem fi = new feedItem(body=テスト書き込み, parentId=ユーザーID); insert fi;
  • 25. Chatter REST API vs. Apex例えばFeedCommentに投稿する場合: Chatter REST API: POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feed-items/親Feed のID/comments { "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] } } Apex: feedComment fc = new feedComment(commentBody=テスト書き込み, parentId=親FeedのID); insert fc;
  • 26. Chatter REST API vs. Apex例えばNewsFeedを取得する場合: Chatter REST API: POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/news/me/feed-items Apex: List<NewsFeed> newsFeedList = [select id, parentId, body from newsfeed];
  • 27. Follow. @nkjmhttp://nkjmkzk.net