لإرسال إشعارات Claude Code إلى Telegram أو Slack أو Discord، أنشئ bot أو incoming webhook في التطبيق، ثم أضف hook في Claude Code يرسل إليه رسالة قصيرة باستخدام curl. يغطي hook من نوع Notification حالتي "Claude يحتاج إذنك" و"Claude في انتظارك"، بينما يغطي hook من نوع Stop حالة "Claude انتهى". يحتاج Telegram إلى bot token ومعرّف المحادثة (chat ID)، أما Slack وDiscord فيكفيهما رابط webhook. يعمل السكربت نفسه على Mac وLinux، وتغطي نسخة قصيرة بلغة PowerShell نظام Windows.
01قبل البدء: الرسالة والمفتاح السري
يستقبل كل hook بيانات JSON عبر الإدخال القياسي. أهم الحقول هي hook_event_name وcwd (مجلد المشروع) وmessage في أحداث Notification وlast_assistant_message في أحداث Stop. تحوّل الأمثلة أدناه هذه الحقول إلى سطر واحد مثل Claude needs you in my-app: Claude needs your permission to use Bash.
رموز الـ bot وروابط webhook بمثابة كلمات مرور: أي شخص يملك أحدها يستطيع النشر باسم الـ bot الخاص بك. وتنص وثائق Slack صراحةً على عدم مشاركة روابط webhook أو إضافتها إلى نظام التحكم بالإصدارات. احفظها في ملف منفصل لا يقرؤه أحد سواك:
mkdir -p ~/.claude
touch ~/.claude/chat-notify.env
chmod 600 ~/.claude/chat-notify.env
02Telegram: bot يراسلك
- في Telegram، افتح محادثة مع @BotFather وأرسل
/newbotواتبع التعليمات. سيرد عليك برمز مثل123456789:AA.... - افتح محادثة مع الـ bot الجديد وأرسل له أي رسالة، حتى يُسمح له بمراسلتك.
- اعثر على معرّف المحادثة. افتح هذا الرابط مع الرمز الخاص بك، وابحث عن
"chat":{"id":في الرد:
curl "https://api.telegram.org/bot<TOKEN>/getUpdates"
- ضع القيمتين في
~/.claude/chat-notify.env:
SERVICE=telegram
TELEGRAM_TOKEN=123456789:AA...
TELEGRAM_CHAT_ID=987654321
تأخذ الدالة sendMessage في Telegram المعاملين chat_id وtext (من 1 إلى 4096 حرفًا). كما تقبل disable_notification=true الذي يوصل الرسالة دون صوت. يستخدم السكربت ذلك لرسائل "انتهى" ويُبقي الصوت لطلبات الإذن.
03Slack: incoming webhook
- أنشئ تطبيق Slack من api.slack.com/apps (أو افتح تطبيقًا موجودًا).
- ضمن Incoming Webhooks، فعّل Activate Incoming Webhooks.
- انقر Add New Webhook to Workspace واختر قناة ثم Authorize.
- انسخ الرابط الذي يبدأ بـ
https://hooks.slack.com/services/.
SERVICE=slack
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T000/B000/XXXX
ينشر كل webhook في قناة واحدة تُحدَّد عند إنشائه، ولا يمكنك تغيير الاسم أو الأيقونة لكل رسالة. الأفضل قناة خاصة صغيرة لك وحدك، حتى لا يضيع التنبيه وسط قناة مزدحمة.
04Discord: webhook للقناة
- في الخادم، افتح Server Settings ثم Integrations ثم Webhooks.
- أنشئ webhook واختر القناة وانسخ رابطه.
SERVICE=discord
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/1234/abcd
تأخذ نقطة تنفيذ webhook في Discord جسم JSON يحتوي على content (حتى 2000 حرف) وusername اختياري لتجاوز اسم الـ webhook.
05سكربت الـ hook (Mac وLinux)
احفظه باسم ~/.claude/chat-notify.sh ثم شغّل chmod +x ~/.claude/chat-notify.sh. يحتاج إلى curl وjq (brew install jq أو apt install jq).
#!/bin/sh
. "$HOME/.claude/chat-notify.env"
input=$(cat)
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
if [ "$event" = "Stop" ]; then
detail=$(printf '%s' "$input" | jq -r '(.last_assistant_message // "") | .[0:300]')
text="Claude finished in $project. $detail"
quiet=true
else
detail=$(printf '%s' "$input" | jq -r '.message // "Needs your attention"')
text="Claude needs you in $project: $detail"
quiet=false
fi
case "$SERVICE" in
telegram)
curl -s "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
--data-urlencode "chat_id=$TELEGRAM_CHAT_ID" \
--data-urlencode "text=$text" \
--data-urlencode "disable_notification=$quiet" > /dev/null ;;
slack)
jq -n --arg t "$text" '{text: $t}' | curl -s -X POST \
-H 'Content-Type: application/json' --data @- "$SLACK_WEBHOOK_URL" > /dev/null ;;
discord)
jq -n --arg t "$text" '{content: $t, username: "Claude Code"}' | curl -s -X POST \
-H 'Content-Type: application/json' --data @- "$DISCORD_WEBHOOK_URL" > /dev/null ;;
esac
exit 0
بناء JSON باستخدام jq -n --arg أمر مهم: ردود Claude تحتوي على علامات اقتباس وشرطات مائلة عكسية وأسطر جديدة، ولصقها يدويًا في سلسلة JSON يُفسد الطلب.
اختبره قبل ربطه:
echo '{"hook_event_name":"Notification","cwd":"/tmp/demo","message":"Test"}' | ~/.claude/chat-notify.sh
06إضافة الـ hooks
في ~/.claude/settings.json، داخل كائن hooks الموجود إن وُجد:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt|idle_prompt",
"hooks": [{ "type": "command", "command": "~/.claude/chat-notify.sh" }]
}
],
"Stop": [
{
"hooks": [{ "type": "command", "command": "~/.claude/chat-notify.sh", "async": true }]
}
]
}
}
ابدأ جلسة Claude Code جديدة لتحميل الـ hooks. يتداخل idle_prompt مع Stop: يُطلق Stop لحظة انتهاء Claude، وidle_prompt بعد نحو دقيقة إن لم تكتب شيئًا. أبقِ الاثنين أو احذف أحدهما؛ ويشرح دليل ntfy المفاضلة بينهما.
07Windows (PowerShell)
احفظه باسم %USERPROFILE%\.claude\chat-notify.ps1. تنشر هذه النسخة إلى Discord؛ ولاستخدام Slack غيّر الجسم إلى @{ text = $text } وغيّر الرابط.
$url = 'https://discord.com/api/webhooks/1234/abcd'
$in = [Console]::In.ReadToEnd() | ConvertFrom-Json
$project = Split-Path $in.cwd -Leaf
if ($in.hook_event_name -eq 'Stop') { $text = "Claude finished in $project." }
else { $text = "Claude needs you in ${project}: $($in.message)" }
$json = @{ content = $text; username = 'Claude Code' } | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri $url -ContentType 'application/json; charset=utf-8' `
-Body ([Text.Encoding]::UTF8.GetBytes($json)) | Out-Null
إدخال الـ hook:
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\chat-notify.ps1\""
}
داخل WSL، استخدم سكربت Mac وLinux.
08ما يجب معرفته عن استخدام تطبيقات الدردشة للإشعارات
- ما ترسله يغادر جهازك. تتضمن رسالة "انتهى" بداية رد Claude، وفي قناة مشتركة على Slack أو Discord يستطيع كل أعضائها قراءته. احذف
$detailإن كان الكود خاصًا. - تطبيقات الدردشة تجمّع الإشعارات وتكتمها. قد تُخفي مساحة عمل مزدحمة أو خادم مكتوم التنبيه. تطبيق push مخصص مثل ntfy (راجع دليل ntfy) أقل عرضة للضياع.
- الـ hooks لا تعرف إن كنت أمام الجهاز. ينشر
Stopفي كل مرة، ويُعدidle_promptوpermission_promptأقرب مرشّح مدمج لحالة "غير موجود".
09أين يأتي دور Claude Code Notifier
الـ webhook طريقة جيدة للاحتفاظ بسجل لما فعله Claude، وقد يكون الأداة المناسبة لفريق. لكنه لا يكفي لشخص يريد التصرف بناءً على التنبيه: تقرأ أن Claude يحتاج إذنًا، ثم تعود إلى الـ terminal لتمنحه. يمكن نظريًا لـ bot على Telegram استقبال الردود، لكنك ستضطر لكتابة hook ينتظرها ويُعيد القرار.
يتولى Claude Code Notifier هذا الجزء. بعد ربط هاتفك، يمكنك من الهاتف السماح مرة واحدة أو السماح طوال الجلسة أو رفض طلب الإذن، والإجابة عن أسئلة Claude متعددة الخيارات، وإرسال تعليمات متابعة عند انتهائه. إن كتبت خلال آخر 30 ثانية، يسأل الـ terminal كالمعتاد ولا ينتظر شيء على الهاتف. الأداة مستقلة وليست من إنتاج Anthropic، ويعمل ccn على Mac وWindows وLinux. راجع المقارنة مع البدائل وصفحة ccn والأسعار.
10الأسئلة الشائعة
هل يمكن لـ Claude Code النشر على Slack دون سكربت؟
يوفر Claude Code hooks من نوع http ترسل JSON الخاص بالـ hook عبر POST إلى رابط، لكن webhooks في Slack وDiscord تتوقع صيغة جسم خاصة بها (text أو content)، لذا يفشل ربط hook من نوع http بها مباشرة. لا بد من سكربت صغير أو وسيط بينهما.
كيف أعثر على معرّف المحادثة في Telegram؟
أرسل رسالة إلى الـ bot، ثم افتح https://api.telegram.org/bot<TOKEN>/getUpdates. الرقم بعد "chat":{"id": هو معرّف المحادثة. بالنسبة للمجموعات، أضف الـ bot إلى المجموعة وأرسل فيها رسالة أولًا.
هل يمكنني الرد على Claude Code من Slack أو Discord؟
ليس عبر incoming webhook، فهو يرسل الرسائل فقط. الرد يتطلب hook ينتظر إجابتك ويعيد قرارًا، وهذا بالضبط ما صُممت له أدوات الموافقة عن بُعد.
هل سيُبطئ الـ hook عمل Claude Code؟
يستخدم إدخال Stop الخيار "async": true، لذا يُرسَل الإشعار في الخلفية. أما hooks من نوع Notification فتعمل أصلًا بالتوازي مع Claude دون أن تعطّله.