{"id":47673884,"url":"https://github.com/amiewa/mi_mia","last_synced_at":"2026-06-07T02:05:22.968Z","repository":{"id":345671324,"uuid":"1182168601","full_name":"amiewa/mi_mia","owner":"amiewa","description":"A Misskey bot Mia","archived":false,"fork":false,"pushed_at":"2026-06-07T00:46:38.000Z","size":114,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-07T02:05:20.431Z","etag":null,"topics":["google-apps-script","misskey-bot"],"latest_commit_sha":null,"homepage":"https://mojimoji.date/@mia","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amiewa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-15T06:07:04.000Z","updated_at":"2026-06-07T00:44:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/amiewa/mi_mia","commit_stats":null,"previous_names":["amiewa/mi_mia"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/amiewa/mi_mia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiewa%2Fmi_mia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiewa%2Fmi_mia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiewa%2Fmi_mia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiewa%2Fmi_mia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amiewa","download_url":"https://codeload.github.com/amiewa/mi_mia/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiewa%2Fmi_mia/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34006053,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-07T02:00:07.652Z","response_time":124,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["google-apps-script","misskey-bot"],"created_at":"2026-04-02T13:15:28.123Z","updated_at":"2026-06-07T02:05:22.963Z","avatar_url":"https://github.com/amiewa.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Misskey Bot Mia(みあ)\n\n**Misskey 用サーバーレス bot — Google Apps Script + Google スプレッドシートで動作**\n\n---\n\n## 概要\n\n- Mia(みあ)はMisskeyで動作するキャラクターBotです。Google Apps Script（GAS）で動作するため、サーバーの用意は不要です。設定・台詞・ユーザー管理はすべて Google スプレッドシートで行います。\n\n- LLM（AI）はオプションです。`AI_PROVIDER = none` のままでも定期投稿・リアクション・星座占い・フォローバックなどの主要機能が動作します。\n\n- [Misskey](https://github.com/misskey-dev/misskey) 2025.12.2 以降で動作を確認しています。\n### 特徴\n\n- **ゼロコスト**: Google 無料枠のみで完結（GAS 実行時間: 約 6〜17 分/日 = 上限 90 分の最大 19%）\n- **スプレッドシート駆動**: 設定・台詞・ログがすべてシートで確認・編集できる\n- **LLM フォールバック**: AI が使えない状況でも定型文・スコアベースで全機能が動作する\n- **りいな互換設計**: [りいな](https://github.com/amiewa/mi_riina) と設定キー体系・機能を対称に設計\n\n---\n\n## 機能一覧\n\n| 機能 | トリガー | LLM | デフォルト |\n|------|---------|-----|----------|\n| スケジュール投稿 | 1時間ごと | — | 有効 |\n| ランダム投稿 | 1時間ごと | — | 有効 |\n| 曜日別投稿 | 1時間ごと | — | 有効 |\n| イベント投稿（記念日） | 1時間ごと | — | 有効 |\n| TL 連動投稿 | 1時間ごと | 選択可（`ai`モード時。`template`モードではLLM不要） | 有効 |\n| 投票投稿 | 1時間ごと | — | 有効 |\n| 自動リアクション | 1時間ごと | — | 有効 |\n| 星座占い | 1時間ごと | 選択可 | 無効 |\n| メンション返信 | Webhook | 選択可（`ai`モード時。`no_ai`モードではキーワード応答→定型文） | 有効 |\n| キーワード応答リプライ | Webhook | — | 有効 |\n| ニックネーム登録 | Webhook | — | 有効 |\n| フォローバック | Webhook | — | 有効 |\n| キーワードフォローバック | Webhook | — | 有効 |\n| フォロー同期・自動解除 | 日次 | — | 無効（要明示有効化） |\n| 自己投稿の自動削除 | 日次 | — | 無効（要明示有効化） |\n| 台詞自動生成 | 手動メニュー | 必須 | — |\n| 設定バリデーション | 手動メニュー | — | — |\n\n---\n\n## 必要なもの\n\n- Google アカウント（Gmail）\n- Misskey アカウント（bot 用トークン）\n- LLM API キー（使用する場合のみ）\n  - Gemini: [Google AI Studio](https://aistudio.google.com/)\n  - OpenRouter: [openrouter.ai](https://openrouter.ai/)\n  - Ollama: [ollama.com](https://ollama.com/)（Cloud アカウント）\n- Node.js v18 以上（clasp でローカル開発する場合のみ）\n\n---\n\n## セットアップ\n\n### 1. スプレッドシートと GAS プロジェクトを作成する\n\n1. [Google スプレッドシート](https://sheets.google.com/) を新規作成する\n2. メニューの「拡張機能」→「Apps Script」を開く\n3. プロジェクト名を `mi_mia` などに変更する\n\n### 2. スクリプトファイルを配置する\n\nGAS エディタで以下の 5 ファイルを作成し、それぞれ `src/` 配下の内容を貼り付ける。\n\n| ファイル名 | 内容 |\n|-----------|------|\n| `Core.gs` | 設定読込・LLM・Misskey API・NGフィルタ |\n| `Features.gs` | 全投稿機能・mainDispatcher・占い・フォロー同期 |\n| `Webhook.gs` | Webhook 受信・返信・フォローバック |\n| `Setup.gs` | 初期設定・バリデーション・メニュー |\n| `AutoGenerator.gs` | AI を使ったシート別台詞自動生成 |\n\n`appsscript.json` は「プロジェクトの設定」→「appsscript.json ファイルをエディタで表示する」を有効にしてから `src/appsscript.json` の内容で上書きする。\n\n\u003e **clasp を使う場合**: [clasp でのローカル開発](#clasp-でのローカル開発)を参照してください。\n\n### 3. シートを初期化する\n\n1. スプレッドシートを開く（GAS エディタではなく）\n2. メニューに「みあbot」が表示されていない場合はページを再読み込みする\n3. 「みあbot」→「初期設定（シート作成）」を実行する\n4. 16 シートと初期データが自動作成される\n\n### 4. 機密情報を設定する\n\n機密情報の設定方法は 2 つあります。\n\n**方法 A: スプレッドシートメニューから設定する（推奨）**\n\nスプレッドシートのメニューから「みあbot」→「APIトークン管理」を選択し、画面の指示に従って各キーを設定する。設定状況（設定済み/未設定）が確認できます。\n\n**方法 B: GAS エディタから直接設定する**\n\nGAS エディタ左サイドバーの「プロジェクトの設定」→「スクリプト プロパティ」から以下を追加する。\n\n| キー | 値 | 備考 |\n|-----|-----|------|\n| `MISSKEY_TOKEN` | Misskey のアクセストークン | 必須 |\n| `GEMINI_API_KEY` | Gemini API キー | `AI_PROVIDER=gemini` 時のみ |\n| `OLLAMA_API_KEY` | Ollama API キー | `AI_PROVIDER=ollama` 時のみ |\n| `OLLAMA_BASE_URL` | `https://ollama.com` | Ollama Cloud のデフォルト値 |\n| `OPENROUTER_API_KEY` | OpenRouter API キー | `AI_PROVIDER=openrouter` 時のみ |\n| `YAHOO_CLIENT_ID` | Yahoo テキスト解析 API の Client ID | `TIMELINE_POST_KEYWORD_SOURCE=yahoo` または `POLL_KEYWORD_SOURCE=yahoo` 時のみ |\n\n\u003e **Misskey トークンの作成**: Misskey の「設定」→「API」→「アクセストークンの発行」から作成してください。必要な権限: 「ノートを見る」「ノートを作成・削除する」「フォローする・しない」「リアクションする」\n\n### 5. 設定シートを編集する\n\n「設定」シートの以下の項目を最低限設定する。\n\n| キー | 設定する値 | 備考 |\n|-----|----------|------|\n| `MISSKEY_INSTANCE` | `https://your.misskey.instance` | インスタンスの URL（末尾スラッシュ不要） |\n| `BOT_ACTIVE` | `TRUE` | bot を有効化 |\n| `AI_PROVIDER` | `none` | LLM を使わない場合は `none` のまま |\n\nその他の設定はデフォルト値のまま動作します。詳細は[設定パラメータ一覧](#設定パラメータ一覧)を参照してください。\n\n### 6. タイマートリガーを設定する\n\nGAS エディタ左サイドバーの「トリガー」→「トリガーを追加」から設定する。\n\n| 設定項目 | 値 |\n|---------|-----|\n| 実行する関数 | `mainDispatcher` |\n| イベントのソース | 時間主導型 |\n| 時間ベースのトリガーのタイプ | 1 時間おきのタイマー |\n\n### 7. Webhook を設定する\n\nメンション返信・フォローバックを使用する場合に必要です。\n\n**GAS 側: Web アプリとしてデプロイする**\n\n1. GAS エディタの「デプロイ」→「新しいデプロイ」\n2. 種類: 「ウェブアプリ」\n3. 次のユーザーとして実行: 「自分」\n4. アクセスできるユーザー: 「全員」\n5. 「デプロイ」→ 表示される URL をコピーする（`https://script.google.com/macros/s/...`）\n\n**Misskey 側: Webhook を登録する**\n\n1. Misskey の「設定」→「Webhook」→「追加」\n2. URL: GAS でコピーした Web アプリ URL\n3. 送信するイベント: `followed`、`mention` にチェック\n\n### 8. 動作確認\n\n1. スプレッドシートのメニューから「みあbot」→「設定バリデーション」を実行する\n2. エラーがなければ「設定に問題はありません。」のトースト通知が表示される\n3. GAS エディタから `mainDispatcher` を手動実行して「エラーログ」シートにエラーが記録されないことを確認する\n\n---\n\n## clasp でのローカル開発\n\n```bash\n# 依存パッケージのインストール\nnpm install\n\n# Google アカウントにログイン\nnpx clasp login\n\n# 既存プロジェクトに接続（GAS エディタの URL から scriptId を確認）\nnpx clasp clone \u003cscriptId\u003e\n# または新規作成（スプレッドシートに紐づける場合は --parentId を指定）\nnpx clasp create --type sheets --title \"mi_mia\"\n\n# GAS へアップロード\nnpm run push\n\n# GAS からダウンロード\nnpm run pull\n\n# ファイル監視（変更を自動アップロード）\nnpm run watch\n```\n\n\u003e `\u003cscriptId\u003e` は GAS エディタの URL `https://script.google.com/home/projects/\u003cscriptId\u003e/edit` から確認できます。\n\n\u003e **Webhook 再デプロイについて**: `Webhook.gs` を変更した場合は、GAS エディタから「デプロイ」→「デプロイを管理」→「編集」→「新バージョン」で再デプロイが必要です。`Features.gs` や `Core.gs` の変更はデプロイ不要です。\n\n---\n\n## LLM プロバイダの設定\n\n「設定」シートの `AI_PROVIDER` キーで使用するプロバイダを切り替えます。機能ごとに異なるプロバイダを指定する場合は `AI_FP_*` キーで上書きできます。\n\n```\n# 設定シートの例（一部）\nAI_PROVIDER            = gemini           # デフォルトプロバイダ\nAI_FP_REPLY            = openrouter       # 返信のみ OpenRouter を使用\nAI_FP_HOROSCOPE        =                  # 空 = デフォルト (gemini) を使用\nAI_GEMINI_MODEL        = gemini-2.0-flash-lite\nAI_GEMINI_TEMPERATURE  = 1.0\nAI_GEMINI_MAX_TOKENS   = 1024\nAI_DAILY_LIMIT         = 100             # 全プロバイダ合算の日次呼び出し上限\nAI_INPUT_MAX_CHARS     = 2500            # 入力テキストの最大文字数\n```\n\n| プロバイダ | 必要な ScriptProperties |\n|-----------|----------------------|\n| `gemini` | `GEMINI_API_KEY` |\n| `ollama` | `OLLAMA_API_KEY`、`OLLAMA_BASE_URL` |\n| `openrouter` | `OPENROUTER_API_KEY` |\n| `none` | 不要 |\n\n\u003e **Ollama について**: GAS の `UrlFetchApp` はローカルネットワーク（`192.168.x.x` 等）にアクセスできません。セルフホストの Ollama を使うにはインターネット公開されたエンドポイントが必要です。`OLLAMA_BASE_URL` のデフォルトは `https://ollama.com`（Ollama Cloud）です。\n\n---\n\n## 設定パラメータ一覧\n\n「設定」シートで変更できる主要な設定キーです。すべてにデフォルト値が設定されているため、最低限 `MISSKEY_INSTANCE` と `BOT_ACTIVE` だけ設定すれば動作します。\n\n### 基本設定\n\n| キー | デフォルト | 説明 |\n|-----|----------|------|\n| `MISSKEY_INSTANCE` | — | Misskey インスタンス URL（必須） |\n| `BOT_ACTIVE` | `FALSE` | Bot の有効化 |\n| `POSTING_VISIBILITY` | `home` | 投稿の公開範囲: `public` / `home` / `followers` |\n| `POSTING_NIGHT_START` | `23` | 夜間停止の開始時刻 |\n| `POSTING_NIGHT_END` | `6` | 夜間停止の終了時刻 |\n| `AI_INPUT_MAX_CHARS` | `2500` | LLM 入力テキストの最大文字数（超過分は切り捨て） |\n| `NG_WORDS_MATCH_MODE` | `substring` | NGワード照合方式（現在は `substring` のみ対応） |\n| `NG_WORDS_EXTERNAL_URL` | （goodBadWordlist）| 外部NGワードリストの URL（1行1ワードのテキスト形式） |\n\n### 投稿設定\n\n| キー | デフォルト | 説明 |\n|-----|----------|------|\n| `SCHEDULED_POST_ENABLED` | `TRUE` | スケジュール投稿 |\n| `SCHEDULED_POST_CHANCE` | `100` | スケジュール投稿の実行確率（%） |\n| `RANDOM_POST_ENABLED` | `TRUE` | ランダム投稿 |\n| `RANDOM_POST_INTERVAL_HOURS` | `4` | 投稿間隔（時間） |\n| `RANDOM_POST_CHANCE` | `30` | 投稿確率（%） |\n| `WEEKDAY_POST_ENABLED` | `TRUE` | 曜日別投稿 |\n| `WEEKDAY_POST_CHANCE` | `30` | 投稿確率（%） |\n| `TIMELINE_POST_ENABLED` | `TRUE` | TL 連動投稿 |\n| `TIMELINE_POST_INTERVAL_HOURS` | `6` | 投稿間隔（時間） |\n| `TIMELINE_POST_CHANCE` | `70` | TL 連動投稿の実行確率（%） |\n| `TIMELINE_POST_TYPE` | `local` | TL 種別: `local` / `home` / `hybrid` / `global` |\n| `TIMELINE_POST_MODE` | `template` | TL 連動投稿モード: `template`（LLM不要）/ `ai` |\n| `TIMELINE_POST_KEYWORD_SOURCE` | `simple` | キーワード抽出方式: `simple`（正規表現+漢字連）/ `yahoo`（Yahoo形態素解析API） |\n| `EVENT_POST_ENABLED` | `TRUE` | イベント（記念日）投稿 |\n| `HOROSCOPE_ENABLED` | `FALSE` | 星座占い投稿 |\n| `HOROSCOPE_HOUR` | `7` | 占い投稿時刻 |\n| `HOROSCOPE_USE_AI` | `FALSE` | AI 占い（`FALSE` はスコアベース） |\n| `HOROSCOPE_MAX_CHARS` | `500` | AI 占い生成の最大文字数 |\n| `POLL_ENABLED` | `TRUE` | 投票投稿 |\n| `POLL_INTERVAL_HOURS` | `12` | 投稿間隔（時間） |\n| `POLL_CHANCE` | `50` | 投票投稿の実行確率（%） |\n| `POLL_EXPIRE_HOURS` | `3` | 投票締め切り時間（時間） |\n| `POLL_TIMELINE_TYPE` | `local` | 投票選択肢抽出用 TL 種別: `local` / `home` / `hybrid` / `global` |\n| `POLL_KEYWORD_SOURCE` | `simple` | 投票選択肢のキーワード抽出方式: `simple`（正規表現+漢字連）/ `yahoo`（Yahoo形態素解析API） |\n| `POLL_MODE` | `tl_word` | 投票選択肢の生成モード: `tl_word`（TL抽出）/ `static`（シートC列固定アイテム）/ `ai`（AI生成） |\n| `AI_FP_AUTOGEN` | — | 台詞自動生成専用のプロバイダ上書き（未設定時は `AI_PROVIDER` を使用） |\n\n### フォロー・返信設定\n\n| キー | デフォルト | 説明 |\n|-----|----------|------|\n| `FOLLOW_AUTO_FOLLOW_BACK` | `TRUE` | 自動フォローバック |\n| `FOLLOW_AUTO_UNFOLLOW_BACK` | `FALSE` | フォロー自動解除 |\n| `FOLLOW_UNFOLLOW_GRACE_CYCLES` | `2` | 解除までの猶予日数 |\n| `FOLLOW_KEYWORD_ENABLED` | `TRUE` | キーワードフォローバック |\n| `FOLLOW_KEYWORDS` | `フォローして,followして,相互フォロー` | フォローキーワード（カンマ区切り） |\n| `REPLY_ENABLED` | `TRUE` | メンション返信 |\n| `REPLY_MUTUAL_ONLY` | `TRUE` | 相互フォローのみ返信 |\n| `REPLY_MAX_PER_USER_PER_DAY` | `10` | 1 ユーザーあたりの日次返信上限 |\n| `REPLY_MODE` | `no_ai` | 返信モード: `no_ai`（キーワード応答→定型文）/ `ai`（LLM→キーワード応答→定型文） |\n| `NICKNAME_ENABLED` | `TRUE` | ニックネーム登録（「○○って呼んで」） |\n| `NICKNAME_MAX_LENGTH` | `20` | ニックネームの最大文字数 |\n| `REACTION_ENABLED` | `TRUE` | 自動リアクション |\n| `REACTION_MUTUAL_ONLY` | `TRUE` | 相互フォローのみリアクション |\n| `REACTION_RECENCY_MINUTES` | `30` | リアクション対象ノートの最新分数 |\n| `AFFINITY_ENABLED` | `TRUE` | 好感度システム |\n| `AFFINITY_RANK2_THRESHOLD` | `5` | 好感度ランク 2 の閾値（会話回数） |\n| `AFFINITY_RANK3_THRESHOLD` | `20` | 好感度ランク 3 の閾値（会話回数） |\n\n### メンテナンス設定\n\n| キー | デフォルト | 説明 |\n|-----|----------|------|\n| `MAINTENANCE_ENABLED` | `TRUE` | 日次メンテナンス（0時台に実行） |\n| `MAINTENANCE_CLEANUP_DAYS` | `30` | ログ・投稿履歴の保持日数 |\n| `MAINTENANCE_AUTO_DELETE_ENABLED` | `FALSE` | 自己投稿の自動削除 |\n| `MAINTENANCE_DELETE_INTERVAL_SECONDS` | `2` | 削除 API 呼び出しの間隔（秒） |\n| `MAINTENANCE_DELETE_MAX_RETRIES` | `3` | 削除失敗時のリトライ回数 |\n| `ERROR_NOTIFY_ENABLED` | `FALSE` | エラー発生時のメール通知 |\n| `ERROR_NOTIFY_EMAIL` | — | 通知先メールアドレス |\n| `CONV_MAX_TURNS` | `3` | 会話履歴の保持ターン数（0 = 無効） |\n\n---\n\n## 台詞の自動生成\n\nメニュー「みあbot \u003e 台詞の自動生成」から、シート別に AI（LLM）で台詞を一括生成できます。  \n事前に `AI_PROVIDER` を設定し、API キーを登録しておく必要があります。\n\n| シート | 件数 | 備考 |\n|--------|------|------|\n| スケジュール投稿 | 固定 24 件 | 0〜23 時 各 1 件 |\n| ランダム投稿 | 5〜30 件（既定 10） | — |\n| 曜日別 | 固定 24 件 | 曜日を選択（SUN〜SAT） |\n| イベント | 5〜30 件（既定 10） | 必須記念日を含む |\n| 投票質問文 | 5〜30 件（既定 10） | 質問+Prefix（A/B列）またはアイテム（C列）を選択 |\n| フォールバック定型文 | 5〜30 件（既定 10） | — |\n\n「クリアして生成」と「現在のリストに追加」を選択できます。  \n特定機能に別のプロバイダを使いたい場合は `AI_FP_AUTOGEN` を設定します。\n\n---\n\n## スプレッドシート構成\n\n初期設定で作成される 15 シートの概要です。\n\n| シート名 | 用途 |\n|---------|------|\n| 設定 | Bot 全設定値（Key / Value / 説明） |\n| キャラクター設定 | LLM への System Prompt と各種応答メッセージ |\n| スケジュール投稿 | 時刻指定の定型投稿（時間帯 / 投稿内容） |\n| ランダム投稿 | ランダム選択用台詞プール |\n| 曜日別 | 曜日+時刻指定投稿（時刻 / 曜日 / 台詞） |\n| イベント | 日付指定の記念日投稿（MM/dd / イベント名 / 投稿内容 / 投稿済み） |\n| 投票質問文 | アンケートの質問(A列) / 接頭辞Prefix(B列) / 選択肢アイテム(C列) |\n| リアクション | キーワード→絵文字のルール定義 |\n| フォールバック定型文 | LLM 失敗時・NGワード検出時の代替返信 |\n| NGワード | 除外ワードリスト（1行1ワード） |\n| ユーザー管理 | 好感度追跡（UserId / 最終会話日時 / 総会話数 / ニックネーム） |\n| ダッシュボード | 日次統計（投稿数・返信数・リアクション数・フォローバック数・AI 使用数・エラー数・URL Fetch 概算・アンフォロー数） |\n| エラーログ | エラー記録（日時 / 関数名 / エラー内容） |\n| 投稿履歴 | 自己投稿削除用（noteId / 投稿日時 / 投稿種別） |\n| フォロー管理 | フォロー同期用（userId / isFollower / iAmFollowing / missingCount） |\n| キーワード応答 | メンション返信用キーワード→返信文マッピング（キーワード / 親愛度 / メッセージ） |\n\n---\n\n## GAS の制約と運用規模\n\nみあはフォロー/フォロワー各 100 前後、最大 300 程度の小規模運用を想定しています。\n\n| GAS の制限 | 上限値 | みあの想定消費 |\n|-----------|--------|-------------|\n| スクリプト総実行時間 | 90 分/日 | 約 6〜17 分/日 |\n| URL Fetch 回数 | 20,000 回/日 | 約 292 回/日 |\n| 実行時間（1 回あたり） | 6 分 | `isTimeSafe()` ガードで対応 |\n\n大規模運用（フォロワー 500 以上等）には [りいな](https://github.com/amiewa/mi_riina)（Python/Docker/VPS）を推奨します。\n\n---\n\n## テスト\n\n```bash\nnpm test\n```\n\n`tests/core/` 配下に GAS 環境に依存しない単体テスト（Jest）があります。\n\n| テストファイル | カバー範囲 |\n|-------------|----------|\n| `tests/core/cleanNoteText.test.js` | MFM・URL・コードブロック等の除去 |\n| `tests/core/containsNGWord.test.js` | NGワード部分一致判定 |\n| `tests/core/isNightTime.test.js` | 夜間判定（日付またぎ対応） |\n| `tests/core/isTimeSafe.test.js` | 実行時間ガード |\n| `tests/core/conversationHistory.test.js` | 会話履歴の保存・取得・上限管理 |\n\n---\n\n## トラブルシューティング\n\n**Bot が投稿しない**\n- 「設定」シートの `BOT_ACTIVE` が `TRUE` になっているか確認する\n- `MISSKEY_INSTANCE` と `MISSKEY_TOKEN`（ScriptProperties）が正しく設定されているか確認する\n- 「みあbot」→「設定バリデーション」でエラーがないか確認する\n- 現在の時刻が `POSTING_NIGHT_START` 〜 `POSTING_NIGHT_END` の範囲内ではないか確認する\n- GAS エディタの「実行」→「関数を実行」から `mainDispatcher` を手動実行してエラーを確認する\n\n**Webhook が動作しない（メンション返信・フォローバックが機能しない）**\n- GAS の Web アプリが「全員」アクセス可能でデプロイされているか確認する\n- Misskey の Webhook 設定で URL が正しく設定されているか確認する\n- `Webhook.gs` を変更した後に再デプロイ（新バージョン）を実施したか確認する\n\n**LLM が動作しない**\n- 使用プロバイダの API キーが ScriptProperties に正しく設定されているか確認する\n- 「設定」シートの `AI_PROVIDER` のスペルを確認する（`gemini` / `ollama` / `openrouter` / `none`）\n- 「ダッシュボード」シートの AI 数列を確認し、`AI_DAILY_LIMIT` に達していないか確認する\n\n**エラーの確認方法**\n- 「エラーログ」シートに関数名とエラー内容が記録される\n- GAS エディタ左サイドバーの「実行数」からも確認できる\n- `ERROR_NOTIFY_ENABLED = TRUE` と `ERROR_NOTIFY_EMAIL` を設定するとメールで通知される\n\n## 参考にしたMisskey Bot\n本プロジェクトは、以下のプロジェクトを参考にさせていただきました。深く感謝申し上げます。\n- [藍ちゃん](https://github.com/syuilo/ai) \n\n## 参照プロジェクト\n- [goodBadWordlist](https://github.com/sayonari/goodBadWordlist) NGワードリストとして利用\n\n## 関連プロジェクト\n- [Misskey Bot Riina(りいな)](https://github.com/amiewa/mi_riina) — Python/Docker 版。WebSocket ストリーミング・SQLite・ワードクラウド対応\n\n## ライセンス\n本プロジェクトは [MIT License](LICENSE) です。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famiewa%2Fmi_mia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famiewa%2Fmi_mia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famiewa%2Fmi_mia/lists"}