絵文字のアップロード画面では、実は複数選択が可能である。
この際、いくつかの条件を満たすとファイル名が絵文字の名前として採用されるので
予めファイル名を整理してアップロードすると便利である。
NGなファイル名の場合、絵文字の内部IDがそのまま絵文字の名前になる。
あとで変更しよう
管理者ロールでレートリミットを0にしておかないと、途中で失敗するので気をつけよう。
https://dbeaver.io/download/ というツールで emojis テーブルを .csvでダウンロードしたい
サーバーへの接続情報を入力し(*1)、(設定したテーブル名)→ public→emojisと進んでいく
*1 DockerComposeでDBも構築してるとDBverからの接続が難しいはず。誰か追記もとむ
リモートの絵文字も表示されているので、 host is NULLにする
結果セットのエクスポートを行う
設定項目はデフォルトのままでいいので、保存する
このCSVを好きに編集する。スプレッドシートなどにインポートすると複数人で編集できたりして楽
編集したCSVをMisskeyに登録していく。
まず、管理者ロールでレートリミットを0にする。
これを行わないと、連続でAPIをコールすると途中で失敗してしまう。
次に、CSVをJSONに変換する。このサイトをつかう 。
https://csvjson.com/csv2json
CSVをそのまままるごと突っ込んでも大丈夫だが、変更のある行だけに絞り込んでもよい
次に、自分の認証情報を取得する。
自分のMisskeyを開き、認証情報の i を取得する
WindowsならF12を押すなどして、開発者ツールを開く。
このiの値をコピーする
そして、次のプログラムを、開発者ツールのコンソールで実行する
i, domain, emojiBaseは適宜変更する
const i = "XXXXXXXX"
const domain = "https://misskey.gamelore.fun"
const emojisBase = []
function chunkArray(arr, chunkSize) {
const chunks = [];
for (let i = 0; i < arr.length; i += chunkSize) {
chunks.push(arr.slice(i, i + chunkSize));
}
return chunks;
}
emojis = chunkArray(emojisBase, 100)
emojis[0].forEach(e => {
const body = {
i,
id: e.id,
name: e.name,
category: e.category,
aliases: e.aliases.replace(/\\\"\\\"/g, "").replace(/\{/g, "").replace(/\}/g, "").split(","),
license: e.license
}
fetch(domain + "/api/admin/emoji/update", {
"headers": {
"accept": "*/*",
"accept-language": "ja,en-US;q=0.9,en;q=0.8",
"cache-control": "max-age=0",
"content-type": "application/json",
"sec-ch-ua": "\"Google Chrome\";v=\"111\", \"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"111\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"macOS\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin"
},
"referrerPolicy": "origin",
"body": JSON.stringify(body),
"method": "POST",
"mode": "cors",
"credentials": "omit"
});
})
実行例
絵文字は100個ずつに分割して更新するようにしているので、
100個以上ある場合は以下をコピーして実行する
// ↓ここの0を 1, 2, 3... と書き換えておくる
emojis[0].forEach(e => {
const body = {
i,
id: e.id,
name: e.name,
category: e.category,
aliases: e.aliases.replace(/\\\"\\\"/g, "").replace(/\{/g, "").replace(/\}/g, "").split(","),
license: e.license
}
fetch(domain + "/api/admin/emoji/update", {
"headers": {
"accept": "*/*",
"accept-language": "ja,en-US;q=0.9,en;q=0.8",
"cache-control": "max-age=0",
"content-type": "application/json",
"sec-ch-ua": "\"Google Chrome\";v=\"111\", \"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"111\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"macOS\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin"
},
"referrerPolicy": "origin",
"body": JSON.stringify(body),
"method": "POST",
"mode": "cors",
"credentials": "omit"
});
})
GLHF!