# [メタ情報] # 識別子: Telegramを起動するpy_exe # 補足: # [/メタ情報] 要約: このテキストは、TelegramボットとGoogle Gemini API連携に関するPythonコードと、その運用時のトラブルシューティングを説明しています。 トラブルシューティングでは、まず「409 Conflictエラー」について、原因は既存ボットプロセスの重複とし、`pkill`によるプロセス終了かWebhookリセットで対処可能とします。次に「404 Model Not Foundエラー」は、Geminiモデル名の変更が原因であり、`genai.list_models()`で最新モデル(例: `'models/gemini-flash-latest'`)に更新して解決すると解説します。 コードは、ユーザーからのテキストメッセージを新しいGeminiモデル(`'models/gemini-flash-latest'`)に送り、その応答を返すシンプルな機能を提供。ログレベルを`INFO`から`WARNING`に変更し、冗長なログを抑制しています。エラー発生時のユーザーへのフィードバックも実装されており、ボットは「生存確認モード」として全てのメッセージに対応して動作します。 ``` import os import logging from dotenv import load_dotenv from telegram import Update from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes import google.generativeai as genai # ============================================================================== # Summary / トラブルシューティング要約 # 将来同じ現象が起きた際、AIが自律的に対処するための記録 # # 1. 409 Conflict エラー (terminated by other getUpdates request) # - 原因: 既に別のbot.pyプロセスがバックグラウンドや他ターミナル等で稼働中。 # - 対処: `pkill -f "python3 bot.py"` 等で既存プロセスを強制終了する。 # または `bot.delete_webhook(drop_pending_updates=True)` でWebhook設定とPending状態をリセットする。 # # 2. 404 Model Not Found (gemini-1.5-flash is not found) # - 原因: Gemini API側のモデル名変更・統廃合により、旧名モデルがAPIから取得できなくなったため。 # - 対処: `genai.list_models()` で現時点で有効なモデル名を検索し、最新の安定版フラッシュモデル # (例: 'gemini-flash-latest') に修正して実行する。 # ============================================================================== # 1. ログの設定 # 【修正箇所】INFOからWARNINGに変更し、数秒ごとの「通信OK」という記録を止める logging.basicConfig(level=logging.WARNING) logger = logging.getLogger(__name__) # 2. .env読み込み load_dotenv() TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") KEY = os.getenv("GEMINI_API_KEY") # 3. Geminiの設定(標準の安定窓口を使用) genai.configure(api_key=KEY) async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE): """機能をすべて捨て、テキストのやり取りだけに集中する""" if update.message is None: return user_text = update.message.text or update.message.caption if not user_text: await update.message.reply_text("⚠️ 現在はテキストメッセージ(またはキャプション付き画像)のみ対応しています。") return # Telegramに「入力中...」を表示 await context.bot.send_chat_action(chat_id=update.effective_chat.id, action='typing') try: # 現行のフラッシュモデルである 'models/gemini-flash-latest' に変更 model = genai.GenerativeModel('models/gemini-flash-latest') # 応答の生成(引数を一切使わず、標準の窓口を通します) response = model.generate_content(user_text) if response.text: await update.message.reply_text(response.text) else: await update.message.reply_text("⚠️ 接続はできましたが、返信が空でした。") except Exception as e: logger.error(f"エラー: {e}") await update.message.reply_text(f"復旧作業中ですが、エラーです😥:\n{e}") if __name__ == '__main__': # すべてのメッセージに反応する構成 application = ApplicationBuilder().token(TOKEN).build() application.add_handler(MessageHandler(filters.ALL, handle_message)) logger.info("M1Macリモコン、全ての装飾を捨てて『生存確認モード』で起動。") application.run_polling() ```