Загрузить изображение профиля из Facebook с помощью Actionscript 3 - PullRequest
13 голосов
/ 19 октября 2010

Я пытаюсь загрузить изображения профиля (изображения друзей) из Facebook с помощью AS3, но у меня возникла проблема с безопасностью.

В настоящее время я использую «официальный» Adobe Facebook API для Actionscript 3, который работает нормально. Однако при запуске приложения в браузере у меня возникают проблемы с загрузкой изображений профиля. Изображения хорошо загружаются при работе в Flash IDE.

Изображения загружаются из https://graph.facebook.com, и в этом домене существует политика crossdomain.xml:

<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
  <allow-access-from domain="*" secure="false" /> 
 <site-control permitted-cross-domain-policies="master-only" /> 
</cross-domain-policy> 

В других источниках я обнаружил, что добавление ContextLoader к моему объекту Loader при загрузке изображения должно решить проблему, но, похоже, это тоже не так:

loader = new Loader();
// add some listeners here...
loader.load( new URLRequest( "imageurl" ), new LoaderContext(true) );

Я не совсем уверен, как действовать в данный момент. Я надеялся, что API Adobe Facebook поможет в этом, но я не могу найти ничего, что решило бы эту проблему.

Любая помощь с благодарностью.

UPDATE:

Я только что заметил, что при посещении одного из изображений в браузере меня фактически перенаправляют в CDN Facebook, где хранится фактическое изображение. Когда я жестко запрограммировал URL-адрес изображения с перенаправленным URL-адресом, я могу загрузить изображение в браузер. Похоже, что это не проблема безопасности, а проблема перенаправления.

Если это проблема перенаправления, тогда вопрос станет; Как Flash Player загрузить изображение с перенаправленного URL-адреса?

ОБНОВЛЕНИЕ 2:

Похоже, что класс URLRequest имеет свойство followRedirects, которое доступно только в AIR.

ОБНОВЛЕНИЕ 3:

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

Ответы [ 7 ]

11 голосов
/ 30 ноября 2010

У меня была та же проблема, и похоже, что вам нужно вручную загрузить файл междомена домена, на который вы перенаправлены в actionscript. На данный момент, похоже, что все изображения профиля в Facebook окончательно загружены с домена http://profile.ak.fbcdn.net/.

Я только что добавил эту строку перед загрузкой изображений:

Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml");

Это должно позволить загружать перенаправленные изображения, если домен перенаправления не изменяется. ;)

2 голосов
/ 12 июня 2011

Вы можете использовать URLLoader и загрузить изображение как ByteArray.Это, кажется, работает независимо от перенаправления.Затем вы можете использовать ByteArray в качестве источника для Image / BitmapImage или использовать Loader для загрузки байтов, как если бы у вас был URL изображения на первом месте.

Например:

var urlRequest:URLRequest = new URLRequest("http://graph.facebook.com/id/picture");
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
urlLoader.load(urlRequest);                

function completeHandler(event:Event):void
{
   var byteArray:ByteArray = loader.data;

   // Then either:
   bitmapImage.source = byteArray;

   // or:
   var loader:Loader = new Loader();
   ...
   loader.loadBytes(byteArray);
   ...
}
1 голос
/ 18 января 2011

Я хотел бы подтвердить решение Мартина здесь.

Мой пример исходит из тестирования приложения на платформе AIR, которое работает нормально, изображение загружено успешно.

Но когда я портирую его в приложение canvas на facebook, я сталкиваюсь с проблемой, изображения профиля не появляются, они не могут загружаться.

Я использую то, что предлагает Мартин здесь. И если вы отследите перенаправление URL-адресов, вы увидите, что профили изображений на самом деле расположены на этом сервере CDN, а не на самом Facebook, поэтому вам нужно загрузить файл политики этого домена в соответствии с sandbox-файлом Actionscript.

Еще раз спасибо.

1 голос
/ 19 октября 2010

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

"http://graph.facebook.com/" + идентификатор пользователя +" / picture "

0 голосов
/ 31 января 2013

Поскольку во многих доменах Facebook хранятся фотографии, я написал небольшой скрипт, который использует домен изображения для загрузки соответствующего файла политики:

import com.adobe.net.URI;
import flash.system.Security;

var someFacebookImageUrl:String = "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash3/c66.66.828.828/s160x160/537210_440478782684964_233907781_n.jpg";
var uri:URI = new URI(someFacebookImageUrl);
Security.loadPolicyFile(uri.scheme + "://" + uri.authority + "/crossdomain.xml");

Приятно, что он работает нетолько для изображений профиля, но для всех изображений, которые использует Facebook.

Надеюсь, это поможет некоторым из вас!

PS: Класс URI является частью ядра as3 lib: http://code.google.com/p/as3corelib/

0 голосов
/ 31 августа 2011

Я использую два вызова loadPolicyFile, так как кажется, что есть 2 возможных CDN, которые использует Facebook. Это работает для меня, но, конечно, универсальное решение предпочтительнее, Facebook может снова добавить еще один CDN, и все просто перестанет работать самостоятельно -

Security.loadPolicyFile('http://profile.ak.fbcdn.net/crossdomain.xml');
Security.loadPolicyFile('http://profile.cc.fbcdn.net/crossdomain.xml');

Решение URLLoader, предложенное @Stiggler, может работать. Я не пробовал Но он кажется тяжелее по сравнению с использованием объекта Loader.

0 голосов
/ 02 апреля 2011

полностью догадываюсь, но вы можете использовать URLLoader для получения данных от перенаправленного вызова, а затем проанализировать их вместе в изображение xD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...