見出し画像

Misskeyの投稿をTwitterにもバラまきたい

Misskey.ioに登録して、タイトルの内容を実現したくなったのでやり方をまとめてみました。無料で全文読めます。

クソ長前置き

昨今のTwitterの改悪騒動をきっかけに、自分もMisskeyを筆頭にいくつか他の類似サービスに登録してみた。
これまで10年以上使ってきたTwitterには1円たりとも払っていないのに、Misskey.ioには招待コード目当てであっさり課金する始末。オタク心は複雑である。

他サービスを触った所感としては、結局Twitterでいいかなというところ。API呼び出し制限の問題も落ち着いてきたし、TweetDeckも普通に使えるようになったので自分のユースケースではこれで十分な状態。
なによりユーザありきのサービスなので、新規に望ましいタイムラインを構築するのも億劫で、かつインスタもろくに使ってなかった自分としてはTwitterのリストこそが拠り所なのである。

とはいえ新しいサービスを使っていきたい気持ちもあるので、そうすると今度はいかに「ながら使い」をするかが課題になってくる。
サービスごとにまるっと投稿を分けてもよいが、それも面倒なのでどっかに投稿したら他のサービスにも投稿されるようにしたい。

本題

ということで今回は「Misskeyに投稿したらWebhookを使ってその内容がTwitterにも投稿されるAzure Functionsを作ってみた」の回です。

結局普段遣いしたいのはTwitterなのでTwitter APIで実現できればよかったのだが、Free accessでは本当に投稿しか出来ないのでWebhookを使った「投稿をトリガにして何かをする」が実現出来ない。そこで今回はMisskeyで用意されているWebhookを利用する。

イメージ

Azure Functions

どかっとPython実装だけ載せておく。Twitter投稿用にTweepyを使わせてもらった。MisskeyのWebhook仕様やFunctionsのデプロイ方法などは公式情報を参照。
※当然Azure Functionsの利用料金はかかるゾ。

from typing import Optional
from pydantic import BaseModel
import azure.functions as func
import logging
import os
import tweepy

MISSKEY_WEBHOOK_SECRET = os.getenv('MISSKEY_WEBHOOK_SECRET')

TWITTER_CONSUMER_KEY = os.getenv('TWITTER_CONSUMER_KEY')
TWITTER_CONSUMER_SECRET = os.getenv('TWITTER_CONSUMER_SECRET')
TWITTER_BEARER_TOKEN = os.getenv('TWITTER_BEARER_TOKEN')
TWITTER_ACCESS_TOKEN = os.getenv('TWITTER_ACCESS_TOKEN')
TWITTER_ACCESS_TOKEN_SECRET = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')

app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)
twitter = tweepy.Client(TWITTER_BEARER_TOKEN,
                        TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET,
                        TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_TOKEN_SECRET)

@app.route(route="HttpTrigger")
def HttpTrigger(req: func.HttpRequest) -> func.HttpResponse:
    if req.headers['X-Misskey-Hook-Secret'] != MISSKEY_WEBHOOK_SECRET:
        return func.HttpResponse(status_code=400)
    
    request = req.get_json()
    logging.info(request)

    event = MisskeyWebhookEvent.model_validate(request)
    if event.type == 'note':
        note = MisskeyWebhookNote.model_validate(event.body['note'])
        try:
            twitter.create_tweet(text=note.text)
        except Exception as e:
            logging.error(e)
        return func.HttpResponse(status_code=200)


class MisskeyWebhookEvent(BaseModel):
    hookId: str
    userId: str
    eventId: str
    createdAt: int
    type: str
    body: object


class MisskeyWebhookNote(BaseModel):
    id: str
    createdAt: str
    text: Optional[str]
    cw: Optional[str]
    user: object
    userId: str
    visibility: str

※環境変数(Functions上の「構成>アプリケーション設定」)で各種認証情報を設定する。"MISSKEY_WEBHOOK_SECRET"には後ほどMisskey側で設定するシークレットの値をセットする(リクエストの検証用)。

とりあえず最小限の実装だけ。Misskey側で投稿したテキストをTwitterにも投稿する。そのうち画像とかアイコンにも対応したい。他サービスへの投稿も。

Misskey

Webhookの設定をする。キャプチャ参照。

Misskey上でのWebhook設定

後書き

これでデプロイがうまく行っていればMisskeyの投稿がTwitterにもバラまかれるはず。好きに改造して使ってみてね。寄付してくれてもいいのよ。

おわり

ここから先は

0字

¥ 100

インスピレーションを刺激する酒代になります