главная страница
материалы
  ms access и bitmap
  win в ucs-2 на perl
  приложение facebook
  медиа библиотека
  восстановление exif
  netgear stora
  html и javascript
  openwrt
  конвертация
  перекодировка для tv
  перекодировка для tvix

Приложение на Facebook.com
страница приложения

Поводом для создания приложения послужило желание открыть ссылки на альбомы Facebook для неавторизованных пользователей. Все попытки это сделать средствами facebook окончились неудачай. Самая реальная из них была бы публикации ссылки на альбом на страницу, которая открыта всем пользователям. Но при публикации на страницу, ссылки для всех пользователей заменялись ссылками для авторизованных пользователей и для первых эти ссылки не показывались.

С моим приложением "Мои альбомы" ссылки на фотоальбомы удалось поставить на отдельную вкладку. Правда пришлось пожертвовать полем "место сьемки", которое я использую для ссылки для неавторизованных пользователей.

До сих пор не могу отображать обложку альбома на вкладке Facebook'а для неавторизованных пользователей. Так как facebook почему-то не пропускает свои картинки через свой же прокси-сервер, который подключается при отображении картинок на вкладке странице.

Все файлы приложения находятся в одной папке на моем сервере. Приложение написано на php. В текстах $aid - ID приложения, $scr - Secret Key. В текстах файлов сохранены основные моменты доступа к донным facebook.

index.php

Ссылка на авторизацию, которая возвращает access_token, странице которую вы укажите.
<?php
$gtt = "https://graph.facebook.com/oauth/authorize?".
       "client_id=$aid&".
       "redirect_uri=http://cherv.mystora.com/facebook/albums/get_token.php&".
       "scope=user_photos,offline_access";
header("Location: ".$gtt);
?>

get_token.php

После того, как получен токен, нужно его записать для работы самого приложения, так как к данным пользователя доступ осуществляется именно по нему. Здесь также происходят настройки: какие альбомы и где показывать и сохранение страниц пользователя. В коде содержаться только ключевые выборки из базы facebook. Используется API FQL.
<HTML>
<HEAD>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
</HEAD>

<?php
# Получили код сессии
#
$code=$_GET['code'];

# Получение access_token
#
$query = file_get_contents("https://graph.facebook.com/oauth/access_token?".
       "client_id=$aid&".
       "redirect_uri=http://cherv.mystora.com/facebook/albums/get_token.php&".
       "client_secret=$scr&".
       "code=$code");
parse_str($query);
$me = json_decode(file_get_contents('https://graph.facebook.com/me?'.
      'access_token='.$access_token),true);
if (array_key_exists('id',$me)) {

# Авторизация прошла. Запоминаем access_token
#
...

} else {
# Авторизация не прошла
}

# Поиск страниц и их запоминание
#
$sql='select page_id from page_admin where uid='.$owner;
$pages = json_decode(
     file_get_contents('https://api.facebook.com/method/fql.query?query='.
     urlencode($sql).'&format=json&access_token='.$access_token),true);
$npages='';
foreach ($pages as $page) {
  $p=$page['page_id'];
  if ($npages == '') $npages='('.$p;
  else $npages.=','.$p;
}
$npages.=')';

# Отображение страниц (для информации)
#
$sql='select name,pic_small from page '.
     'where page_id in '.$npages;
$pages = json_decode(
     file_get_contents('https://api.facebook.com/method/fql.query?query='.
     urlencode($sql).'&format=json&access_token='.$access_token),true);
print '<table border=0>';

# Отображение альбомов для выборки какие показывать, а какие нет
#
$sql='select aid,name,description '.
     'from album where owner='.$owner.' order by created desc';
$albums = json_decode(
     file_get_contents('https://api.facebook.com/method/fql.query?query='.
     urlencode($sql).'&format=json&access_token='.$access_token),true);
?>

albums.php

Само приложение. Используется API FQL и Grap API. Вызов приложения делиться на три случая:
  • Вкладка на профайле пользователя. fb=true
  • Вкладка на странице. fb=true, происходит чтение ID владельца альбомов из файла $pid.user
  • По прямой ссылке не через facebook.com. fb=false, ID владельца альбома передается через GET переменную 'owner'
    Причем первые два случая разделяются еще на два
  • Пользователь авторизован в facebook.com. fb_log=true
  • Пользователь не авторизован в facebook.com. fb_log=false
    Эти случаи разбараются в самом начале по данным POST.
    <HTML>
    <HEAD>
       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
       <LINK REL="stylesheet" TYPE="text/css" HREF="../styles/albums.css">
    </HEAD>
    
    <?php
    
    $comm = array(); # комментарии
    $src = array();  # ссылки на обложки альбомов
    
    $fb=false;$fb_log=false;$owner='';
    if (array_key_exists('fb_sig_profile_id',$HTTP_POST_VARS)) {
      $fb=true;
      if (!array_key_exists('fb_sig_logged_out_facebook',$HTTP_POST_VARS)) $fb_log=true;
      $pid=$HTTP_POST_VARS['fb_sig_profile_id'];
      if (array_key_exists('fb_sig_type',$HTTP_POST_VARS)) {
        $filename='users/'.$pid.'.user';
        if (file_exists($filename) && filesize($filename)>0) {
          $file=fopen($filename,'r');
          $owner.=fread($file,filesize($filename));
          fclose($file);
        }
      } else $owner=$pid;
    } elseif (array_key_exists('owner',$_GET)) {
      $owner = $_GET['owner'];
    }
    if ($owner == '') {
      print utf('Невозможно определить владельца альбомов');
      exit(1);
    }
    
    # Чтение access_tocken по $owner
    #
    
    # Извлечение альбомов
    #
    $sql='select object_id, cover_pid,name,created,description,location,link,size'.
         ' from album where owner='.$owner.$no_albums.
         ' order by created desc';
    $albums = json_decode(
         file_get_contents('https://api.facebook.com/method/fql.query?query='.
         urlencode($sql).'&format=json&access_token='.$access_token),true);
    
    # Если не во вкладке, то извлечение ссылок на обложку альбома
    # и сохранение в хэш от pid'а обложки
    # Для вкладок это не нужно, так как используется тэг <fb:photo>
    #
    if ($fb == 0) {
    $sql='select pid,src '.
         'from photo where pid in (select cover_pid from album '.
         'where owner='.$owner.')';
    $query = json_decode(
         file_get_contents('https://api.facebook.com/method/fql.query?query='.
         urlencode($sql).'&format=json&access_token='.$access_token),true);
    foreach ($query as $q) $src[$q['pid']]=$q['src'];
    }
    
    # Извлечение комментариев
    #
    $query = json_decode(file_get_contents('https://graph.facebook.com/'.$owner.'/'.
             'albums?fields=comments&access_token='.$access_token),true);
    foreach ($query['data'] as $q) 
    if (array_key_exists('comments',$q)) {
      $id = sprintf(round($q['id']));
      $comm[$id] = $q['comments']['data'];
    }
    ?>