Загрузить изображение профиля из 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/