リアルタむム曎新でFacebook Graph APIク゚リを最適化する

Facebookアプリケヌションにはさたざたな機胜がありたす。たずえば、倚くの堎合、ナヌザヌがアプリケヌションを䜿甚しおいる間、アプリケヌションはAPIを介しお十分な情報を受け取りたす。 しかし、1か月以䞊開いおいなくおも、アプリケヌションが最新のナヌザヌデヌタで動䜜する堎合はどうでしょうか。



ナヌザヌがアプリケヌションで䜜業しおいる間だけでなく、デヌタを受信する方法は2぀ありたす。

  1. ナヌザヌからoffline_access蚱可を取埗し「氞遠の」ナヌザヌaccess_tokenを保存し、「スケゞュヌルに埓っお」必芁なデヌタを取埗したすcronスクリプトをプルしたす。
  2. Facebookからすべおのデヌタ倉曎を受信し、リアルタむム曎新を介しお曎新を構成およびサブスクラむブするスクリプトを蚘述したす。


猫の䞋で、リアルタむム曎新を䜿甚するこずで、状況によっおは1日あたりのAPIリク゚ストの数を100倍以䞊枛らす方法の仮想的な䟋を孊ぶこずができたす。 曎新にサブスクラむブするためのスクリプトを䜜成し、その動䜜を確認しお、Facebook自䜓からオブゞェクトの倉曎に関するデヌタを受け取りたす。



蚘事の冒頭には倚くの理論が含たれおおり、Facebookのドキュメントペヌゞのロシア語の翻蚳に䌌おいたす 。 英語で読みやすい堎合は、2番目の方法のすべおをスキップしお、「 リアルタむム曎新の䟋」セクションに進んでください 。 しかし、䜕らかの理由で、最初の読曞の埌、この機胜を構成できたせんでした。 この蚘事があなたがより早く理解するのに圹立぀こずを願っおいたす。



最初の方法



䞀郚のアプリケヌションの機胜は、スケゞュヌルに埓っおデヌタを受信する必芁性に関連しおいる堎合がありたす。 たずえば、特定のディレクトリからペヌゞのいいねを収集したす。 これを行うには、1時間に1回間隔でデヌタを取埗したす。 これは良い䜿甚䟋です。そうしないず、このデヌタを取埗できなくなりたす。 しかし、倚くの堎合、この方法は、「スケゞュヌルどおり」ではなく、Facebook自䜓からリアルタむムで曎新を受信できるオブゞェクトにも䜿甚されたす。



最初の方法の重倧な欠点のうち、次のものを区別できたす。



機胜がナヌザヌの友人に関連付けられおいるアプリケヌションを䜜成したず想像しおください。最新の情報を入手するこずは非垞に重芁です。 アプリケヌションが1000人のナヌザヌによっおむンストヌルされたずしたす。 そしお、友人デヌタの蚱容されるキャッシュ時間を1時間ずしたす。 その結果、ナヌザヌフレンドのデヌタベヌスが最新になるように、毎日24,000のリク゚ストを送信したす たた、ナヌザヌは1000人のみであり、1日にすべおの人が友人に倉曎を加えるのは数癟に過ぎないず想定できたすこれは個人的な経隓に基づく掚枬です。



最初の方法の欠点を解決するために、FacebookはGraph APIのリアル​​タむム曎新を行いたした。



第二の方法



リアルタむム曎新のサポヌトにより、アプリケヌションでFacebookデヌタの倉曎をサブスクラむブできたす。 アプリケヌションは、Facebookサヌバヌから「スケゞュヌルどおりに」ポヌリングする代わりに、Facebookから曎新を受信しお​​デヌタを保存したす。 デヌタをキャッシュしおこのAPIを䜿甚するず、アプリケヌションの信頌性が向䞊し、ロヌド時間が短瞮されたす。 賌読しおいる倉曎が発生するたびに、Facebookは倉曎のリストを䜿甚しおデヌタ曎新凊理スクリプトにHTTP POST芁求を行いたす。 サヌバヌは、倉曎が衚瀺されおから数分以内に倉曎の通知を送信したす。



オブゞェクト


珟時点では、次のタむプのオブゞェクトをサブスクラむブできたす。



*サブスクラむブできるUserオブゞェクトのすべおのプロパティず関係。 たずえば、フィヌド、友人、アクティビティ、興味、音楜、本、映画、テレビ、いいね、チェックむンなどのリンクが利甚できたす。 ただし、同時に、ホヌム、タグ付き、投皿、写真、アルバム、ビデオ、グルヌプ、メモ、むベント、受信トレむ、送信トレむ、曎新、アカりントなどのリンクの倉曎を賌読するこずはできたせん



サブスクリプション


アップデヌトのサブスクリプションを蚭定するには、次のものが必芁です。

  1. FacebookからHTTP GETサブスクリプションを確認する芁求ずPOSTデヌタの倉曎に関する芁求の䞡方を受信するスクリプトURLを蚭定したす。
  2. Graph APIにPOSTリク゚ストを行う
      https://graph.facebook.com/<app-id>/subscriptions 
    サブスクラむブし、怜蚌リク゚ストを凊理する準備をしたす。


リク゚ストを送信するこずにより
  https://graph.facebook.com/ <app-id> / subscriptionsaccess_token = ... 
送信するHTTP POST、GET、たたはDELETEリク゚ストに応じお、次の3぀のこずを実行できたす。

  1. サブスクリプションの远加ず倉曎POST。
  2. サブスクラむブしたすべおのオブゞェクトずそのフィヌルドのリストを取埗したすGET
  3. サブスクリプションの削陀DELETE


リク゚ストにはaccess_tokenアプリケヌションが含たれおいる必芁がありたす。これは、アプリケヌションIDapp-idずアプリケヌションシヌクレットキヌapp-secretを䜿甚しお取埗できたす。 HTTP GETを送信するだけです
  https://graph.facebook.com/oauth/access_token?client_id=<app-id>&client_secret=<app-secret>&grant_type=client_credentials 
そしお答えが来るでしょうaccess_token = ...



サブスクリプションの远加ず倉曎


したがっお、サブスクリプションを远加するリク゚ストを送信する必芁がある堎所を䞊蚘で読みたした。 急いでこれらの芁求を満たす必芁はありたせん。資料のプレれンテヌションの構造は、必芁な手順の順序ずは異なりたす。 これは、材料を連続的に研究するために特に行われたす。 ただし、この䟋では、䟋の前の最埌の郚分で説明されおいるク゚リを最初に実行したす。




アプリケヌションは、可胜なオブゞェクトのタむプごずに1぀のサブスクリプションのみを持぀こずができたす。 すでにサブスクリプションがあるオブゞェクトを远加するず、既存のサブスクリプションは新しいサブスクリプションに眮き換えられたす。 サブスクリプションを远加たたは倉曎するには、フィヌルドを含むPOSTリク゚ストを送信する必芁がありたす。



登録したすべおのオブゞェクトずそのフィヌルドのリストを取埗する

サブスクリプションURLに察しおGETリク゚ストを行うこずにより
  https://graph.facebook.com/ <app-id> / subscriptionsaccess_token = ... 
サブスクリプションをリストするJSON゚ンコヌドされたコンテンツを含む応答を受け取りたす。 ナヌザヌオブゞェクトのフレンド接続ず、暩限のoffline_accessにサブスクラむブしたした。 答えは次のずおりです。

 {
   「デヌタ」[
      {
         「オブゞェクト」「ナヌザヌ」、
         "callback_url" "http://millione.tv/ <スクリプトぞのパス>"、
         「フィヌルド」[
            「友達」
         ]、
         「アクティブ」true
      }、
      {
         「オブゞェクト」「蚱可」、
         "callback_url" "http://millione.tv/ <スクリプトぞのパス>"、
         「フィヌルド」[
            「offline_access」
         ]、
         「アクティブ」true
      }
   ]
 }


サブスクリプションを削陀


すべおのオブゞェクトに察するサブスクリプション党䜓を削陀するには、DELETEリク゚ストを送信したす。 特定のオブゞェクトのサブスクリプションを解陀する堎合は、オブゞェクトパラメヌタヌを指定したすたずえば、object = user。



コヌルバックサヌバヌ



Facebookサヌバヌは、サブスクリプションを远加たたは倉曎しようずするず、callback_urlにHTTP GETリク゚ストを送信したす。 サブスクリプションが成功するず、FacebookサヌバヌはHTTP POSTを䜿甚しお同じURLに倉曎通知を送信したす。



サブスクリプション怜蚌


サブスクリプションが最終的に远加たたは倉曎される前に、Facebookサヌバヌは次のパラメヌタヌを䜿甚しお、callback_urlでHTTP GETを䜜成したす。



デヌタ曎新を凊理するためのスクリプトは、最初にhub.verify_tokenの倀Facebookに送信した「シヌクレットコヌド」を確認しおから、hub.challengeパラメヌタヌを返したす。 これは、サヌバヌでDDoS攻撃を実行する手段ずしおスクリプトを保護するために特に行われたす。

開発者向けの泚意PHPでは、パラメヌタヌのピリオドは自動的にアンダヌスコアに倉換されたす。 したがっお、 $_GET["hub_mode"]



、 $_GET["hub_challenge"]



および$_GET["hub_verify_token"]



を参照する必芁がありたす。



倉曎通知


デヌタが倉曎され、有効なサブスクリプションがある堎合、Facebookサヌバヌは、指定したcallback_urlに察しおHTTP POSTリク゚ストを䜜成したす。 芁求コンテンツタむプはapplication / jsonになりたす。 body-1぀以䞊の倉曎に関する情報を含むJSON゚ンコヌドされた文字列。 以䞋に、アプリケヌションコヌドの䟋を瀺したす。



行には珟圚の倀に関するデヌタが含たれないこずに泚意しおください。 したがっお、それらを受信するには、APIに定期的にリク゚ストする必芁がありたすセキュリティポリシヌにより。 必芁なデヌタをすぐにダりンロヌドしお、ナヌザヌがアプリケヌションに戻ったずきに、ダりンロヌド時間の増加による問題が発生しないようにするこずができたす。



Facebookは倉曎を集玄し、5秒ごずに、たたは倉曎数が1000を超えた堎合にバッチで送信したす。倉曎通知があなたに配信されない堎合、Facebookは再詊行し、それから少し埌で、次の24時間でリク゚ストの頻床を枛らしたす。



リアルタむム曎新䜜業の䟋



理論を実践したす。 これを行うには、ドメむンの指定されたアドレスcallback_urlに配眮されるPHPスクリプトであるホスティングが必芁になりたす。 Facebookアプリも必芁です。 開発者のアプリケヌションペヌゞで既存のものを䜿甚するか、新しいものを䜜成できたす 。



1.アプリケヌション






2.デヌタ曎新を凊理するためのスクリプト


callback_urlのスクリプトを保存したす

< php



/ *リク゚ストは15秒以内に完了する必芁がありたす。

そうしないず、Facebookサヌバヌはタむムアりトず芋なし、

プッシュ通知を再送信しおください。 * /



define  'VERIFY_TOKEN' 、 '<secret_code>'  ;

$ method = $ _SERVER [ 'REQUEST_METHOD' ] ;



if  $ method == 'GET' && $ _GET [ 'hub_mode' ] == 'subscribe'

&& $ _GET [ 'hub_verify_token' ] == VERIFY_TOKEN  {

echo $ _GET [ 'hub_challenge' ] ;

} その他

if  $ method == 'POST'  {

$ data = file_get_contents  "php// input"  ;

$ fh = fopen  'data.txt' 、 'a' たたはdie  'open file'  ;

if  -1 == fwrite  $ fh 、 $ data   { die  'write data'  ; }

fclose  $ fh たたはdie  'close file'  ;

}



>




3.サブスクリプションを远加する


その埌、Facebook開発者向けの新しいツヌルであるGraph API Explorerを䜿甚したす 。





POSTリク゚ストを遞択しおサブスクリプションを远加し、すべおのフィヌルドに入力したす。 access_tokenアプリケヌションを取埗するには、ブラりザでリンクを開き、app-idずapp-secretにアプリケヌションのデヌタを入力したす。
  https://graph.facebook.com/oauth/access_token?client_id=<app-id>&client_secret=<app-secret>&grant_type=client_credentials 


スクリプトぞのパスは、たずえばfacebook / callback.phpです。 アプリケヌション蚭定からアプリシヌクレットを取埗し、verify_tokenに自分でシヌクレットコヌドを䜜成するこずが重芁です。



そのため、䞋の灰色のボックスで[送信]をクリックしおも䜕も起こらなかった堎合、ナヌザヌオブゞェクトのフレンド接続にサブスクリプションを远加したこずを意味し、アプリケヌションのナヌザヌがフレンドの1぀を远加たたは削陀するずすぐに、Facebookはcallback_urlに通知を送信したす。 この䟋では、offline_access暩限オブゞェクトにもサブスクリプションを远加したした。



4.ナヌザヌアクティビティを䜜成する


アプリケヌションをむンストヌルした堎合-倧したこずはありたせん。 そうでない堎合も。 アクションのシヌケンスは同じです。



たず、offline_accessパヌミッションを远加する必芁がありたす。 アプリケヌションがむンストヌルされおいない堎合、これは自動的に行われたす。 アプリケヌションをむンストヌルしおいたせん。 ブラりザの行から認蚌りィンドりを呌び出しおみたす。 app-idをアプリケヌションIDに眮き換え、site-urlをhttp// <ドメむン>に眮き換えおリンクを開きたす

  https://www.facebook.com/dialog/oauth?client_id=<app-id>&redirect_uri=<site-url>&scope=offline_access 






認蚌に成功するず、Facebookはhttp// <your domain> /Code = ...にリダむレクトしたす



スクリプトに含たれるロゞックによるず、着信通知を凊理するずき、送信されたJSON゚ンコヌドされた行を、スクリプトず同じディレクトリにあるテキストファむルdata.txtに远加するだけです。 このファむルが䜜成されたかどうか、および含たれおいる情報を確認しおください。



远加した情報は次のようになりたす。

{"object":"permissions","entry":[{"uid":"100001828786121","id":"100001828786121","time":1310669052,"changed_fields":["connected"]},{"uid":"100001828786121","id":"100001828786121","time":1310669052,"changed_fields":["offline_access"]}]}







ご芧のずおり、アプリケヌションをむンストヌルし、offline_access蚱可を蚱可したした。 uidによっお、デヌタが倉曎されたナヌザヌず、時間远加の時間を刀別できたす。



5.アクションを削陀する


Facebook のアプリケヌション蚭定に移動しお、アプリケヌションを開き、offline_access暩限を削陀できたす。 data.txtファむルで、再び通知が送信されおいるこずがわかりたす。 友達の1人を远加たたは削陀するこずもできたす。登録したこれらの通知はcallback_urlに送られ、スクリプトによっお凊理されるこずがわかりたす。



結論


これで、Facebook Real-Time Updatesのすばらしい機胜に぀いお知ったので、ナヌザヌデヌタず暩限の倉曎に関する情報を送信できたす。 残念ながら、䜕らかの理由で、ナヌザヌがアプリケヌションを削陀しおも、デヌタは倉曎されたせんでした。 したがっお、新しいメ゜ッドが時間ずリ゜ヌスを節玄しないように-結局、特定のタスクたずえば、アプリケヌションのすべおのナヌザヌにメヌルを送信するを実装するずきに、通垞のAPIを䜿甚しおデヌタベヌス内のすべおのナヌザヌを事前に調べお、アプリケヌションがむンストヌルされおいるかどうかを確認するこずはただ䟡倀がありたす。



All Articles