misskeyで絵文字追加お知らせbotを動かす

misskeyインスタンスに絵文字が追加されたときに自動でお知らせするbotの作り方です


### 手順
1. misskeyのお知らせを流すbot用のアカウントを用意します。「管理者」権限を付与しておく必要があります。
2. 設定→APIからアクセストークンを発行しておきます。「ノートの作成・削除する」「絵文字を見る」（管理者権限が有効になっているユーザーしか出てきません）を有効にしておいてください。
3. Googleスプレッドシートから空白の新しいスプレッドシートを作成し、拡張機能タブから「Apps Script」を選んで出てきたコード編集画面に下記のコードを入れて後述の変更箇所のところを変更して保存する（最初から入っている`function myFunction(){}`は消してください
4. Googleスプレッドシートの実行する関数を選択からexecTriggerを選んで実行ボタン押すと「承認が必要です　このプロジェクトがあなたのデータへのアクセス権限を必要としています。」というダイアログが出てくるので適宜許可する（初回時に一回だけやればOK
5. 左のメニューのトリガーから実行する関数にexecTriggerを選んで時間主導型から実行したい頻度を選んでください。頻繁に更新するのであれば一時間に一回、たまにしか追加しないのであれば一日に一回などお好みでどうぞ。

### コード
```javascript
// 前回のidをスプレッドシートに書き込む
function saveLastIdToSpreadsheet(lastId,cell) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(cell).setValue(lastId);
}

// スプレッドシートから前回のidを読み取る
function getLastIdFromSpreadsheet(cell) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastId = sheet.getRange(cell).getValue();
  return lastId;
}

//絵文字を取得する
function fetchMisskeyEmojis(apikey, server,cell) {
  var instanceUrl = 'https://' + server; 
  var apiKey = apikey; 

  var apiUrl = instanceUrl + '/api/admin/emoji/list';
  var last = getLastIdFromSpreadsheet(cell);

  if(last){
    var options = {
      'method': 'GET',
      'headers' : {'Content-Type': 'application/json'},
      'payload':JSON.stringify({i : apiKey, sinceId : last, limit : 20}) 
    };
  }
  else {
    var options = {
      'method': 'GET',
      'headers' : {'Content-Type': 'application/json'},
      'payload':JSON.stringify({i : apiKey, limit : 20})
    };
  }

  var response = UrlFetchApp.fetch(apiUrl, options);
  var responseData = JSON.parse(response.getContentText());
  var newText = '';

  for (var i = 0; i < responseData.length; i++) {
    var emoji = responseData[i];
    var name = emoji.name;
    var id = emoji.id;

    newText += ':' + name + ': `' + name + '`\n';
    var lastId = id;
  }

  if(newText){
    postToMisskey(newText, {server: server, token: apikey})
    // 最後の要素のidを取得して保存
    saveLastIdToSpreadsheet(lastId,cell);
  }
}

//misskeyに投稿する
function postToMisskey(text, options) {
  return UrlFetchApp.fetch(
    `https://${options.server}/api/notes/create`, 
    {
      'method': 'POST',
      'headers' : {'Content-Type': 'application/json'},
      'payload':JSON.stringify({i : options.token, text: text})
    }
  );
}

//実行関数
function execTrigger(){
  fetchMisskeyEmojis('APIキー','ドメイン','A1');
}
```
### 変更箇所
1. 一番下の実行関数のところの`fetchMisskeyEmojis('APIキー','ドメイン','A1');`のところに作り方の2で用意したアクセストークンと動かすサーバーのドメインを入力してください。複数サーバの絵文字お知らせbotを動かす場合はこの行をコピペして最後のA1に別のセルを指定してください。

2. 前回の絵文字のidをスプレッドシートのA1に記憶しておき次回更新時にそれをsinceIdに入れてそれ以降に登録した絵文字を結果として出力するようにしています。
初回時にセルが空だと最新50の絵文字を取得することになるのですが件数が多いと文字数制限に引っかかる可能性があるのでその場合は`'payload':JSON.stringify({i : apiKey, sinceId : last, limit : 50})`の数値を適宜変更してください

### 投稿内容を伏せたい場合
postToMisskeyをこれにしてください
```javascript
//misskeyに投稿する
function postToMisskey(text, options) {
  var cwText = "絵文字が追加されました"; // CWの内容
  return UrlFetchApp.fetch(
    `https://${options.server}/api/notes/create`, 
    {
      'method': 'POST',
      'headers' : {'Content-Type': 'application/json'},
      'payload':JSON.stringify({i : options.token, text: text, cw:cwText})
    }
  );
}

```

### 参考文献
- [【コピペでOK】GoogleAppsScriptを使ってMisskeyに投稿する方法｜なおしむ
](https://note.com/naosim/n/n434e182e351c) 投稿部分はこちらを参考にしました
- [Google App ScriptとGoogleスプレッドシートを連携させる | エクスチュア株式会社ブログ](https://ex-ture.com/blog/2022/12/21/google-app-script%E3%81%A8google%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B/) Google App Scriptの操作についてはこのページが詳しいです
- [admin/emoji/list | Misskey Hub](https://misskey-hub.net/docs/api/endpoints/admin/emoji/list.html) 使用したAPIに関するドキュメントはこちら