前言

企业网站经常需要放 customer reviews 来增加 conversion. 常见的 Reviews 平台有 Facebook Reviews 和 Google Reviews.

这篇, 我将介绍如果通过 ASP.NET Core calling Facebook Graph API 来获取 Facebook Page 的 Reviews.

Preparation

首先要有 Facebook Page, Facebook Developer AccountFacebook App Development.

1. Get Facebook Page ID

上面这招好像过时了, 最新的版本找不到了....

目前找到另一招, 到 meta business 里面看 URL, 先用着呗

2. Create App

登入 Facebook 然后到 https://developers.facebook.com

点击 My App

点击 Create App

选择 type: None. 不要选 Business 哦 (Business 需要官方认证才能获取许多 permission, 很麻烦的... 我用 none 就足够了)

写 App 名字

Settings > Basic > 填写 Privacy Policy URL > Save changes

App Review > Permission and Features > Get advanced access (email, public_profile)

Checkup Get started > agree and next 到底

Live

2. Get App ID and App Secret

Page Access Token

参考: Docs – Access Tokens

在发送 API 的时候需要有 Page Access Token

Facebook 的 Access Token 有分 4 种:

  • Short-lived User Access Token (1 hour)
  • Long-lived User Access Token (60 days)
  • Short-lived Page Access Token (1 hour)
  • Long-lived Page Access Token (never expired)

要拿 Page Reviews 需要用到 Page Access Token. 但要拿到 Page Access Token 必须先拿到 User Access Token.

拿 User Access Token 有 2 个方法. 第一个就是 Facebook Login Dialog. 第二个是用 Graph Explorer tool

我的需求比较简单, backend daily server task 去拿新的 reviews 更新数据库.

所以会使用 Graph Explorer tool 去拿 Long-lived Page Access Token. 往后就在 server side 发 API 可以了.

Short-lived User Access Token

使用 Graph Explorer tool (需要 Facebook Developer Account 和 Facebook App Development)

然后会弹出 Facebook Login Dialog, 登入就可以了

然后就拿到 Short-lived User Access Token 了.

注: Page Reviews 需要下面这些 Permissions (不同 API 权限不一样, 每次添加 Permission 都需要重新 Generate Access Token 哦)

user_photos 好事不需要也行。

Long-lived User Access Token

有了 Short-lived 才能拿到 Long-lived. 接着我们可以用 Postman 来完成

GET URL: https://graph.facebook.com/oauth/access_token

query params:

grant_type : fb_exchange_token

client_id : App ID (上面有提到了)

client_secret : App Secret (上面有提到了)

fb_exchange_token : xxxxxx (这里放 Short-lived User Access Token)

Long-lived Page Access Token

有了 Long-lived User Access Token 才能拿到 Long-lived Page Access Token.

GET URL: https://graph.facebook.com/2019305211658271 (2019305211658271... 是 Facebook Page ID)

query params:

fields : access_token

access_token : xxxxxx (这里放 Long-lived User Access Token)

至此我们就拿到了可以长期使用的 Long-lived Page Access Token 了.

Reviews Graph API

参考: Docs – Page Ratings

GET URL : https://graph.facebook.com/2019305211658271/ratings

query params:

access_token : xxxxxx (这里放 Long-lived Page Access Token)

fields : created_time,recommendation_type,review_text,reviewer,has_rating,rating,has_review

效果

Facebook Reviews 不一定有 rating, 用户可以选择打分或者写 review, 或者 2 个一起.

p.s. Reviews API 视乎不支持 filter. 以后才研究呗. 参考1, 参考2 TODO...

p.s. created_time 的格式挺奇葩的, 许多人都有意见, C# 也无法直接 parse to DateTimeOffset,

解决方法是添加 query param date_format : U, 这样它会返回 int 从 1970 年的秒数 (不是毫秒哦), 之后我们就可以自己 Convert 到想要的格式了.

p.s. 默认返回 25 条资料,可以通过 query param "limit=525" 去限制或者扩大,最多可以一次输出 525 条。

ASP.NET Core 调用 Reviews Graph API

public class TestPageModel : PageModel
{
private readonly IHttpClientFactory _httpClientFactory; public TestPageModel(
IHttpClientFactory httpClientFactory
)
{
_httpClientFactory = httpClientFactory;
}
public async Task OnGet()
{
var pageId = "2019305211658271";
var accessToken = "xxxxxx"; var queryBuilder = new QueryBuilder();
queryBuilder.Add("access_token", accessToken);
queryBuilder.Add("fields", "created_time,recommendation_type,review_text,reviewer,has_rating,rating,has_review");
var queryString = queryBuilder.ToQueryString().Value!; var httpRequestMessage = new HttpRequestMessage
{
RequestUri = new Uri($"https://graph.facebook.com/{pageId}/ratings{queryString}"),
Method = HttpMethod.Get,
};
httpRequestMessage.Headers.Add("Accept", "application/json; charset=utf-8"); var httpClient = _httpClientFactory.CreateClient();
var response = await httpClient.SendAsync(httpRequestMessage);
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
}
}
}

获取 Reviewer Picture

参考: Docs – User Picture

Reviews API 只能拿到 reviewer name 和 id 没有 picture. 想拿 picture 需要 call 另一个 API.

GET URL : https://graph.facebook.com/5431925970230375/picture (5431925970230375 是 reviewer id)

query params:

access_token : xxxxxx (这里放 Long-lived Page Access Token)

width : 320 (默认是 50px 很小, 大一号是 320px)

效果

注: 它返回的是 byte 哦, Content-Type 是 image/jpeg

ASP.NET Core 调用 Picture Graph API

public class TestPageModel : PageModel
{
private readonly IHttpClientFactory _httpClientFactory; public TestPageModel(
IHttpClientFactory httpClientFactory
)
{
_httpClientFactory = httpClientFactory;
}
public async Task OnGet()
{
var userId = "5431925970230375";
var accessToken = "xxxxx"; var queryBuilder = new QueryBuilder();
queryBuilder.Add("access_token", accessToken);
queryBuilder.Add("width", "320");
var queryString = queryBuilder.ToQueryString().Value!; var httpRequestMessage = new HttpRequestMessage
{
RequestUri = new Uri($"https://graph.facebook.com/{userId}/picture{queryString}"),
Method = HttpMethod.Get,
};
httpRequestMessage.Headers.Add("Accept", "image/jpeg"); var httpClient = _httpClientFactory.CreateClient();
var response = await httpClient.SendAsync(httpRequestMessage);
if (response.IsSuccessStatusCode)
{
var buffer = await response.Content.ReadAsByteArrayAsync();
using var fileStream = System.IO.File.Create("reviewer-avatar.jpg", buffer.Length);
await fileStream.WriteAsync(buffer);
fileStream.Flush();
}
}
}

错误处理

比如 Page ID 不正确, 它会返回 400 bad request, JSON 是一个 error message.

如果有设置 Accept header 的话, 一定要加上 application/json 来处理错误哦

比如

Reviews API = Accept : application/json; charset=UTF-8

Picture API = Accept : image/jpeg, application/json (注: 我试过 + charset=UTF-8 但是不行...不知道为什么)

总结

这篇介绍了如何通过 ASP.NET Core 调用 Graph API 获取 Page Reviews 和 Reviewer Picture.

第一步是基本 setup (Facebook page, Developer account, App)

第二步是获取永久可用的 Page Access Token, 这样 server 就可以一直去拿最新的 Reviews.

第三步是调用 Graph API 获取 Reviews 和 Reviewer Picture.

题外话 – 获取 Facebook Page Post Content

这主题应该开多一篇介绍的,但我还没有准备好,所以先记入在这里呗。

Facebook – Reviews (Graph API)的更多相关文章

  1. facebook graph api 报错SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)')

    使用facebook graph api,报错如下 一开始以为是https证书验证失败,查了一下午源码,没有看到问题,于是把Python27\lib\site-packages\requests\ad ...

  2. Facebook Graph API 接口请求

    Graph API 调试器 这两天因项目需求,在调试FB的接口.项目的应用在FB上面.L特傻.没有区分FB的api的使用方式. 因为应用是在FB上面的.所以在登录应用的时候,就已经登录了FB平台.对于 ...

  3. Microsoft Graph API -----起题 Graph API

    最近因为工作需要,接触学习使用了Microsoft Graph API.在看完Microsoft的Graph官方文档之后,也做了一些简单的案例,在Stack Overflow上做过一些回答.整体来说, ...

  4. AAD Service Principal获取azure user list (Microsoft Graph API)

    本段代码是个通用性很强的sample code,不仅能够操作AAD本身,也能通过Azure Service Principal的授权来访问和控制Azure的订阅资源.(Azure某种程度上能看成是两个 ...

  5. [Windows Azure] Using the Graph API to Query Windows Azure AD

    Using the Graph API to Query Windows Azure AD 4 out of 4 rated this helpful - Rate this topic This d ...

  6. 【Azure Developer】使用Microsoft Graph API创建用户时候遇见“401 : Unauthorized”“403 : Forbidden”

    问题描述 编写Java代码调用Mircrosoft Graph API创建用户时,分别遇见了"401 : Unauthorized"和"403 : Forbidden&q ...

  7. 【Azure Developer】Python 获取Micrisoft Graph API资源的Access Token, 并调用Microsoft Graph API servicePrincipals接口获取应用ID

    问题描述 在Azure开发中,我们时常面临获取Authorization问题,需要使用代码获取到Access Token后,在调用对应的API,如servicePrincipals接口. 如果是直接调 ...

  8. 【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法

    问题描述 在先前的一篇博文中,介绍了如何使用Microsoft Graph API来创建Azure AD用户(博文参考:[Azure Developer]使用Microsoft Graph API 如 ...

  9. 【Azure Developer】使用Microsoft Graph API 如何批量创建用户,用户属性中需要包含自定义字段(如:Store_code,Store_name等)

    Microsoft Graph 是 Microsoft 365 中通往数据和智能的网关. 它提供统一的可编程模型,可用于访问 Microsoft 365.Windows 10 和企业移动性 + 安全性 ...

  10. 【Azure Developer】使用 Microsoft Graph API 获取 AAD User 操作示例

    问题描述 查看官方文档" Get a user " , 产生了一个操作示例的想法,在中国区Azure环境中,演示如何获取AAD User信息. 问题解答 使用Microsoft G ...

随机推荐

  1. Curve 替换 Ceph 在网易云音乐的实践

    Curve 块存储已在生产环境上线使用近三年,经受住了各种异常和极端场景的考验,性能和稳定性均超出核心业务需求预期 网易云音乐背景 网易云音乐是中国领先的在线音乐平台之一,为音乐爱好者提供互动的内容社 ...

  2. django 设置外键的时候,related_name的值大写还是小写,规则怎样

    django 设置外键的时候,related_name的值大写还是小写,规则怎样 在Django中,related_name参数用于定义反向关系的名称,即通过外键字段反向查询关联模型的对象.relat ...

  3. 图的存储、创建、遍历、求最小生成树、最短路径(Java)

    带权无向图 存储结构 存储结构选用邻接表. 当一个图为稀疏图时,使用邻接矩阵法显然要浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费. 当然,即使我们所处理的 ...

  4. __int128的输入输出(快读快输)

    引言:__int128不能用\(cin\)\(cout\)或\(scanf\)\(printf\). 快读 思想:把每一个字符读入,组成数字. int read(){ int x = 0,y = 1; ...

  5. [UE源码] 关于使用UE待改进的一些尝试

    UE从自己做了一款游戏后,发现了蓝图以及UE引擎本身的一些优缺点: 1.蓝图在一些简单的逻辑上书写方便,直观,而且编译速度快,但是也有一些其他问题: 结构体赋值后,无法二次修改 只有3种容器Array ...

  6. 深度学习 玩游戏 Q-LEARNING

    游戏里面非玩家的角色行为,即 AI. 腾讯的 Ai 游戏框架:TencentOpen. 介绍: Agent,behavior tree, 大概意思就是 通过自己的框架来确定 ai 行为,然后通过 ag ...

  7. 后端说,单页面SPA和前端路由是怎么回事

    没有请求的路由 在传统开发中,浏览器点击一个超链接,就会像后端web服务器发送一个html文档请求,然后页面刷新.但开始单页面开发后,就完全不同了. 单页面?这个概念难以理解.我用一个js作为整个we ...

  8. Net8将Serilog日志推送ES,附视频

    这是一个Serilog的实践Demo,包括了区别记录存放,AOP 日志记录,EF 执行记录,并且将日志推送到Elastic Search. 说在前面的话 自从AI出来之后,学习的曲线瞬间变缓了,学习的 ...

  9. CentOS 7 下将 jar 包注册为服务

    前提条件 因为 jar 包启动需要用到 jdk,所以服务器上必须要安装jdk或者jre,这方面的教程网上有非常多,可以去百度一下 创建文件 创建website.service文件, 内容如下: [ro ...

  10. 【转载】 Mobaxterm 中文输入Backspace按键问题

    版权声明:本文为CSDN博主「Flynnsin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_45830 ...