API共享计数已弃用Facebook Graph?

时间:2019-04-19 11:24:21

标签: facebook facebook-graph-api

从今天起,当我尝试获取共享计数时,答案是: v2.9及更高版本不建议使用共享字段。

例如:https://graph.facebook.com/?id=https://stackoverflow.com&fields=share

没有&fields = share 时,将显示json内容,但没有共享值。

我需要从URL获取Facebook的共享计数。

4 个答案:

答案 0 :(得分:8)

API确实发生了变化。

应该是这样。

https://graph.facebook.com/?id=https://stackoverflow.com&fields=engagement&access_token=user-access-token

您需要访问令牌。如果您有Facebook,请转到https://developers.facebook.com/并制作一个应用。

Graph API Explorer

然后单击“图形API资源管理器”。

Get Token

和“获取令牌”(获取应用程序令牌)。就是这样。

如果您使用JavaScript进行计数,就会像这样。

// split('#')[0] : Remove hash params from URL
const url = encodeURIComponent( window.location.href.split('#')[0] );

$.ajax( {
    url : '//graph.facebook.com/?id=' + url + '&fields=engagement&access_token=user-access-token',
    dataType : 'jsonp',
    timeout: 5000,
    success : function( obj ) {
        let count = 0;

        if ( typeof obj.engagement.reaction_count !== 'undefined' ) {
            count = obj.engagement.reaction_count;
        }
        // do something with 'count'
    },
    error : function() {
        // do something
    }
} );

还有其他计数类型,例如comment_count和share_count。

请参见https://developers.facebook.com/docs/graph-api/reference/v3.2/url

是否可以在不发送访问令牌的情况下接收计数?

我想知道我自己


更新:

感谢安东·卢金。

是的。我不应该显示访问令牌。它必须是隐藏的。我觉得很愚蠢。

所以现在快速回答。没有令牌,这确实有效!

我的最终答案(希望是最终答案)是这样的。

// split('#')[0] : Remove hash params from URL
const url = encodeURIComponent( window.location.href.split('#')[0] );

$.ajax( {
    url: '//graph.facebook.com/?id=' + url + '&fields=og_object{engagement}',
    dataType : 'jsonp',
    timeout: 5000,
    success : function( obj ) {
        let count = 0;

        try {
            count = obj.og_object.engagement.count
        } catch (e) {
            console.log(e)
        }
        // do something with 'count'
    },
    error : function() {
        // do something
    }
} );

这里的要点是,当没有人共享目标页面时,甚至都没有定义“ og_object.engagement”。

我以为我会得到0作为回报。但是事实并非如此。

所以我们使用try-catch。

现在,我唯一关心的是API限制。如果您的网站获得了很多浏览量,则此更新版本可能无法正常工作。

答案 1 :(得分:3)

由于您无法在前端显示访问令牌,因此建议您使用nginx代理请求,将您的access_token隐藏在服务器上。

  1. 您需要访问令牌。导航到https://developers.facebook.com/并制作一个应用。

  2. 转到Graph explorer并复制令牌。要获取永久令牌,请遵循以下简短的guide

  3. 向您的nginx配置添加自定义规则

http {
    ...

    # Optional: set facebook cache zone  
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=facebook:100m inactive=60m;

    ...
}

server {
    server_name example.org;
    ... 

    location /facebook {
        # Optional: don't log requests
        access_log off;
        log_not_found off;

        # Allow get shares only for single domain (remove condition to allow all domains)
        if ( $arg_id ~ "^https://example.org/" ) {
            set $args"${args}&access_token=your_access_token_here";
        }

        # Set dns resolver address (you can change it with any dns server)
        resolver 1.1.1.1;

        proxy_pass https://graph.facebook.com?$args;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # Optional: add cache for 30 minutes
        proxy_ignore_headers Expires;
        proxy_ignore_headers Cache-Control;

        proxy_cache facebook;
        proxy_cache_valid any 30m;
        proxy_cache_key $host$uri$is_args$arg_id;
    }

    ...
}
  1. 现在您可以使用自定义域替换graph.facebook.com进行响应了。
  

之前

     

https://graph.facebook.com/?fields=engagement&callback=FB.Share&id=https://example.org/&access_token=your_access_token

     

之后

     

https://example.org/facebook?fields=engagement&callback=FB.Share&id=https://example.org/

  1. 请注意facebook api限制。如果您有大量请求,则可以尝试使用page token。对于您页面的每个参与度用户,您每天都可以发出4800次图表API请求。

答案 2 :(得分:0)

如果您不想使用访问令牌或nginx代理解决方案,请参见https://stackoverflow.com/a/45796935/2424880

您可以使用查询

https://graph.facebook.com?id=<your-url>&fields=og_object{engagement}

答案将是

{
  "og_object": {
    "engagement": {
      "count": 197,
      "social_sentence": "197 people like this."
    },
    "id": "895062470590407"
  },
  "id": "<your-url>"
}

答案 3 :(得分:0)

如果您在Facebook中有应用程序,则无需登录即可非常简单地获取它。

https://graph.facebook.com/?id={URL}&fields=engagement&access_token={your-app_id}|{your-app_secret}

响应将类似于:

{
  "engagement": {
    "reaction_count": 36,
    "comment_count": 2,
    "share_count": 20,
    "comment_plugin_count": 3
  },
  "id": "https://www.example.com"
}

Ref:https://developers.facebook.com/docs/facebook-login/access-tokens