Facebook共享的意外行为

时间:2016-03-05 21:34:21

标签: facebook amazon-web-services meteor amazon-s3 facebook-javascript-sdk

首先,嗨,并提前感谢任何能够帮助解决这个问题的人,因为我已经疯了几个星期了。

所以我有一个网站,其中列出了从我的移动应用程序中获取的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而不是我的网站的网址

1 个答案:

答案 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;