Как разместить изображение галереи на стене пользователя

Наше приложение использует PHP-, а также JS-SDK Facebook. Мы можем получить доступ к изображениям пользователей и изображениям его друзей через оба SDK. Также работает загрузка фотографий в пользовательские альбомы.

В настоящее время пользователь выбирает одно из своих изображений, которое обрабатывается на нашем сервере и загружается на Facebook в альбом, из которого оно было получено. Эта часть работает. Теперь мы хотим опубликовать это загруженное изображение на стене пользователя. Facebook сам создает сообщение в ленте пользователей о недавно загруженных изображениях (можно отключить в запросе на загрузку), но эти сообщения нельзя настроить. Стандартный запрос facebook-post требует URL-адреса необязательной фотографии. В документации указано, что нельзя ссылаться на изображения из сети доставки контента facebook (что было подтверждено API-интерфейсом графа, поскольку он выдает соответствующую ошибку).

Можно ли как-то создать стандартный пост на стене, содержащий изображение галереи? В идеале было бы использовать всплывающее окно галереи, но это явно очень приятно иметь.

Копия, размещенная на внешнем сервере, — это (нежелательный) обходной путь, о котором мы уже знаем. Повторная загрузка изображения возможна, если оно не появляется в галерее дважды.


person marsbear    schedule 30.05.2011    source источник


Ответы (3)


Простое решение:

Получите тиниурл для вашего fbcdn-изображения через тиниурл API:

Пример с URL-адресом сверху:

http://tinyurl.com/api-create.php?url=http://a4.sphotos.ak.fbcdn.net/hphotos-ak-snc3/13943_196960329960_683709960_2997879_7206516_n.jpg

Возвращает:

http://tinyurl.com/3ta96kh

Затем используйте этот URL как «картинку», я пробовал здесь, и это работает! : http://jsfiddle.net/dwarfy/VYAeD/27/

Было другое решение здесь, но, похоже, Facebook исправил это, и он по-прежнему сообщает об ошибке с Facebook CDN, когда я публикую сообщения, используя https://graph.facebook.com/PICTURE_ID в качестве изображения вместо URL-адреса изображения FBCDN.

Я думаю, это лучшее решение...

В моем примере параметр ссылки не используется, но вы можете установить его на изображение галереи...

person dwarfy    schedule 09.06.2011
comment
При этом вам не нужно иметь копию изображения на вашем сервере, и вам не нужно выполнять перенаправление самостоятельно, НО это делает общедоступную ссылку на ваше изображение ... что, возможно, не очень хорошо с точки зрения конфиденциальности. - person dwarfy; 09.06.2011
comment
Во всяком случае, есть также публичная ссылка на любое изображение в FBCDN, просто мы не можем найти эти URL-адреса, я думаю. - person dwarfy; 09.06.2011

Действительно, вы не можете размещать на стенах пользователей изображение, сохраненное на fb, НО вам также не нужно сохранять его физически на своем сервере. если вы хотите опубликовать изображение, например:

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-snc3/13943_196960329960_683709960_2997879_7206516_n.jpg

facebook, как вы знаете, не примет это. но нет проблем, чтобы опубликовать что-то вроде этого: rel="nofollow">http://yourserver.com/script.php?image=a4.sphotos.ak.fbcdn.net/hphotos-ak-snc3/13943_196960329960_683709960_2997879_7206516_n.jpg (без http:// - - это важно, если вы включите http:// facebook узнает, что происходит - а мы этого не хотим :)

script.php — это php-файл на вашем сервере, который делает следующее:

<?
    $url = "http://".$_GET['image'];
    header('Content-type: image/jpeg');
    echo file_get_contents($url);   
?>

или что-то вроде этого:

<?
    $url = "http://".$_GET['image'];
    $image = imagecreatefromjpeg($url);
    //some image modifications here//
    header('Content-type: image/jpeg');
    echo imagejpeg($image, null, 100);
?>

вы также можете добавить базу данных с URL-адресами и опубликовать что-то вроде этого: http://yourserver.com/script.php?imageid=ID скрытие реальных путей всех изображений.


Если вы хотите сэкономить на трафике после публикации изображений на стенах, просто сделайте редирект:

<?
    //if published then just redirect
    $url = "http://".$_GET['image'];
    header('Location: '.$url); die();
?>
person Erroid    schedule 08.06.2011
comment
Интересная идея, хотя мне все еще нужно «предоставить» все изображения с точки зрения трафика. Ваше первое предложение будет работать для любого URL-адреса, чтобы любой мог использовать наш сервер для прокси-запросов. Поэтому я должен как-то защитить систему, как в вашем третьем примере. Это приведет к еще большим накладным расходам, потому что нам придется использовать базу данных. Хранение изображений на нашем сервере по-прежнему является самым быстрым и простым способом, хотя это и не вариант. +1 за творчество - person marsbear; 09.06.2011
comment
после публикации (когда эскизы на фб уже созданы) можно переключиться с file_get_contents($url) на redirect: header('Location: $url'); умри(); - person Erroid; 09.06.2011

Вы должны сделать копию этого изображения, иначе вы не сможете использовать это изображение в стандартном диалоге сообщений.

Использовать PHP-функцию

copy()

Я знаю, что вы ищете любую другую альтернативу, но единственным решением является создание запасного образа на вашем или любом другом сервере.

person Inam Abbas    schedule 06.06.2011
comment
Как я уже сказал: наличие внешней копии этого изображения является нежелательным решением. Копирование изображения не является частью проблемы. - person marsbear; 07.06.2011
comment
Да, и я пишу. Вы должны сделать копию этого изображения, иначе вы не сможете использовать это изображение. - person Inam Abbas; 08.06.2011
comment
Мне не нужно копировать эти изображения. У нас уже есть изображения на нашем сервере, потому что мы их создали. - person marsbear; 09.06.2011