banner
老孙

老孙博客

资深网民孙先生
mastodon
email

MastodonをMemosに自動同期するためにwebhookを使用します。

前書き#

コンテンツをより便利に同期し、バックアップに使用できます。

宣言#

コードと機能の実装は、@大大的蜗牛から提供されています。原理は webhook を使用しています。コンテンツを公開する際に、スクリプトがトリガーされます。

手順#

同期スクリプト#

スクリプト中のAPI_HOSTは memos の API であり、AUTHORIZATIONは memos のトークンです。CONTENT_URL111363033003475492は mastodon のユーザー ID です。ユーザー ID の取得方法については、次を参照してください。

#!/bin/sh

# APIとトークン
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 "ステータスのメンションをスキップします! $(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 MastodonからMemosへの同期が成功しました! $(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

例として、http://127.0.0.1:9000/hooks/memos にアクセスします。

Mastodon の設定#

管理者のバックエンドで管理-webhooks-対向先の追加に移動し、対向先 URL にhttp://127.0.0.1:9000/hooks/memos を入力し、有効なイベントを選択して `status.created` をクリックして追加します。これにより、新しいトゥートを公開する際にコンテンツが memos に同期されます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。