Загрузить изображение профиля из Facebook с помощью ActionScript 3

Я пытаюсь загрузить изображения профиля (изображения друзей) из 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) );

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

Любая помощь очень ценится.

UPDATE:

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

Вы можете использовать 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);
   ...
}

Ответ 3

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

"http://graph.facebook.com/" + userid + "/picture"

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

Я использую два вызова 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.

Ответ 7

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

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: http://code.google.com/p/as3corelib/