Facebook API:誰もがウォール投稿にコメントできるようにする方法[更新:2011年9月25日]

Facebook APIを習得し続けています[2011年9月25日更新]



今回はコメントに出会いました。



必須:ユーザーのウォールにメッセージを送信し、続いてコメントします。



目的:友人だけでなく、すべてのFacebookユーザーに投稿にコメントする機会を提供する。



すぐに失望します。 今日(2011年9月21日)には、Graph APIを介して全員に直接コメントするためのアクセスを提供する人間的な方法はありません。



つまり コメントする方法はありますが、デフォルトでは、コメントはこの投稿を持っているユーザーの友人に対してのみ許可されています。 「見知らぬ人」がメッセージにコメントを残そうとすると、次の内容のエラーメッセージが表示されます。



(#100) Error finding the requested story //











ところで、アプリケーションウォールの投稿にコメントするためには、まず「いいね」をクリックして承認し、グループウォールの投稿にコメントするか、グループに参加する必要があります。



一方、プラグインをコメントサイトにインストールし、それを使用してユーザーのウォールにメッセージを送信すると、このサイトへの訪問者はコメントすることができます(Facebookに以前にログインしたことがある場合)。



素晴らしい、それは方法があることを意味し、すべてがどのように機能するかを知ることだけが残っています。



待ち伏せのみ:プラグインのドキュメントでは、フリルのみ-外観をカスタマイズするためのヒント(わずかなものに注意する必要があります)およびその他の不要ながらくた。 プラグインからのデータがどのように、どこに送信されるかについてのヒントはありません。 ただし、APIを使用してウォールレコードを取得する場合:



 { "data": [ { "id": "100001957292289_178950362180206", "from": { "name": "\u0410\u043d\u0442\u043e\u043d \u0413\u043e\u0440\u043e\u0434\u0435\u0446\u043a\u0438\u0439", "id": "100001957292289" }, "message": "Cats!", "actions": [ { "name": "Comment", "link": "http://www.facebook.com/100001957292289/posts/178950362180206" }, { "name": "Like", "link": "http://www.facebook.com/100001957292289/posts/178950362180206" } ], "privacy": { "description": "Friends of Friends", "value": "FRIENDS_OF_FRIENDS", "allow": "0", "deny": "0" }, "type": "status", "application": { "name": "pilot", "id": "174611799256077" }, "created_time": "2011-09-21T18:24:50+0000", "updated_time": "2011-09-21T18:24:50+0000", "comments": { "count": 0 } },
      
      







そこに新たに記録された記録の痕跡がないこと。 そして当然です。 長い研究によると、壁の投稿はタイプ:ステータスであり、コメントプラグインから送信された壁の投稿はタイプ:link_statです。



stackoverflow.comで思慮深く70-80を読んで、最も自然な意味で、脳のスタックのオーバーフローを取得し、精神的剥奪を見越して、私はそのようなデザインに出くわします:



graph.facebook.com/comments/?ids=http://example.org/post/35/







その頃には、十分な実験があったので、キャッシュデスクを離れることなく、Facebookエクスプローラでこのデザインを試していました。



そして、見よ-この投稿に関する情報が欲しがっているJSONを取得します。



ところで、同じアドレス(https://graph.facebook.com/DIGITS_MOREDIGITS/comments)で投稿リクエストを行うと、新しい投稿が送信されます:

graph.facebook.com/comments/?ids=http://nadvoe.org.ua/stud.my/post/35/







だから、私はGETを送信しています、返されたjson-objectから投稿IDを取得し、このIDに関するコメントを送信しようとしています:



graph.facebook.com/DIGITS_MOREDIGITS/comments







Facebookからの応答:

(#100) Invalid fbid. //







同じように、複雑な精神的詐欺でも、idの最終行からすべてを削除すると、コメントが自由に送信されることがわかります。



graph.facebook.com/DIGITS _MOREDIGITS /comments







コメントはすべてのユーザーからこのアドレスに正常に送信されます。





[2011年9月25日更新]



識別子DIGITS_MOREDIGITSでは、DIGITSはタイプtype:websiteのオブジェクトの識別子であり、これらの文字が一緒になってコメントテーブルのidフィールドの値を構成します。



以下は、このテーマに関する新しい結論です。





つまり 原則として、DIGITS_MOREDIGITSは正しいメッセージ識別子ですが、このアドレスでコメントを取得しようとすると:

graph.facebook.com/DIGITS_MOREDIGITS/comments





facebookはjson形式でvoidを返します。



条件にid = DIGITS_MOREDIGITSを設定して、コメントテーブルでFQLクエリを作成するのは論理的です。 しかし、コメントテーブルのidフィールドは(それがどんなに奇妙で神秘的であっても!)インデックス化されていません。facebookが親切に思い出させてくれるからです:

ステートメントは索引付けできません。 WHERE句には、インデックス可能な列が含まれている必要があります。 このような列は、テーブル内で*でマークされています




offtop:公式にはインデックス化できるはずのコラムはそうではなかったという事実のために、Facebook開発者に憎悪光線を送ります。



ちなみに、特定の投稿のコメントをフィッシングアウトできる識別子はpost_fbid列にあります(ちなみに、インデックス化できません)。



したがって、サブタスクはこれらの識別子間の対応を識別することになります。 確かに、コメントプラグインが添付されたURLのみを持つことができます。 この場合、link_statテーブル(上記のように-これはコメントプラグインから壁に送信された投稿のタイプです)から、URLでオブジェクト識別子(object_id)を抽出する必要があります。 そして、この識別子ですべてのfbid_postとidを選択します。 一般に、クエリ(FQL)を表示する方が適切です。

 SELECT post_fbid, id FROM comment WHERE object_id IN (SELECT comments_fbid FROM link_stat WHERE url ='".base_url()."')
      
      







したがって、facebookクラスの拡張機能を拡張して、id_which_is return_after_creation_of_post_through_plugin_commentsでid_to_which_can_receive_or_send_commentを取得する機能を追加しました。



 /* **   id ,       facebook **     id,   facebook    POST-query   /comments/?ids={$url} */ public function getRealPostId($given_post_id) { $fql =" SELECT post_fbid, id FROM comment WHERE object_id IN (SELECT comments_fbid FROM link_stat WHERE url ='".base_url()."') "; $params = array( 'query' => $fql, 'method' => 'fql.query', 'callback' => '' ); $result = $this->api($params); foreach($result as $row) { if ($row['id']==$given_post_id) return $row['post_fbid']; } return false; }
      
      







[/更新]



原則として、これはすべて素晴らしく機能しますが、すぐに自分のサイトに実装しようとすると、エラーの形で別の不快な驚きがあります:

"Unknown identifier, "







Facebookは、そのような識別子が彼に知られていないことを訴えています。 stackoverflowのパーソナライズされたfacebookセクションを検索すると、すべてのアドレスを使用する前に初期化する必要があると思います。



これは2つの方法で実行できます(基本的に1つですが)。



  1. Webサイトでコメントプラグインを実行する
  2. コメントプラグインのiframeのソースを表示し、このソースをユーザーに「透過的に」プルし、サイト上のすべての新しいURLに対して1回プルします。




2番目の方法では、ケースを決定しました(高度なfacebook php sdkクラスが使用され、関数はcodeigniterで記述されています)。



 public function add() { //   URL   key- $new_id = $this->base->add( array( 'key_post' => 'NULL' ) ); $url = base_url().'post/'.$new_id.'/'; //   ,       $context = stream_context_create(array( 'http' => array( 'method' => 'GET', 'header' => 'User-Agent: Mozilla/5.0 (X11; Linux i686; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 FirePHP/0.6'. 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'. 'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'. 'Accept-Encoding: gzip, deflate'. 'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'. 'Connection: keep-alive'. 'Referer: http://www.nadvoe.org.ua/stud.my/'. 'Cookie: '.implode(';',$_COOKIE), ), )); $w = file_get_contents('https://www.facebook.com/plugins/comments.php?href='.urlencode($url),false,$context); //  ,         id $result = $this->facebook->postMessageByUrl($url,$this->fields['message_post']); //      $last_post = $this->facebook->getPost($result['id']); $this->fields['id_post'] = $last_post['id']; $this->fields['created_time_post'] = strtotime($last_post['created_time']); $this->fields['id_user_post'] = $this->session->myId(); //     if ($this->base->edit($this->fields,$new_id,'key')) { $this->NOTIFY->success(' '); $this->NOTIFY->returnNotify(); } else { $this->NOTIFY->returnError(' '); } }
      
      









だから、ここであなたはそれを手に入れることができるので、誰でもアプリケーションを通して残されたFacebookの壁にあなたの投稿にコメントすることができます。



All Articles