779 字
4 分钟
从memos的webhook开始
2024-06-18

说在前面#

memos的webhook功能从v0.18 版本开始加入. webhook也为memos带来了不一样的玩法.

前段时间从Typecho主题icefox上直接CTRL+C了CSS布局,做了一个基于memos的单页面,类微信朋友圈.

然后使用webhook自动保存json到本地目录,快速加载. 解决跨域问题

获取memos.json#

使用bash#

创建一个memos.sh文件

#!/bin/bash

# API地址
API_URL="https://memos.ee/api/v1/memos"

# 过滤参数
FILTER="visibilities == ['PUBLIC'] && creator == 'users/1'" 
PAGE_SIZE="200"

# Authorization 头部
AUTH_HEADER="Bearer token"

# 目标文件
OUTPUT_FILE="/config/memos.json"

# 使用 curl 发送 GET 请求并将结果保存到文件
curl -G "${API_URL}" \
     --data-urlencode "filter=${FILTER}" \
     --data-urlencode "pageSize=${PAGE_SIZE}" \
     -H "Authorization: ${AUTH_HEADER}" \
     -H "Accept: application/json" \
     -o "${OUTPUT_FILE}"

# 检查是否成功
if [ $? -eq 0 ]; then
    echo "JSON 数据已成功保存到 ${OUTPUT_FILE}"
else
    echo "获取 JSON 数据失败"
fi

这个脚本用于获取最近200条的memos

自行更改以上的API_URL token 以及过滤参数

当然我们也可以 使用php获取json 或者使用宝塔webhook获取json 这样就不需要部署webhook镜像 可以跳过以下部署webhook镜像的部分

使用宝塔webhook#

可直接复制bash代码到宝塔的webhook中 968b29c66c6099d11acf6.png

其中目标位置OUTPUT_FILE需要使用绝对路径

点击查看密钥

宝塔WebHook使用方法: GET/POST: https://ip:18888/hook?access_key=9EkgLRL4NbZOC7TSfiIyCE3rUQo3yEYfu7XPW6BX3Qjuobwt&param=aaa

把以上链接填入memos的webhook中

使用php获取#

<?php
$url = 'https://memos.ee/api/v1/memos'; //api url
$filter = "visibilities == ['PUBLIC'] && creator == 'users/1'"; //筛选参数visibilities == ['PUBLIC']公开,creator == 'users/1' 用户UID为1
$pageSize = "200"; //memos数量
$authHeader = "Bearer token"; //token

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Authorization: ' . $authHeader,
    'filter: ' . $filter,
    'pageSize: ' . $pageSize
));

$response = curl_exec($ch);

curl_close($ch);

$data = json_decode($response, true);

if (json_last_error() === JSON_ERROR_NONE) {
    file_put_contents('memos.json', json_encode($data, JSON_PRETTY_PRINT)); //保存为memos.json
} else {
    echo 'The response is not a valid JSON string.';
}
?>

把以上保存为memos.php,放在可执行的网站目录中

访问地址即可在同级目录下生成memos.json的文件

使用webhook功能#

部署webhook镜像#

此处使用一个webhook的DOCKER镜像

此Docker镜像是我根据官方dockerfile增加了中文支持编译而成. 推荐使用docker-compose部署 编辑docker-compose.yaml内容为

services:
  webhook:
    image: jkjoy/webhook
    container_name: webhook
    command: -verbose -hooks=hooks.yml -hotreload
    environment:
      - TZ=Asia/Chongqing #中国时区
      - LANG=C.UTF-8  #中文支持
    volumes:
      - ./:/config:rw
    ports:
      - 9000:9000
    restart: always

创建hooks.yml文件并编辑内容为

- id: memos
  execute-command: "/config/memos.sh"
  command-working-directory: "/"

然后运行

docker compose up -d

即可

使用Webhook#

hooks.yaml为webhook的配置文件

其中的execute-command为容器中的可执行脚本目录 webhook的访问地址格式为 服务器 ip:端口/hooks/id 访问http://127.0.0.1:9000/hooks/memos 即可触发执行bash /config/memos.sh

在memos的webhook设置中填入http://127.0.0.1:9000/hooks/memos的webhook地址, 即可

以宝塔为例#

创建一个名为 api.domain.com的网站 在网站的根目录下创建 docker-compose.yaml hooks.yaml memos.sh 的文件 运行

docker compose up -d

创建一个反向代理 使 127.0.0.1:9000 代理到 api.domain.com 的 /webhook/ 目录 访问api.domain.com/webhook/hooks/memos 此时会在网站根目录下生成memos.json 访问api.domain.com/memos.json 此时在memos的webhook地址中填入api.domain.com/webhook/hooks/memos 实现在memos更新时自动更新memos.json文件

演示#

https://memos.jkjoy.cn

从memos的webhook开始
https://blog.ittst.com/posts/start-with-memos's-webhook/
作者
浪子
发布于
2024-06-18
许可协议
CC BY-NC-SA 4.0