4

FacebookCanvasアプリを作成しました。このキャンバスアプリは基本的に画像ライブラリであり、ユーザーは[次へ]ボタンをクリックすることで画像を表示できます。これは非常に簡単です。

ユーザーが画像を「見た」ときに、GraphAPIを使用してカスタムオブジェクトに投稿しています。私はそうします(PHP SDK):

$this->data['facebook']->api('/me/myapp:look_at', 'post', array(
        'picture' => current_url()
    ));

current_url()は、Facebookキャンバスの現在のURL(https://apps.facebook.com/myapp/image/id)です。このページには、一連のogメタタグがあります。

   <meta property="og:title" content="<?=$image->title?>" />
   <meta property="og:description" content="Pic of <?=$image->title?>" />
   <meta property="og:image" content="https://www.***.com/***/images/<?=$image->src?>" />
   <meta property="fb:app_id" content="<?=FB_APP_ID?>" />
   <meta property="og:url" content="<?=current_url();?>" />
   <meta property="og:type" content="myapp:picture" />

ライブラリに画像を追加するときに、Facebookにog:tagsのページをスクレイプさせる必要があることを読みました。私は以下を使用してこれを行います:

file_get_contents('https://graph.facebook.com?id=https://apps.facebook.com/myapp/image/'.url_title($_POST['title']).'/'.$data['image_id'].'&scrape=true');

ただし、これが機能していないことは間違いありません。アプリでmail()呼び出しを行った後、そのURLにアクセスして何も待たずに、それがスクレイピングされていないことを示しています。

コードの最初のブロックを実行すると(Graph API myapp:look_atを呼び出す)、Facebookから次の例外が発生します。

Fatal error: Uncaught OAuthException: (#3502) Object at URL https://apps.facebook.com/myapp/image/img/id has og:type of 'website'. The property 'picture' requires an object of og:type 'myapp:picture'. thrown in /****/application/libraries/base_facebook.php on line 1106

Facebookのデバッガツールを使用してページをスクレイプすると、すべての情報が得られます。次に、FB Graph API呼び出しが行われるキャンバスページに再度アクセスすると、すべてが正常に実行されます。他のSOの投稿で、これは一般的な問題であると読んだことがあります。グラフAPIを呼び出す前に、Facebookにページをスクレイプするように依頼する必要があります。これは、上記のコードの3番目のブロック(file_get_contents)で実行しようとしていることです。運がなければ。

私の質問は次のようになると思います:私はこれについて正しい方法で行っていますか?このように使用された場合、プロセスに関する明確なドキュメントを見つけるのに苦労しています。

正しい方法で進めている場合、file_get_contents('https:// app ....)を呼び出したときにページがスクレイプされないのはなぜですか?

長い投稿で申し訳ありませんが、私はあなたに全体像を提供しようとしています。

ありがとう

4

2 に答える 2

1

オブジェクトを登録するために手動でスクレイプする必要はありません。Facebookのドキュメントによると:

アプリがOpenGraphのアクションを介してユーザーとオブジェクトを接続しようとすると、FacebookはオブジェクトのWebページをスクレイプし、メタタグを読み取ってユーザーをオブジェクトに関連付けます。オブジェクトのスクレイプは、次の場合に発生します。

  • ユーザーは、初めてオブジェクトに対してアクション(like、listen、read、またはオブジェクトに対するカスタムアクションなど)を実行します。
    アクションを公開する方法の詳細をご覧ください。
  • リストアイテム
  • オブジェクトデバッガを介したオブジェクトURLのリンティング
  • LinterAPIを介したオブジェクトURLのリンティング最初のスクレイプ後7日ごと

パブリッシングコードが呼び出された場合、接続されたオブジェクトは、最初に参照されたときに自動的にスクレイプされます。それ以外の場合は、すでに行ったようにデバッガーを使用しても同じ効果があります。

編集->しかし、いくつかの矛盾があり(あなたが言ったように)、開発者は彼らの「新鮮な」オブジェクトが適切に削られていないことに気づいています。Facebookはこのバグではなく、うまくいけばすぐに解決するでしょう。回避策は、デバッガーを使用してアイテムを強制的にリントすることのようです。

https://developers.beta.facebook.com/bugs/141650809281976/?browse=search_4f488911648042f90826189

ドキュメント:https ://developers.facebook.com/docs/opengraph/objects/#connect

これがお役に立てば幸いです:)頑張ってください

于 2012-04-10T12:18:44.033 に答える
0

修正しました。FBがヒットしたときにグラフAPIが投稿されないように、グラフAPIを投稿するコードのユーザーエージェントチェックが必要でした。

if(strpos($_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit') === false)
于 2012-04-10T12:27:24.030 に答える