Misskeyに自動でnewtの新着をノートする

公開日時: 2024年8月0日

アップデート: 2024年8月5日

misskeyに自動でブログの宣伝をするプログラムを書いたのでその宣伝を


対象読者

  • misskeyを使っている方
  • Webhookを出せるCMSを使っている方
  • Pythonをある程度扱える方

注意

この記事は独自性がある部分に絞って解説しています。

GitHubのAPIキーの発行など一般的なものは省略して別の方が書いた記事のリンクを乗せています。 あらかじめご了承ください。

作り方

  1. GitHubを用意します
  2. MisskeyのAPIを用意します
  3. newtのAPIを用意します
  4. Pythonで投稿するスクリプトを書きます
  5. workflowを書きます
  6. Webhookを用意します
  7. 完成

Githubを用意する

適当にリポジトリを作ってgit cloneしておいてください。後で使います。

MisskeyのAPIを用意する

この項ではAPIキーの発行方法を解説します。

APIキーは権限によりますが最悪アカウントが乗っ取られる危険のある代物です。 厳重に管理しましょう。

アクセストークンを発行する

まずはapiを管理画面へ行きましょう。URLはmisskey.ioの場合、https://misskey.io/settings/apiになります。 インスタンスがio以外の方はmisskey.ioを自身のインスタンスのドメインに置き換えてください。

そうすると次のような画面になると思います。

misskey_APIToken.webp

ここの一番上のボタンを押すと

misskey_APIToken_detail.webp

このような画面でアクセストークン(APIキー)が取得できます。

アクセストークンの権限は最小限にしましょう。今回はノートを作成・削除するだけで大丈夫です。 もしほかの権限でできるアイデアがあったらONにしてもいいと思います。

アクセストークンの保存

さて、ここからが重要なのですが、アクセストークンは一度しか見れません! しっかりメモを取るようにしましょう。

僕はパスワードマネージャーに保存してもらいました。自分で覚える必要がないのでかなりおすすめです。

newtのAPIを用意する

これはブログのビューに使ってるやつをそのまま使えばOK。

Pythonで投稿するスクリプトを書く

最低限がこんな感じ

from misskey import Misskey

mk = Misskey('misskey.io', i='misskeyのAPIトークン')
mk.notes_create("投稿文章")

これだとAPIトークンを直書きすることになるし、最新のブログのタイトルとかも取ってこれないから各自で改良してください。

僕はこんな感じで書きました。

from misskey import Misskey
import requests
import json
import os
from dotenv import load_dotenv
import time
import sys

# 初期化
load_dotenv('.env')
mk = Misskey('misskey.io', i=os.getenv("MISKEY_API_TOKEN"))

# newt関連の処理
newtUrl = f"https://{os.getenv("NEWT_SPACE_NAME")}.api.newt.so/v1/blog/article/"
newtQuery = {
    "limit": 1,
    "select": "title,slug,tags,id"
}
newtHeaders = {
    "Authorization": f"Bearer {os.getenv("NEWT_API_TOKEN")}"
}
res = requests.get(url=newtUrl, headers=newtHeaders, params=newtQuery)

print(res.status_code)

resjson = json.loads(res.text)
item = resjson["items"][0]

title = item["title"]
slug = item["slug"]
id = item["id"]
tags = []
for tag in item["tags"]:
    tags.append(tag["name"])

url = f"https://htmt.static.jp/blogs/{id}"

# 投稿の文章を生成
hashTag = ""
for tag in tags:
    hashTag += "\n#" + tag

noteStr = f"{title}\n{slug}\n{url}\n{hashTag}"

print(noteStr)

for i in range(60):
    s = f"ポストまであと {60 - i} 秒"
    sys.stdout.write("\033[2K\033[G%s" % s)
    sys.stdout.flush()
    time.sleep(1)
print()
mk.notes_create("最新の記事はこちら\n" + noteStr + "\n自動ノートです")
print("ポストされた")

ポストまでカウントは見てて楽しいから作りました()

dotenvでAPIトークンを管理して、newtの記事を取ってこれるようになってます。

workflowを書く

書いたPythonコードをGithub Actionで実行させるようにしましょう。

name: Deploy
on:
  repository_dispatch:
    types: [blog_posted]
jobs:
  misskey_post:
    runs-on: ubuntu-latest
    timeout-minutes: 3
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"
          cache: pip

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: note
        env:
          MISKEY_API_TOKEN: ${{ secrets.MISKEY_API_TOKEN }}
          # この2つはnewtを使う人向け
          NEWT_API_TOKEN: ${{ secrets.NEWT_API_TOKEN }}
          NEWT_SPACE_NAME: ${{ secrets.NEWT_SPACE_NAME }}
        run: |
          python misskey_post.py

GitHubの環境変数の作り方

こちらの記事が詳しいです。

https://github.com/${ユーザーネーム}/${リポジトリ名}/settings/secrets/actions/
上のリンクから環境変数を定義できます。

Webhookを用意する

最後にCMSからWebhookを投げてGitHub Actionを発火させましょう。

少なくともMicroCMSとNewtはGitHub Acrtion用のWebHookテンプレートがあったと思うのでそちらをお使いください。

ない場合はごめんなさい。調べてみたのですがありませんでした。頑張ってください。そしてできたら共有してください。見ます。

最後に

初めての技術系記事でかなりグダグダでしたが、参考になれば幸いです。

よければ下のボタンからシェアをお願いします。