Javascript 为什么Graph API在第一次登录时返回问号覆盖我的相册的照片,在后续登录时返回正确的图像?
我正在使用Graph API的FB javascript驱动程序,允许用户从他们的Facebook帐户中选择照片。第一次连接时,系统会提示用户登录:Javascript 为什么Graph API在第一次登录时返回问号覆盖我的相册的照片,在后续登录时返回正确的图像?,javascript,facebook,facebook-graph-api,oauth,facebook-javascript-sdk,Javascript,Facebook,Facebook Graph Api,Oauth,Facebook Javascript Sdk,我正在使用Graph API的FB javascript驱动程序,允许用户从他们的Facebook帐户中选择照片。第一次连接时,系统会提示用户登录: FB.login(function(res) { if (res.status == 'connected') { auth = res.authResponse; // cache auth response getAlbums(); } }); 如果成功,我缓存返回的auth对象,并立即使用以下
FB.login(function(res) {
if (res.status == 'connected') {
auth = res.authResponse; // cache auth response
getAlbums();
}
});
如果成功,我缓存返回的auth对象,并立即使用以下内容获取用户的相册:
function getAlbums() {
FB.api('/me/albums', function(res) {
albums = res.data;
});
}
使用返回的对象,我在相册上迭代并显示它们的cover\u photo
:
https://graph.facebook.com/{{album.cover_photo}}/picture?type=normal&access_token={{auth.accessToken}}
用户第一次登录时,所有封面照片都是问号图标。但是,如果用户刷新或返回页面,应用程序将重新验证,识别用户已登录,并显示正确的封面照片缩略图
我如何让新认证的用户能够看到他们的封面照片?我不确定,但我认为您尚未订阅authResponseChange 下面的简单代码与您正在寻找的代码相同-
<html>
<head></head>
<body>
<div id="fb-root"></div>
<script>
var access_token = "";
window.fbAsyncInit = function()
{
FB.init({
appId : '<APP-ID>',
status : true,
cookie : true,
xfbml : true
});
FB.Event.subscribe('auth.authResponseChange', function(response)
{
access_token = response.authResponse.accessToken;
if (response.status === 'connected')
{
FetchUserPhotos();
}
else if (response.status === 'not_authorized')
{
FB.login('scope: user_photos');
}
else
{
FB.login('scope: user_photos');
}
});
};
// Load the SDK asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
function FetchUserPhotos()
{
FB.api('/me/albums', function(response)
{
var albums = response.data;
for(var i=0; i<albums.length; i++)
{
var album = albums[i];
if(album.cover_photo != undefined)
{
FB.api("/"+album.cover_photo+"?access_token="+access_token, function(cover_photo)
{
console.log(cover_photo.source);
});
//console.log("https://graph.facebook.com/"+album.cover_photo+"/picture?type=normal&access_token="+access_token);
}
}
});
}
</script>
<fb:login-button scope="user_photos" show-faces="true" width="200" max-rows="1"></fb:login-button>
</body>
</html>
var access_token=“”;
window.fbAsyninit=函数()
{
FB.init({
appId:“”,
状态:正确,
曲奇:是的,
xfbml:对
});
FB.Event.subscribe('auth.authResponseChange',函数(响应)
{
access_token=response.authResponse.accessToken;
如果(response.status===“已连接”)
{
FetchUserPhotos();
}
else if(response.status===“未授权”)
{
FB.login('范围:用户照片');
}
其他的
{
FB.login('范围:用户照片');
}
});
};
//异步加载SDK
(职能(d){
var js,id='facebook jssdk',ref=d.getElementsByTagName('script')[0];
if(d.getElementById(id)){return;}
js=d.createElement('script');js.id=id;js.async=true;
js.src=“//connect.facebook.net/en_US/all.js”;
ref.parentNode.insertBefore(js,ref);
}(文件);
函数FetchUserPhotos()
{
FB.api('/me/albums',函数(响应)
{
var albums=response.data;
对于(var i=0;当相册中没有图像时,封面图像是一个问号。我想由于某种原因,您的对象在第一次身份验证时没有正确加载。您在代码中是否正确使用回调?我用空访问令牌重现了此问题,请尝试console.log您在FB.login回调中获得的参数关于auth事件很有趣,但是,问题不是检索相册,而是在用户第一次登录应用程序时从这些相册中检索封面照片。一旦他们返回封面照片,封面照片将正常显示。好的,但封面照片也会一次性取回,对吗?我已编辑代码以获取封面照片及其工作金·古德谢,不过,我正在取回图像,但它们显示的是问号“默认”因此,一个简单的console.log可能不足以证明它工作正常。您是否尝试从console.log打开链接?当我尝试打开时,所有图像都可以正常打开。我认为更好的解决方案是直接获取图像url,因为在图像url中使用access\u标记不是一个好主意。因此,您应该使用FB.api(“/”+album.cover\u photo)
-编辑了答案。请检查