使用webhook自动同步Mastodon到Memos

前言

为了更加方便的同步内容，可以作备份之用.

声明

代码和功能实现来自于@大大的蜗牛原理是使用 webhook. 在发布内容时，触发脚本运行.

步骤

同步脚本

脚本中API_HOST为 memos 的 API AUTHORIZATION为 memos 中 Token CONTENT_URL中111363033003475492为 mastodon 的用户的 ID 获得用户 ID 的方法可以参见

Copy
#!/bin/sh

# API 和 Token
API_HOST="https://memos.ee/api/v1/memo"
AUTHORIZATION="Bearer eyJhbGciOiJIUzI1NiIsImtpZCI6InYxIiwidHlwIjoiSldUIn0.eyJuYW1lIjoiamtqb3kiLCJpc3MiOiJtZW1vcyIsInN1YiI6IjEiLCJhdWQiOlsidXNlci5hY2Nlc3MtdG9rZW4iXSwiaWF0IjoxNjk3ODc0NTk2fQ.jNGMDE1YVX4Qj6hNhmrxb63WlRM5kGX10k_qRXH6ID4"

# 原始内容
CONTENT_URL="https://09j.cn/api/v1/accounts/111363033003475492/statuses?limit=1"
CONTENT=$(curl --connect-timeout 60 -s $CONTENT_URL | jq -r '.[0]')
# mastodon
MASTODON_URL=$(echo $CONTENT | grep -oP 'https:\/\/09j\.cn\/@[^\/]+\/\d+')
DUDU_CONTENT="[自动转发自我的Mastodon]($MASTODON_URL)"

MENTIONS=$(echo $CONTENT | jq -r '.mentions[]')
if [ ! -z "$MENTIONS" ]; then
echo "Skipping status mention! $(TZ=UTC-8 date +"%Y-%m-%d"" ""%T")"
echo ======================================================
exit 0
fi

MEDIA=$(echo $CONTENT | jq -r '.media_attachments')
# 判断 Media 的内容
if [ "$MEDIA" != "null" ]; then
MEDIAS=$(echo $CONTENT | jq -r '.media_attachments[] | select(.type=="image") | .url')
# 拼接图片
images=""
for url in $MEDIAS; do
images="$images![image]($url)\n"
done
TEXT=$(echo "$CONTENT" | jq -r '.content' | sed 's/ +/ /g' | lynx -dump -stdin -nonumbers -nolist | tr -d '\n' | sed '/^$/N;s/\n\n/\n/g' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
TEXT="$TEXT\n$DUDU_CONTENT"
TEXT="$TEXT\n$images"

else
# 普通内容
TEXT=$(echo "$CONTENT" | jq -r '.content' | sed 's/ +/ /g' | lynx -dump -stdin -nonumbers -nolist | tr -d '\n' | sed '/^$/N;s/\n\n/\n/g' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
TEXT="${TEXT}\n$DUDU_CONTENT"
fi

curl -X POST \
-H "Accept: application/json" \
-H "Authorization: $AUTHORIZATION" \
-d "{ content: $TEXT }" \
$API_HOST

echo Sync Mastodon to Memos Successful! $(TZ=UTC-8 date +"%Y-%m-%d"" ""%T")
echo ======================================================

我稍微做了一点修改。在发布到 memos 的同时贴上原本 mastodon 的原文链接。由于我不会写规则，就随意写了匹配规则 我的实例为 09j.cn 不需要则删除以下

Copy
MASTODON_URL=$(echo $CONTENT | grep -oP 'https:\/\/09j\.cn\/@[^\/]+\/\d+')
DUDU_CONTENT="[自动转发自我的Mastodon]($MASTODON_URL)"

Copy
TEXT="$TEXT\n$DUDU_CONTENT"

即可

部署 webhook

Docker 镜像是根据官方 dockerfile 增加了中文支持，

推荐使用 docker-compose 部署 编辑docker-compose.yaml内容为

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

在根目录下创建config目录，并在config下创建hooks.yml文件并编辑内容为

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

把脚本内容保存为memos.sh保存在config目录下

然后在docker-compose.yaml所在的根目录下 运行docker compose up -d即可

使用 Webhook

hooks.yaml为 webhook 的配置

其中的execute-command为可执行脚本

webhook 的访问地址格式为

Copy
服务器 ip:端口/hooks/ID

以 127.0.0.1 为例 访问http://127.0.0.1:9000/hooks/memos

设置 mastodon

在管理员后台中管理-webhooks-新增对端对端 URL 填入http://127.0.0.1:9000/hooks/memos 已启用事件选择status.created点击新增即可在发布新的嘟嘟时同步内容到 memos 了.