效果: 用户向公众号发送消息, 公众号后端服务器接收到消息后, 调用 RoamResearch 的 API, 创建一个新 block, 将用户的笔记保存到 RR Graph 内.
代码如下, 目前还比较简陋:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| use Log;
// ...
Log::info($message);
if ($message["FromUserName"] == "我的微信标识" && $message["MsgType"] == "text") {
$today = date('m-d-Y');
$data_create_block = [
"action" => "create-block",
"location" => ["parent-uid" => $today, "order" => "last"],
"block" => ["string" => $message["Content"]],
];
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.roamresearch.com/api/graph/graph名称/write",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true, # important
CURLOPT_UNRESTRICTED_AUTH => true, # important
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30000,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode($data_create_block),
CURLOPT_HTTPHEADER => array(
"Content-Type: application/json",
"Authorization: " . "Bearer " . "你在RR申请的key, 开头是roam-graph-token-",
"Accept: application/json",
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
$http_info = curl_getinfo($curl);
curl_close($curl);
if ($err) {
Log::info("fail" . $err);
return "fail";
}
if ($http_info["http_code"] == 200) {
Log::info("success");
return "success";
}
return "fail";
}
return "你不该在这里";
|
和普通的 POST 请求不同, 向 api 发送 POST 请求后, url 会进行重定向, 因此, 要为 cURL 添加选项, 使其支持重定向, 并且在向重定向后的 url 发送请求时, 需要请求头依然附带 Authorization
字段. 因此下面这两个选项非常关键:
1
2
| CURLOPT_FOLLOWLOCATION => true, # important
CURLOPT_UNRESTRICTED_AUTH => true, # important
|
第一个选项CURLOPT_FOLLOWLOCATION
, PHP手册中是这样写的: true 时将会根据服务器返回 HTTP 头中的 “Location: " 重定向。(注意:这是递归的,“Location: " 发送几次就重定向几次,除非设置了 CURLOPT_MAXREDIRS,限制最大重定向次数)。
第二个选项CURLOPT_UNRESTRICTED_AUTH
, PHP手册中是这样写的: true 在使用CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。
我在使用 GuzzleHttp 时没有发现有类似的设置项.