PHP cURL 调用 RoamResearch API 创建 Block

效果: 用户向公众号发送消息, 公众号后端服务器接收到消息后, 调用 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 时没有发现有类似的设置项.