2019-12-21 / @syui

mastodon

mastodonからtwitterに投稿する

この前、golangで使ってるlibがv2にupdateしたとかで書き直さなきゃいけなくて、面倒だと思ってたんだけど、mastodonとtwitter連携が面白そうだったので、それをネタにツールを書き直して、ついでに仕組みを作ってみました。

具体的には、mastodonにtwitterタグを付けて投稿すると、twitterにも投稿されるようにしてみる。

仕組みは、gh-actionsのcronが最短で5分ごとに回してくれるのに目をつけ、これ使えるなと思ってたので、使ってみた。(5分じゃgithubさんの負担大きすぎなので、15分で様子見してる。

GitHub ActionsにCI/CD機能を搭載〜パブリックリポジトリでは無料で利用可能

gh-actionsでcron:m15を回して、mastodonはapiから投稿を取得、twitterタグがついてれば、jqで投稿を抜き出し、date(unix-time)で15分前のtimeとmastodonの投稿時間を比較し、大きければ新しい投稿と判断して、syui/twgからtwitterに投稿するという感じ。

name: mastodon tweet

on:
  push:
    branches:
      - master
  schedule:
    - cron:  '*/15 * * * *'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - run: |
        job_time=15
        export GOPATH=$HOME/go
        export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
        curl -sL https://github.com/syui/twg/releases/download/0.3/linux_amd64_twg -o twg
        chmod +x twg
        mkdir -p ~/.config/twg
        cat .config/twg/user.json| jq ".|=. + {\"Token\":\"${{ secrets.TWITTER_TOKEN }}\",\"Secret\":\"${{ secrets.TWITTER_SECRET }}\"}" > t
        mv t ~/.config/twg/user.json
        url=https://mstdn.syui.cf/api/v1
        j=mastodon.json
        user_id=1
        url="$url/accounts/$user_id/statuses?limit=40"
        curl -sSL "$url" -H "Authorization: Bearer ${{ secrets.MASTODON_ACCESS_TOKEN }}" > $j
        post=`cat $j|jq -r ".[]|select(.tags != [])|select(.tags|.[].name == \"twitter\")|.content"|sed -e 's/<[^>]*>//g' -e 's/#twitter//g'`
        if [ -z "$post" ];then
                echo no tag post
                exit
        fi
        date=`cat $j|jq -r ".[]|select(.tags != [])|select(.tags|.[].name == \"twitter\")|.created_at"`
        now=`date +%s -d "$job_time minutes ago"`
        for (( i=1;i<=`echo "$date"|wc -l`;i++ ))
        do
                date_t=`echo "$date"|awk "NR==${i}"`
                date_t=`date --date="$date_t" +%s`
                post_t=`echo "$post"|awk "NR==${i}"`
                if [ "$date_t" -gt "$now" ];then
                        echo $post_t
                        ./twg p "$post_t"
                fi
        done        

twgはlocalで使えるようにして~/.config/twg/user.jsonからtoken,secretを抜き出し、github-repo-settingにてprivateな環境変数に登録しておく。mastodonも同じような感じで。

twgは、releasesからダウンロードしないと、appのコンシューマキーなどがバイナリに含まれないので、その場合、自身でtwitter devからappを作成、コンシューマなどをゲット後にbuildする必要があります。

また、ci上のtimeとmastodon-server上のtimeが合っているかは気にしなければいけません。合っていなければ調整する必要あり。unix-timeに変換するのは単純に比較演算するため。

これは本来のciの使い方じゃないけど、gh-actions、便利。

こういうのは、zapierとか使えば、もっと簡単にできます。