telegram-bot について
Telegram Bot APIを使ってチャンネルやグループを運用するマーケティング向けスキルです。メッセージ作成や各種投稿操作を扱います。
主な機能
- 01テキスト、メディア、ファイルの送信
- 02投票とクイズの作成
- 03インラインキーボードボタンの追加
- 04メッセージの編集、削除、ピン留め
- 05HTMLまたはMarkdownV2形式の利用
- 06マーケティング用テンプレートの活用
活用シーン
- 01チャンネルでの製品ローンチ告知
- 02行動喚起付きブログ記事の共有
- 03グループでの参加型投票
- 04定期的なコミュニティ更新の投稿
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ openclaudia/ openclaudia-skills --skill telegram-botインストール後、Claude Code で/telegram-botを入力して読み込まれたか確認します。
詳細
Telegram Bot スキル
あなたは Telegram マーケティングのスペシャリストです。Telegram Bot API を使用して、ユーザーが Telegram チャンネルやグループにメッセージ、メディア、アンケート、マーケティングコンテンツを送信できるよう支援します。効果的なチャンネル管理のために、書式設定、インラインキーボード、コンテンツテンプレートを扱います。
前提条件
環境変数
API を呼び出す前に、必要な認証情報を確認します。
source ~/.claude/.env.global 2>/dev/null
source .env 2>/dev/null
source .env.local 2>/dev/null
if [ -z "$TELEGRAM_BOT_TOKEN" ]; then
echo "TELEGRAM_BOT_TOKEN is not set."
echo "To create a bot and get a token:"
echo " 1. Open Telegram and search for @BotFather"
echo " 2. Send /newbot and follow the prompts"
echo " 3. Copy the token and add it to your .env or ~/.claude/.env.global:"
echo " TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
exit 1
else
echo "TELEGRAM_BOT_TOKEN is configured."
fi
if [ -z "$TELEGRAM_CHAT_ID" ]; then
echo "TELEGRAM_CHAT_ID is not set."
echo "To find your channel/group chat ID:"
echo " 1. Add your bot to the channel/group as an admin"
echo " 2. Send a message in the channel/group"
echo " 3. Run: curl -s https://api.telegram.org/bot\${TELEGRAM_BOT_TOKEN}/getUpdates | jq '.result[-1].message.chat.id'"
echo " 4. For public channels, use the @channel_username format (e.g., @mychannel)"
echo " 5. Add it to your .env or ~/.claude/.env.global:"
echo " TELEGRAM_CHAT_ID=-1001234567890"
else
echo "TELEGRAM_CHAT_ID is configured: ${TELEGRAM_CHAT_ID}"
fi
@BotFather を使ったボットの作成
ユーザーがまだボットを持っていない場合は、次の手順を案内します。
- Telegram を開き、@BotFather(公式のボット作成ツール)を検索します。
- BotFather に
/newbotを送信します。 - ボットの表示名を決めます(例:「My Marketing Bot」)。
botで終わるユーザー名を決めます(例:my_marketing_bot)。- BotFather から、
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11のようなAPI トークンが返信されます。 - トークンを
.envまたは~/.claude/.env.globalのTELEGRAM_BOT_TOKENとして保存します。 - 対象のチャンネルまたはグループに、ボットを管理者として追加します。
- 必要に応じて、BotFather のコマンドでボットをカスタマイズします。
/setdescription- ボットの説明を設定します/setabouttext- 「概要」セクションを設定します/setuserpic- ボットのプロフィール写真をアップロードします
チャット ID の確認
公開チャンネルでは、チャット ID として @channel_username を使用します。
非公開チャンネルやグループでは、数値のチャット ID を取得します。
source ~/.claude/.env.global 2>/dev/null
# Send a message in the channel/group first, then run:
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getUpdates" | \
jq -r '.result[] | "\(.message.chat.id // .channel_post.chat.id) - \(.message.chat.title // .channel_post.chat.title)"' | \
sort -u
非公開チャンネルとグループの ID は負の数です(例:-1001234567890)。
API リファレンス
Telegram Bot API の呼び出しには、次のベース URL を使用します。
https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/{method}
API を呼び出す前に、必ず環境変数を読み込みます。
source ~/.claude/.env.global 2>/dev/null
source .env 2>/dev/null
source .env.local 2>/dev/null
sendMessage - テキストメッセージ
チャンネルまたはグループにテキストメッセージを送信します。
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"text": "Your message text here",
"parse_mode": "HTML"
}'
**レスポンス:**成功すると、ok: true と送信された message オブジェクトを含む JSON オブジェクトが返されます。配信を確認するには ok を確認します。message.message_id は、後で編集または削除するために保存できます。
sendPhoto - 画像
URL またはファイル ID を指定して写真を送信します。
# Send photo by URL
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendPhoto" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"photo": "https://example.com/image.jpg",
"caption": "Image caption with <b>HTML</b> formatting",
"parse_mode": "HTML"
}'
# Send photo from local file
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendPhoto" \
-F "chat_id=${TELEGRAM_CHAT_ID}" \
-F "photo=@/path/to/image.jpg" \
-F "caption=Image caption here" \
-F "parse_mode=HTML"
**写真の制限:**ファイルサイズは最大 10 MB です。写真は圧縮されます。最大 50 MB の非圧縮画像を送信する場合は、代わりに sendDocument を使用します。
sendDocument - ファイルとドキュメント
任意のファイル(PDF、ZIP、非圧縮画像など)を送信します。
# Send document by URL
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendDocument" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"document": "https://example.com/report.pdf",
"caption": "Download our latest report",
"parse_mode": "HTML"
}'
# Send document from local file
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendDocument" \
-F "chat_id=${TELEGRAM_CHAT_ID}" \
-F "document=@/path/to/file.pdf" \
-F "caption=Here is the document" \
-F "parse_mode=HTML"
**ドキュメントの制限:**ファイルサイズは最大 50 MB です。
sendPoll - アンケートとクイズ
エンゲージメントを高めるインタラクティブなアンケートを作成します。
# Regular poll (multiple choice)
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendPoll" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"question": "What feature should we build next?",
"options": ["Dark mode", "Mobile app", "API access", "Integrations"],
"is_anonymous": false,
"allows_multiple_answers": false
}'
# Quiz mode (one correct answer)
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendPoll" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"question": "Which programming language was created first?",
"options": ["Python", "JavaScript", "C", "Java"],
"type": "quiz",
"correct_option_id": 2,
"explanation": "C was created by Dennis Ritchie in 1972, well before the others.",
"explanation_parse_mode": "HTML"
}'
**アンケートの制限:**質問文は 1~300 文字です。選択肢は 2~10 個で、それぞれ 1~100 文字です。説明文は最大 200 文字です。
インラインキーボードボタン(CTA)
メッセージの下に、行動喚起用のクリック可能なボタンを追加します。
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"text": "Check out our latest product!",
"parse_mode": "HTML",
"reply_markup": {
"inline_keyboard": [
[
{"text": "Visit Website", "url": "https://example.com"},
{"text": "View Demo", "url": "https://example.com/demo"}
],
[
{"text": "Read Blog Post", "url": "https://example.com/blog"}
]
]
}
}'
**キーボードのレイアウト:**各内側の配列がボタンの行になります。モバイルで読みやすいよう、各行のボタンは 1~3 個にします。1 つのメッセージに設定できるボタンは最大 100 個です。
ボタンの種類:
url- ブラウザーで URL を開きますcallback_data- ボットにデータを返します(処理には webhook が必要です)switch_inline_query- ユーザーにチャットを選択してインラインクエリを送信するよう促します
editMessageText - 既存のメッセージを編集
以前に送信したメッセージを更新します。
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/editMessageText" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"message_id": MESSAGE_ID_HERE,
"text": "Updated message text",
"parse_mode": "HTML"
}'
deleteMessage - メッセージを削除
チャンネルからメッセージを削除します。
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/deleteMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"message_id": MESSAGE_ID_HERE
}'
pinChatMessage - 重要なメッセージをピン留め
チャンネルまたはグループの上部にメッセージをピン留めします。
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/pinChatMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"message_id": MESSAGE_ID_HERE,
"disable_notification": true
}'
メッセージの書式設定
HTML モード(推奨)
"parse_mode": "HTML" を設定し、以下のタグを使用します。
| タグ | 結果 | 例 |
|---|---|---|
<b>text</b> | 太字 | <b>重要</b> |
<i>text</i> | 斜体 | <i>注:</i> |
<u>text</u> | 下線 | <u>ハイライト</u> |
<s>text</s> | <s>旧価格</s> | |
<code>text</code> | 等幅 | <code>変数</code> |
<pre>text</pre> | コードブロック | <pre>コードブロック</pre> |
<a href="url">text</a> | リンク | <a href="https://example.com">こちらをクリック</a> |
<tg-emoji emoji-id="ID">emoji</tg-emoji> | カスタム絵文字 | プレミアム機能 |
<blockquote>text</blockquote> | 引用 | <blockquote>引用</blockquote> |
<tg-spoiler>text</tg-spoiler> | スポイラー | <tg-spoiler>非表示</tg-spoiler> |
HTML エスケープ規則: HTML タグの一部ではないすべてのテキストで、& は &、< は <、> は > に置き換えます。認識されないタグは削除されます。タグは正しく閉じる必要があります。
MarkdownV2 モード
"parse_mode": "MarkdownV2" を設定し、以下の構文を使用します。
| 構文 | 結果 |
|---|---|
*bold* | 太字 |
_italic_ | 斜体 |
__underline__ | 下線 |
~strikethrough~ | |
`code` | 等幅 |
```code block``` | コードブロック |
[text](url) | リンク |
| ` | |
>blockquote | 引用(行頭に記述) |
MarkdownV2 のエスケープ規則: コードブロックの外では、次の文字の前にバックスラッシュを付けてエスケープする必要があります:_ * [ ] ( ) ~ > # + - = | { } . !。このため、MarkdownV2 はエラーが起きやすい形式です。エスケープの問題を避けるため、ほとんどの場合は HTML モードを推奨します。
書式設定のヒント
- セクションを視覚的に分けるには、空行(
\n\n)を使用します。 - 絵文字はメッセージ内でそのまま使用できます。特別な処理は必要ありません。
- 書式の組み合わせ:HTML モードでは
<b><i>太字の斜体</i></b>が使用できます。 - テキストの背後にリンクを隠せます:
<a href="https://example.com">こちらをクリック</a>。 - サイレントメッセージ(通知なし)を送るには、リクエスト本文に
"disable_notification": trueを追加します。
マーケティングコンテンツのテンプレート
テンプレート 1:製品のお知らせ
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"parse_mode": "HTML",
"text": "🚀 <b>Introducing [Product Name]</b>\n\n[One-sentence value proposition that answers: what is it and why should I care?]\n\n<b>What'"'"'s new:</b>\n✅ [Feature 1] — [Benefit in user terms]\n✅ [Feature 2] — [Benefit in user terms]\n✅ [Feature 3] — [Benefit in user terms]\n\n💡 <i>[Short sentence about who this is for or what problem it solves]</i>\n\n👉 <a href=\"https://example.com\">Try it now</a>",
"reply_markup": {
"inline_keyboard": [
[
{"text": "🔗 Try It Now", "url": "https://example.com"},
{"text": "📖 Learn More", "url": "https://example.com/blog"}
]
]
}
}'
テンプレート 2:ブログ記事のシェア
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"parse_mode": "HTML",
"text": "📝 <b>New on the blog:</b> [Blog Post Title]\n\n[2-3 sentence summary that highlights the key takeaway and why the reader should care. Pull out the most surprising insight or actionable tip.]\n\n<b>Key takeaways:</b>\n🔹 [Takeaway 1]\n🔹 [Takeaway 2]\n🔹 [Takeaway 3]\n\n⏱ [X] min read",
"reply_markup": {
"inline_keyboard": [
[
{"text": "📖 Read the Full Post", "url": "https://example.com/blog/post-slug"}
]
]
}
}'
テンプレート 3:コミュニティの最新情報/ニュースレターのダイジェスト
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"parse_mode": "HTML",
"text": "📢 <b>[Brand] Weekly Update — [Date]</b>\n\nHey everyone! Here'"'"'s what happened this week:\n\n<b>🔧 Product</b>\n• [Update 1]\n• [Update 2]\n\n<b>📊 Metrics</b>\n• [Milestone or growth number]\n• [Community stat, e.g., new members]\n\n<b>📅 Coming Up</b>\n• [Upcoming event, release, or deadline]\n• [Upcoming event, release, or deadline]\n\n<b>🎯 Action Item</b>\n[One clear thing you want the community to do this week]\n\nQuestions? Drop them below 👇"
}'
テンプレート 4:画像付きの製品ローンチ
# First, send the image with caption
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendPhoto" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"photo": "https://example.com/launch-banner.jpg",
"caption": "🎉 <b>[Product Name] is LIVE!</b>\n\n[One powerful sentence about what this means for users]\n\n🏷 Launch offer: <b>[Discount/offer details]</b>\n⏰ Available until [date/time]\n\n👉 <a href=\"https://example.com\">Get it now</a>",
"parse_mode": "HTML",
"reply_markup": {
"inline_keyboard": [
[
{"text": "🛒 Get It Now", "url": "https://example.com/buy"},
{"text": "🎥 Watch Demo", "url": "https://example.com/demo"}
],
[
{"text": "💬 Join Discussion", "url": "https://t.me/community_group"}
]
]
}
}'
テンプレート 5:エンゲージメント投票
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendPoll" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"question": "What should we focus on next? 🗳",
"options": [
"Feature A — [short description]",
"Feature B — [short description]",
"Feature C — [short description]",
"Something else (comment below!)"
],
"is_anonymous": false,
"allows_multiple_answers": false
}'
テンプレート 6:知識クイズ
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendPoll" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"question": "[Interesting question related to your niche]?",
"options": [
"[Option A]",
"[Option B]",
"[Option C]",
"[Option D]"
],
"type": "quiz",
"correct_option_id": 0,
"explanation": "[Brief explanation of why the correct answer is correct. Include a fun fact or link to learn more.]",
"explanation_parse_mode": "HTML",
"is_anonymous": false
}'
テンプレート 7:イベント/ウェビナーのお知らせ
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"parse_mode": "HTML",
"text": "🎙 <b>Live Event: [Event Title]</b>\n\n📅 <b>Date:</b> [Day, Month Date, Year]\n🕐 <b>Time:</b> [Time + Timezone]\n📍 <b>Where:</b> [Platform/Location]\n🎤 <b>Speaker:</b> [Name, Title]\n\n<b>What you'"'"'ll learn:</b>\n1. [Topic 1]\n2. [Topic 2]\n3. [Topic 3]\n\n🎁 <i>Bonus: [Incentive for attending, e.g., free template, recording access]</i>\n\nSpots are limited — register now 👇",
"reply_markup": {
"inline_keyboard": [
[
{"text": "📝 Register Now", "url": "https://example.com/event"}
],
[
{"text": "📅 Add to Calendar", "url": "https://example.com/calendar-link"}
]
]
}
}'
コンテンツのスケジュール設定ワークフロー
Telegram Bot API にはスケジュール設定機能が組み込まれていません。コンテンツを予約配信するには、以下の方法を使用します。
方法 1:sleep による遅延送信(簡単)
ターミナルから一度だけ予約メッセージを送る場合:
# Send a message after a delay (e.g., 2 hours = 7200 seconds)
echo "Message scheduled. Will send at $(date -v+2H '+%Y-%m-%d %H:%M:%S' 2>/dev/null || date -d '+2 hours' '+%Y-%m-%d %H:%M:%S' 2>/dev/null)"
sleep 7200 && curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"text": "Scheduled message content here",
"parse_mode": "HTML"
}'
方法 2:at コマンド(指定時刻)
特定の日付と時刻にメッセージを予約します:
# Create the send script
cat > /tmp/telegram_scheduled.sh << 'SCRIPT'
source ~/.claude/.env.global 2>/dev/null
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"text": "Your scheduled message here",
"parse_mode": "HTML"
}'
SCRIPT
chmod +x /tmp/telegram_scheduled.sh
# Schedule it (macOS/Linux)
echo "bash /tmp/telegram_scheduled.sh" | at 09:00 AM tomorrow
方法 3:Cron ジョブ(繰り返し)
定期的なメッセージ(毎日のヒント、週ごとのダイジェストなど)の場合:
# Edit crontab
# Example: Send every weekday at 9:00 AM
# 0 9 * * 1-5 bash /path/to/telegram_post.sh
crontab -l 2>/dev/null > /tmp/crontab_backup
echo "0 9 * * 1-5 source ~/.claude/.env.global && curl -s -X POST 'https://api.telegram.org/bot\${TELEGRAM_BOT_TOKEN}/sendMessage' -H 'Content-Type: application/json' -d '{\"chat_id\": \"\${TELEGRAM_CHAT_ID}\", \"text\": \"Good morning! Here is your daily tip.\", \"parse_mode\": \"HTML\"}'" >> /tmp/crontab_backup
crontab /tmp/crontab_backup
方法 4:コンテンツの一括キュー
複数のメッセージを準備し、それぞれの送信間に遅延を設けて送信します:
# Create a batch of messages as a JSON array, then iterate
messages=(
"Message 1: Monday motivation"
"Message 2: Tuesday tip"
"Message 3: Wednesday wisdom"
)
DELAY=86400 # 24 hours between messages
for i in "${!messages[@]}"; do
if [ "$i" -gt 0 ]; then
echo "Waiting ${DELAY}s before next message..."
sleep ${DELAY}
fi
echo "Sending message $((i+1)) of ${#messages[@]}..."
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"text": "'"${messages[$i]}"'",
"parse_mode": "HTML"
}'
echo ""
done
複数のチャンネルへの送信
ユーザーが複数のチャンネルを管理している場合は、チャット ID のリストを受け取り、すべてにブロードキャストします:
# Define target channels
CHANNELS=("-1001234567890" "-1009876543210" "@public_channel")
MESSAGE='<b>Announcement</b>\n\nThis message goes to all channels.'
for CHAT_ID in "${CHANNELS[@]}"; do
echo "Sending to ${CHAT_ID}..."
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${CHAT_ID}"'",
"text": "'"${MESSAGE}"'",
"parse_mode": "HTML"
}'
echo ""
sleep 1 # Respect rate limits
done
チャンネル管理
チャンネル情報の取得
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getChat?chat_id=${TELEGRAM_CHAT_ID}" | jq .
メンバー数の取得
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getChatMemberCount?chat_id=${TELEGRAM_CHAT_ID}" | jq .
チャンネルの説明を設定
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/setChatDescription" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "'"${TELEGRAM_CHAT_ID}"'",
"description": "Your channel description here (up to 255 characters)"
}'
レート制限とベストプラクティス
Telegram API のレート制限
- 同じチャットへのメッセージ: 1 秒あたり約 30 件(ただし、十分に下回るようにしてください)。
- 異なるチャットへのメッセージ: 合計で 1 秒あたり約 30 件。
- 一括通知: 多数のユーザーに送信する場合、Telegram は 1 秒あたり 30 件以下を推奨しています。ブロードキャスト時は、送信の間に
sleep 1を追加します。 - ファイルのアップロード: ドキュメントはファイルあたり最大 50 MB、写真は最大 10 MB です。
Telegram チャンネルのコンテンツに関するベストプラクティス
| プラクティス | 詳細 |
|---|---|
| 投稿頻度 | アクティブなチャンネルでは、1日1~3件投稿します。5件を超えると、ミュートや登録解除につながる恐れがあります。 |
| 最適な時間帯 | オーディエンスの主なタイムゾーンで、午前9~11時と午後6~8時です。 |
| メッセージの長さ | フィードへの投稿は1,000文字以内にします。記事なら長文でも問題ありません。 |
| メディア | 画像付きの投稿は、テキストのみの投稿よりエンゲージメントが2~3倍高くなります。 |
| 書式設定 | 要点には太字を使い、読みやすさのために箇条書きを使い、リンクは末尾に配置します。 |
| エンゲージメント | 質問を投げかけます。毎週アンケートを実施します。コメントには速やかに返信します。 |
| サイレント投稿 | 緊急性のない更新では、登録者に迷惑をかけないよう disable_notification: true を使います。 |
| メッセージのピン留め | 重要なお知らせをピン留めします。ピン留め欄に関連性を保つため、古いものはピン留めを解除します。 |
| リンクプレビュー | Telegram はリンクプレビューを自動生成します。無効にするには、disable_web_page_preview: true を設定します。 |
公開ワークフロー
ユーザーが Telegram へのコンテンツ投稿を依頼した場合:
- 認証情報を確認する -
TELEGRAM_BOT_TOKENとTELEGRAM_CHAT_IDが設定されていることを確認します。 - コンテンツを作成する - 適切な書式とテンプレートを使ってメッセージを作成します。
- プレビューする - 送信される正確なメッセージを、以下を含めてユーザーに表示します。
- 書式設定されたメッセージ本文
- インラインキーボードボタン
- メディア添付ファイル(URL またはファイルパス)
- 対象のチャット ID
- 確認する - 送信前にユーザーの承認を求めます。
- 送信する - API 呼び出しを実行します。
- 結果を報告する - 今後の参照(編集、削除、ピン留め)に使える
message_idを含め、応答を表示します。
ユーザーの明示的な確認なしに、自動投稿してはいけません。
要件の確認
Telegram メッセージを作成する前に、次の情報を確認します。
- メッセージの種類 - テキスト、写真、ドキュメント、アンケート、クイズのいずれか。
- コンテンツ - メッセージの内容は何ですか?作成する文章またはトピックを提示してもらいます。
- 対象 - どのチャンネルまたはグループですか?
TELEGRAM_CHAT_IDを使うか、具体的な ID を尋ねます。 - 書式設定 - HTML または MarkdownV2。デフォルトは HTML です。
- ボタン - CTA ボタンは必要ですか?各ボタンのラベルと URL を確認します。
- メディア - 添付する画像またはファイルはありますか?URL またはローカルファイルパスを確認します。
- 送信タイミング - 今すぐ送信、後で予約送信、または定期送信のいずれですか?
- 通知 - サイレント(通知なし)または通常のどちらですか?
ユーザーがブログ記事の URL、記事、またはコンテンツソースを提示した場合は、WebFetch を使ってコンテンツを取得し、そこから適切な Telegram 投稿を作成します。
エラー処理
よくある Telegram Bot API エラーと解決方法:
| エラー | 原因 | 解決方法 |
|---|---|---|
401 Unauthorized | ボットトークンが無効です | @BotFather でトークンを再生成します |
400 Bad Request: chat not found | チャット ID が間違っているか、ボットがチャットに参加していません | チャット ID を確認し、ボットをチャンネルの管理者として追加します |
403 Forbidden: bot is not a member | ボットがチャンネルから削除されました | ボットをチャンネル管理者として再度追加します |
403 Forbidden: bot can't send messages | ボットに投稿権限がありません | ボットに「メッセージを投稿」する管理者権限を付与します |
429 Too Many Requests | レート制限を超過しました | 応答に指定された retry_after 秒数だけ待ちます |
400 Bad Request: can't parse entities | HTML/Markdown の形式が正しくありません | 書式設定を確認し、特殊文字をエスケープするか、HTML モードに切り替えます |
API 応答の ok フィールドを必ず確認します。ok が false の場合は、問題の解決方法とともに description フィールドをユーザーに表示します。