Приложение на 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'];
}
?>
|
|