対象読者
- misskeyを使っている方
- Webhookを出せるCMSを使っている方
- Pythonをある程度扱える方
注意
この記事は独自性がある部分に絞って解説しています。
GitHubのAPIキーの発行など一般的なものは省略して別の方が書いた記事のリンクを乗せています。 あらかじめご了承ください。
作り方
- GitHubを用意します
- MisskeyのAPIを用意します
- newtのAPIを用意します
- Pythonで投稿するスクリプトを書きます
- workflowを書きます
- Webhookを用意します
- 完成
Githubを用意する
適当にリポジトリを作ってgit clone
しておいてください。後で使います。
MisskeyのAPIを用意する
この項ではAPIキーの発行方法を解説します。
APIキーは権限によりますが最悪アカウントが乗っ取られる危険のある代物です。 厳重に管理しましょう。
アクセストークンを発行する
まずはapiを管理画面へ行きましょう。URLはmisskey.ioの場合、https://misskey.io/settings/apiになります。 インスタンスがio以外の方はmisskey.ioを自身のインスタンスのドメインに置き換えてください。
そうすると次のような画面になると思います。
ここの一番上のボタンを押すと
このような画面でアクセストークン(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テンプレートがあったと思うのでそちらをお使いください。
ない場合はごめんなさい。調べてみたのですがありませんでした。頑張ってください。そしてできたら共有してください。見ます。
最後に
初めての技術系記事でかなりグダグダでしたが、参考になれば幸いです。
よければ下のボタンからシェアをお願いします。