banner
老孙

老孙博客

资深网民孙先生
mastodon
email

使用webhook自動同步Mastodon到Memos

前言#

為了更加方便的同步內容,可以作備份之用。

声明#

代码和功能實現來自於@大大的蝸牛原理是使用 webhook。在發布內容時,觸發腳本運行。

步驟#

同步腳本#

腳本中API_HOST為 memos 的 API AUTHORIZATION為 memos 中 Token CONTENT_URL111363033003475492為 mastodon 的使用者的 ID 獲得使用者 ID 的方法可以參見

#!/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 不需要則刪除以下

MASTODON_URL=$(echo $CONTENT | grep -oP 'https:\/\/09j\.cn\/@[^\/]+\/\d+')
DUDU_CONTENT="[自動轉發自我的Mastodon]($MASTODON_URL)" 
TEXT="$TEXT\n$DUDU_CONTENT"

即可

部署 webhook#

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:/config:ro
    ports:
      - 9000:9000
    restart: always

在根目錄下創建config目錄,並在config下創建hooks.yml文件並編輯內容為

- 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 的訪問地址格式為

伺服器 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 了.

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。