首先,嗨,并提前感谢任何能够帮助解决这个问题的人,因为我已经疯了几个星期了。
所以我有一个网站,其中列出了从我的移动应用程序中获取的gif(然后存储在AWS上,我的访问者(我还没有找到让我有用户的用户)可以共享这些GIF在facebook上使用facebook sdk。
第一次尝试共享图像时出现问题
这是我第一次点击共享按钮时共享对话框显示的内容:
http://i.stack.imgur.com/lNVNF.png
然后我关闭并重新点击相同的按钮,现在它可以工作:
http://i.stack.imgur.com/YsDUm.png
现在我一直试图找到一种方法让这项工作在第一次分享尝试时无效。
我正在使用meteor和biasport:facebook-sdk和Amazon S3来托管我的文件。
这里编辑的是使用的代码:
FRONT SIDE
HTML
<div class="facebook share">
<img src="/gallery/fb.png">
</div>
的Javascript
Template.*templateName*.events({
'click .facebook': function(e){
e.preventDefault();
e.stopPropagation();
// this is in a modal so I store the data I need
// (events have photos which in turn contain a url to the gif
var url = Session.get('event').photos[Session.get("id")].url;
FB.ui({
method: 'share',
href: url
});
}
服务器端
JAVASCRIPT
if(Meteor.isClient) {
window.fbAsyncInit = function() {
FB.init({
appId : 'APP_ID',
status : true,
xfbml : true,
version : 'v2.5'
});
};
}
编辑:我找到了一个使用exec future和curl的手动解决方案
所以首先我在更新facebook抓取工具的分享上添加了对meteor方法的调用
JAVASCRIPT
Template.*templateName*.events({
'click .facebook': function(e){
e.preventDefault();
e.stopPropagation();
// this is in a modal so I store the data I need
// (events have photos which in turn contain a url to the gif
var url = Session.get('event').photos[Session.get("id")].url;
Meteor.call('updateCrawler', url, function(){
FB.ui({
method: 'share',
href: url
});
});
}
然后我定义了我的流星方法
JAVASCRIPT
Meteor.methods({
updateCrawler: function(url){
var future = new Future();
cmd = 'curl -X POST -F "id=' + url + '" -F "scrape=true" -F "access_token={my_access_token}" "https://graph.facebook.com"';
exec(cmd, function(error){
if (error){
console.log(error);
}
future.return();
});
future.wait();
}
});
它是丑陋的,但由于我不得不等待爬虫更新并且它有效,我将把它留在这里以备将来用于某人
EDIT2:
我根本没有使用og标签,因为我只是简单地将网址分享给aws而不是我的网站的网址
答案 0 :(得分:0)
我通过直接从服务器调用Facebook API来解决这个问题,通过在页面上请求信息来刮掉og数据。第一次它没有缓存图像,但第二次这样做,这个解决方法在共享之前进行初始调用。
为您的Facebook应用使用访问令牌,并在ajax调用中调用以下内容并在打开共享对话框之前等待响应。将Google地址替换为您自己的uri编码地址https://graph.facebook.com/v2.5/?id=http%3A%2F%2Fwww.google.co.uk&access_token=xxxxx
修改强>
根据评论,这是我调用它的服务器端方法,我在插入帖子等时使用它来进行初始调用并提示从fb中删除:
var getTheOGInfo = function (link)
{
if (!link || link.slice(0, 4).toLowerCase() != "http"){
throw new Meteor.Error("og-info-bad-url", "Function requires an unencoded fully qualified url");
return false;
}
var url = "https://graph.facebook.com/v2.5/{{{{id}}}}?access_token={{{{token}}}}&fields=og_object{id,description,title,type,updated_time,url,image},id,share";
var token = Meteor.settings.private.fb.token;
if (!token){
throw new Meteor.Error("og-info-no-token", "Function requires a facebook token in Meteor.settings.private.fb.token");
return false;
}
var link_id = encodeURIComponent(link);
url = url.replace('{{{{token}}}}', token).replace('{{{{id}}}}', link_id);
var result = HTTP.get(url, {timeout:1000});
return result;
}
或者为了您的目的,您可能不需要任何可能阻塞的内容,因此您可以将最后两行更改为异步:
var result = HTTP.get(url, {timeout:1000});
return result;
//Replace with non blocking
HTTP.get(url, {timeout:1000}, function(err, result){console.log('something asynchronous', err, result);});
return true;