自动同步Mastodon到Memos

前言

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

声明

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

步骤

同步脚本

脚本中API_HOST为memos的API
AUTHORIZATION为memos中Token
CONTENT_URL111363033003475492为mastodon的用户的ID
获得用户ID的方法可以参见
[postcard type="list"]1469[/postcard]

#!/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了.

其他

同理也可以使用webhook在发布memos时候同步到其他拥有API的服务中了.

评论

  1. koobai
    3 月前
    2024-1-14 15:23:08

    这个号,总感觉Mastodon现在门槛高,还的注册才行~
    我到现在都没搞明白Mastodon是啥,其中一家Mastodon没了,是不是内容就没了。

    • 博主
      koobai
      3 月前
      2024-1-14 17:28:47

      所谓去中心化社交网络,就是可以自己部署在自己服务器上,但是通过协议可以和其他服务器上的用户交流.
      包括mastodon GoToSocial misskey 等.
      假如与你互动的实例不再运营,那么你的内容还在,只是没法与对方交流了而已.

      [f=huaixiao] 如果想尝试可以来我的服务器 jiong.us

      • koobai
        老孙
        3 月前
        2024-1-14 18:54:28

        你看看我这样理解对不对,我在你的服务器开通了账号,一直发内容,一直跟其他服务器上的朋友互动。
        有天你服务器不运营了,我跟其他服务器之前互动的内容还停留在对方服务器中,这个不会消失,只是对方没办法再与我互动了。另外我在你服务器中发的时间线,是不是也就没了。

        这个时候,我换了个服务器,是不是得把曾经在你服务器中的时间线备份还原到新的服务器

        • 博主
          koobai
          3 月前
          2024-1-14 19:27:54

          嘿,就是这个意思。

          • 老孙
            Windows Chrome 102.0.0.0
            1 月前
            2024-3-08 19:50:41

            那是不是时间线的备份还是需要自己勤快一些?如果没有备份,服务提供商跑路了,那么时间线也会跟着消失?

          • 博主
            冰剑
            Windows Chrome 121.0.0.0
            1 月前
            2024-3-08 19:54:30

            而事实上mastodon 有相关的功能描述

            你可以请求一份账户数据存档,其中包含你的嘟文和已上传的媒体文件。导出的数据为 ActivityPub 格式,因而可以被兼容的软件读取。每次允许请求存档的间隔至少为 7 天。
  2. 大大的小蜗牛
    3 月前
    2024-1-14 16:10:03

    这个也实用,可以检测 $MASTODON_URL 是否存在,来规避重复备份。我有的时候就会发布多条同一 Memos 内容。

    • 博主
      大大的小蜗牛
      3 月前
      2024-1-14 17:23:00

      [f=doge] 都是抄你的 还得是向你学习

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇