0

我想将事件从 facebook 页面提取到官方网站,并与图形和 oauth 斗争以获取信息。

简化代码,相同代码中的第 1 阶段和第 2 阶段:

<?php
$app_id = '...........4639';
$app_secret = '7547xxxxxxxxxxxxxxxxxxxxxxxx';

if (isset($_GET['code'])) {
  //stage 2
  $state = $_GET['state'];
  $code = $_GET['code'];
  //the code doesn't work. If I use graph api explorer to get key, I'm all fine.
  //the code here from graph api explorer.
  //$code = 'AAAIERWeZCHZxxxxxxxxxxxxxxxxxxxxx';
  $s = "https://graph.facebook.com/_PAGE_ID?fields=feed.fields(story,message,picture)&access_token=" . $code;
  $json = file_get_contents($s);
  die($json);

} else {
  //stage 1
  $my_url = 'http://www.myself.com/fb/index.php';
  $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection
  $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" .
    $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state'];
  //now redirect to myself - phase2
  header("Location: " . $dialog_url);
  exit();
}
4

1 回答 1

0

如果有人坐在同样的烦恼中:

file_get_contents 似乎无法处理令牌请求。以下代码有效。

<?php
  function curlRequest($url) {
    $ch = curl_init();
    $useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1";
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $timeout = 5;
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
  }


$app_id = '................';
$app_secret = '..................................';
$my_url = 'http://www.memyself.andi/me.php';

session_start();

$code = $_REQUEST["code"];
if(empty($code)) {
   // Redirect to Login Dialog
   $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection
   $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . urlencode($_SESSION['state']) . "&scope=user_birthday,read_stream";
   header("Location: " . $dialog_url);

}

  if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) {
     $token_url = 'https://graph.facebook.com/oauth/access_token?client_id=' . 
       $app_id . '&redirect_uri=' . urlencode($my_url) .
       '&client_secret=' . $app_secret . '&code=' . urlencode($code);
     //die($token_url);
     $response = curlRequest($token_url);
     //bummer - this won't work (php 5.3/ubuntu)
     //$response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);

     $_SESSION['access_token'] = $params['access_token'];

     $graph_url = "https://graph.facebook.com/_THE_PAGE_ID/feed?access_token=" 
       . $params['access_token'];

     $json = json_decode(file_get_contents($graph_url));
     echo serialize($json);
   }
   else {
     echo("The state does not match. You may be a victim of CSRF.");
   }
于 2013-03-15T08:27:40.387 回答