分享 2543 13

    自动同步Mastodon到Memos

    AI摘要:本文介绍了如何将Mastodon的内容自动同步到Memos,并提供了相应的脚本和配置文件。通过使用webhook和Docker镜像,可以实现自动同步的功能。同时,还介绍了如何在Mastodon中设置webhook,以便在发布新的内容时自动同步到Memos。此外,还提到了可以使用webhook将Memos的内容同步到其他具有API的服务中。

    前言

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

    声明

    代码和功能实现来自于@大大的蜗牛 原理是使用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了.

    其他

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

    老孙
    资深网民孙先生

    Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /www/sites/imsun.org/index/usr/themes/farallon/comments.php on line 4

    Deprecated: stripos(): Passing null to parameter #1 ($haystack) of type string is deprecated in /www/sites/imsun.org/index/usr/themes/farallon/comments.php on line 4
    1. TeacherDu
      2024-04-13 14:31

      突然有想法也搭建一个~

        1. 老孙 作者
          2024-04-15 08:34
          @TeacherDu

          那就搭建一个!!嘿嘿,一起玩

    2. bouns
      bouns
      2024-03-21 19:47

      请问“服务器 ip:端口/hooks/ID”这里的ID指什么?我尝试输入我的域名/hooks/memos,但显示“Hook not found.”,怀疑问题出在这里

        1. 老孙 作者
          2024-03-21 19:52
          @bouns

          就是在hooks.yml中的ID

    3. 大大的小蜗牛
      大大的小蜗牛
      2024-01-14 16:10

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

        1. 老孙 作者
          2024-01-14 17:23
          @大大的小蜗牛

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

    4. koobai
      koobai
      2024-01-14 15:23

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

        1. 老孙 作者
          2024-01-14 17:28
          @koobai

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

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

            1. koobai
              koobai
              2024-01-14 18:54
              @老孙

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

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

                1. 老孙 作者
                  2024-01-14 19:27
                  @koobai

                  嘿,就是这个意思。

                    1. 冰剑
                      2024-03-08 19:50
                      @老孙

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

                        1. 老孙 作者
                          2024-03-08 19:54
                          @冰剑

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

                          你可以请求一份账户数据存档,其中包含你的嘟文和已上传的媒体文件。导出的数据为 ActivityPub 格式,因而可以被兼容的软件读取。每次允许请求存档的间隔至少为 7 天。