مایکروسافت تیمز
Microsoft Teams
اتوماسیون Microsoft Teams: ارسال پیام، Adaptive Cards، مدیریت تیم، جلسات آنلاین و اعلان سازمانی
نمای کلی
نود Microsoft Teams یکی از مهمترین نودهای n8n برای ارتباطات سازمانی و اتوماسیون فرآیندهای کسبوکار در محیط Microsoft 365 است.
Microsoft Teams چیست؟
Microsoft Teams پلتفرم ارتباطات و همکاری سازمانی مایکروسافت است که پیامرسانی، تماس صوتی/تصویری، جلسات آنلاین، اشتراک فایل و یکپارچهسازی با ابزارهای Microsoft 365 (Word, Excel, SharePoint, OneDrive) را در یک محیط متمرکز ارائه میدهد. Microsoft Graph API امکان اتوماسیون کامل Teams را فراهم میکند.
قابلیتهای کلیدی:
- ارسال پیام متنی و HTML به کانالها و چتها
- ارسال Adaptive Cards (پیامهای تعاملی پیشرفته)
- ایجاد و مدیریت تیمها و کانالها
- مدیریت اعضای تیم (اضافه/حذف)
- زمانبندی و ایجاد جلسات آنلاین (Online Meetings)
- آپلود و اشتراک فایل در کانالها
- پاسخ در Thread (Reply to Message)
- @mention کاربران و تیمها
- دریافت لیست تیمها، کانالها و اعضا
- یکپارچهسازی با SharePoint و OneDrive
Microsoft Teams Trigger:
- دریافت پیام جدید در کانال
- رویدادهای عضویت در تیم
- تغییرات در کانالها
- رویدادهای جلسات آنلاین
- Webhookهای ورودی (Incoming Webhooks)
کاربردها در سازمانها:
- اعلانهای سیستمهای داخلی (ERP, CRM, HR)
- هشدار مانیتورینگ سرور و سرویسها
- مدیریت فرآیندهای تایید (Approval Workflows)
- اعلان تیکتهای پشتیبانی و Incident
- گزارشهای روزانه و هفتگی مدیریتی
- زمانبندی خودکار جلسات
- یکپارچهسازی با Azure DevOps و GitHub
- اتوماسیون Onboarding کارمندان جدید
احراز هویت
احراز هویت Microsoft Teams
روش ۱: OAuth2 با Azure AD (توصیه شده)
#### مراحل ساخت Azure AD App Registration:
- 1به [Azure Portal](https://portal.azure.com) بروید
- 2به بخش Azure Active Directory > App registrations بروید
- 3روی New registration کلیک کنید
- 4تنظیمات:
Name: n8n Teams Integration
Supported account types: Accounts in this organizational directory only
Redirect URI: https://your-n8n-url/rest/oauth2-credential/callback- 1Register را بزنید
#### دریافت Client ID و Secret:
- 1از صفحه Overview، Application (client) ID را کپی کنید
- 2Directory (tenant) ID را نیز یادداشت کنید
- 3به Certificates & secrets > New client secret بروید:
Description: n8n Integration
Expires: 24 months (توصیه شده)- 1Value (نه Secret ID) را فوراً کپی کنید
#### تنظیم API Permissions (Microsoft Graph): به API permissions > Add a permission > Microsoft Graph بروید:
Delegated Permissions (برای OAuth2):
Channel.ReadBasic.All → خواندن اطلاعات کانالها
ChannelMessage.Send → ارسال پیام در کانال
ChannelMessage.Read.All → خواندن پیامهای کانال
Chat.ReadWrite → خواندن و نوشتن چتها
ChatMessage.Send → ارسال پیام در چت
Group.ReadWrite.All → مدیریت تیمها (Groups)
Team.ReadBasic.All → خواندن اطلاعات تیمها
TeamMember.ReadWrite.All → مدیریت اعضای تیم
OnlineMeetings.ReadWrite → مدیریت جلسات آنلاین
Files.ReadWrite.All → آپلود و مدیریت فایلها
User.Read → خواندن پروفایل کاربر جاری
User.Read.All → خواندن پروفایل تمام کاربرانApplication Permissions (برای سرویس بدون کاربر):
ChannelMessage.Read.All → خواندن تمام پیامها
Team.ReadBasic.All → خواندن تیمها
TeamMember.Read.All → خواندن اعضا
OnlineMeetings.Read.All → خواندن جلسات- 1Grant admin consent را بزنید (نیاز به دسترسی Global Admin)
#### تنظیم در n8n:
- 1Credentials > Microsoft Teams OAuth2 API
- 2فیلدها:
Client ID: [Application (client) ID از Azure]
Client Secret: [Secret Value از Azure]
Tenant ID: [Directory (tenant) ID] (یا "common" برای Multi-tenant)- 1Connect بزنید و با حساب Microsoft وارد شوید
- 2دسترسیها را تایید کنید
روش ۲: Incoming Webhook (سادهترین روش)
برای فقط ارسال پیام به یک کانال خاص:
- 1در Teams: کانال مورد نظر > Connectors (یا Manage channel > Connectors)
- 2Incoming Webhook را پیدا و Configure کنید
- 3نام و آیکون Webhook را تنظیم کنید
- 4Create بزنید و URL را کپی کنید:
https://outlook.office.com/webhook/xxx/IncomingWebhook/yyy/zzz- 1این URL را در HTTP Request Node در n8n استفاده کنید
#### مزایای Webhook:
- نیازی به Azure AD Registration ندارد
- تنظیم سریع و بدون دردسر
- مناسب برای اعلانهای یکطرفه
- پشتیبانی از Adaptive Cards
#### محدودیتهای Webhook:
- فقط ارسال پیام (نه خواندن یا مدیریت)
- محدود به یک کانال خاص
- بدون دسترسی به API مدیریتی
روش ۳: Bot Framework (پیشرفته)
برای ساخت ربات تعاملی کامل:
- 1در [Bot Framework Portal](https://dev.botframework.com) ثبتنام کنید
- 2Bot را ایجاد و به Teams Channel متصل کنید
- 3Messaging Endpoint را به n8n Webhook وصل کنید
نکات امنیتی:
- Client Secret را در محل امن نگهداری کنید
- از حداقل دسترسیهای مورد نیاز استفاده کنید (Principle of Least Privilege)
- Secret را قبل از انقضا تمدید کنید
- برای محیط Production از Certificate (نه Secret) استفاده کنید
- دسترسی Conditional Access را برای App تنظیم کنید
- Activity Logs را در Azure AD مانیتور کنید
عملیاتهای موجود
send_message
ارسال پیام متنی یا HTML به کانال تیم. پشتیبانی از فرمتبندی HTML، @mention کاربران، لینکها و تصاویر inline. پیام در کانال برای تمام اعضای تیم قابل مشاهده است.
send_chat_message
ارسال پیام مستقیم (DM) به یک کاربر یا گروه چت. برای ارتباط خصوصی یا گروهی بدون نیاز به ایجاد تیم مناسب است. پشتیبانی از فرمت HTML و Adaptive Cards.
send_card
ارسال Adaptive Card (کارت تعاملی) به کانال یا چت. Adaptive Cards امکان نمایش فرمها، دکمهها، تصاویر، جداول و ورودیهای تعاملی را فراهم میکنند. از Adaptive Cards Designer برای طراحی بصری استفاده کنید.
reply_to_message
ارسال پاسخ در Thread یک پیام موجود در کانال. پاسخها زیر پیام اصلی نمایش داده میشوند و مکالمات را سازمانیافته نگه میدارند. برای ادامه بحث در موضوع خاص مناسب است.
create_channel
ایجاد کانال جدید در یک تیم. کانالها فضاهای بحث و همکاری در تیم هستند. میتوانید کانال Standard (قابل مشاهده برای همه اعضا) یا Private (فقط اعضای دعوتشده) ایجاد کنید.
list_channels
دریافت لیست تمام کانالهای یک تیم شامل نام، توضیحات، نوع عضویت و تاریخ ایجاد. برای یافتن Channel ID مناسب برای ارسال پیام یا مدیریت کانالها استفاده میشود.
get_channel
دریافت اطلاعات کامل یک کانال شامل نام، توضیحات، نوع عضویت، وضعیت و آدرس ایمیل کانال. برای بررسی تنظیمات کانال یا دریافت جزئیات قبل از ارسال پیام مفید است.
update_channel
ویرایش نام یا توضیحات یک کانال موجود. کانال General (پیشفرض) قابل حذف نیست اما نام و توضیحاتش قابل تغییر است. برای بهروزرسانی Topic یا وضعیت کانال مناسب است.
list_members
دریافت لیست تمام اعضای یک تیم شامل نام، ایمیل، نقش (owner/member/guest) و اطلاعات کاربری. برای مدیریت اعضا، تولید گزارش و بررسی دسترسیها استفاده میشود.
add_member
اضافه کردن کاربر جدید به تیم به عنوان عضو (Member) یا مالک (Owner). کاربر باید در Azure AD سازمان وجود داشته باشد. کاربران مهمان (Guest) از خارج سازمان نیز قابل دعوت هستند.
create_team
ایجاد تیم جدید در Microsoft Teams. تیم یک فضای همکاری شامل کانالها، فایلها و برنامهها است. به صورت خودکار یک Microsoft 365 Group نیز ایجاد میشود. برای پروژهها، بخشها یا تیمهای کاری جدید مناسب است.
list_teams
دریافت لیست تمام تیمهایی که کاربر عضو آنهاست. شامل نام، توضیحات، تعداد اعضا و وضعیت آرشیو. برای یافتن Team ID مناسب و مدیریت تیمها استفاده میشود.
upload_file
آپلود فایل به پوشه SharePoint مرتبط با کانال تیم. فایلها در تب Files کانال قابل مشاهده هستند. پشتیبانی از تمام فرمتها: PDF، Excel، Word، تصاویر و غیره. حداکثر حجم فایل 250MB.
create_meeting
ایجاد جلسه آنلاین (Online Meeting) در Microsoft Teams با لینک شرکت در جلسه. امکان تنظیم زمان شروع و پایان، موضوع، شرکتکنندگان و تنظیمات Lobby. لینک جلسه قابل اشتراکگذاری با افراد خارج از سازمان نیز هست.
کاربردهای متداول
کاربردهای رایج
۱. اعلانهای سیستم داخلی (ERP/CRM)
ارسال اعلان رویدادهای مهم سیستم به کانال تیم:
Webhook (رویداد CRM: سفارش جدید)
→ Set (فرمتبندی دادهها)
→ Microsoft Teams (send_card)
TeamId: SALES_TEAM_ID
ChannelId: ORDERS_CHANNEL_ID
Card:
{
"type": "AdaptiveCard",
"body": [
{"type": "TextBlock", "text": "سفارش جدید ثبت شد", "weight": "bolder", "size": "large"},
{"type": "FactSet", "facts": [
{"title": "شماره سفارش", "value": "${orderId}"},
{"title": "مشتری", "value": "${customerName}"},
{"title": "مبلغ", "value": "${amount} تومان"},
{"title": "وضعیت", "value": "در انتظار تایید"}
]},
{"type": "TextBlock", "text": "محصولات: ${items}", "wrap": true}
],
"actions": [
{"type": "Action.OpenUrl", "title": "مشاهده سفارش", "url": "${orderUrl}"},
{"type": "Action.OpenUrl", "title": "تایید سفارش", "url": "${approveUrl}"}
]
}۲. هشدار مانیتورینگ و Incident
ارسال هشدار فوری هنگام Down شدن سرویس:
Schedule (هر 2 دقیقه)
→ HTTP Request (Health Check سرویسها)
→ IF (status != 200)
→ Microsoft Teams (send_message)
TeamId: DEVOPS_TEAM_ID
ChannelId: ALERTS_CHANNEL_ID
ContentType: html
Importance: urgent
Content:
<h3>هشدار: سرویس از دسترس خارج شد!</h3>
<table>
<tr><td><b>سرویس:</b></td><td>${serviceName}</td></tr>
<tr><td><b>URL:</b></td><td>${url}</td></tr>
<tr><td><b>Status:</b></td><td>${statusCode}</td></tr>
<tr><td><b>زمان:</b></td><td>${timestamp}</td></tr>
</table>
<p><at id="0">${oncallUser}</at> لطفا بررسی کنید.</p>۳. فرآیند تایید درخواست (Approval Workflow)
مدیریت درخواستهای مرخصی و هزینه:
Webhook (درخواست مرخصی از سیستم HR)
→ Microsoft Teams (send_card)
ChatId: MANAGER_CHAT_ID
Card:
{
"type": "AdaptiveCard",
"body": [
{"type": "TextBlock", "text": "درخواست مرخصی جدید", "weight": "bolder", "size": "large", "color": "accent"},
{"type": "ColumnSet", "columns": [
{"type": "Column", "items": [
{"type": "TextBlock", "text": "کارمند:", "weight": "bolder"},
{"type": "TextBlock", "text": "نوع مرخصی:"},
{"type": "TextBlock", "text": "از تاریخ:"},
{"type": "TextBlock", "text": "تا تاریخ:"},
{"type": "TextBlock", "text": "توضیحات:"}
]},
{"type": "Column", "items": [
{"type": "TextBlock", "text": "${employeeName}"},
{"type": "TextBlock", "text": "${leaveType}"},
{"type": "TextBlock", "text": "${startDate}"},
{"type": "TextBlock", "text": "${endDate}"},
{"type": "TextBlock", "text": "${reason}", "wrap": true}
]}
]}
],
"actions": [
{"type": "Action.Submit", "title": "تایید", "style": "positive", "data": {"action": "approve", "requestId": "${id}"}},
{"type": "Action.Submit", "title": "رد", "style": "destructive", "data": {"action": "reject", "requestId": "${id}"}},
{"type": "Action.OpenUrl", "title": "مشاهده جزئیات", "url": "${detailUrl}"}
]
}۴. زمانبندی خودکار جلسات
ایجاد جلسه هفتگی Sprint Review:
Schedule (هر دوشنبه ساعت 8:00)
→ Microsoft Teams (create_meeting)
Subject: "Sprint Review - هفته ${weekNumber}"
StartDateTime: ${nextThursday}T14:00:00+03:30
EndDateTime: ${nextThursday}T15:30:00+03:30
Participants: [
{emailAddress: {address: "pm@company.com"}, type: "required"},
{emailAddress: {address: "dev-lead@company.com"}, type: "required"},
{emailAddress: {address: "qa-lead@company.com"}, type: "optional"}
]
LobbyBypassScope: organization
→ Microsoft Teams (send_message)
ChannelId: SPRINT_CHANNEL_ID
Content:
"جلسه Sprint Review این هفته:
زمان: پنجشنبه ساعت 14:00
لینک: ${joinUrl}
لطفا Demo خود را آماده کنید."۵. Onboarding کارمند جدید
اتوماسیون فرآیند ورود کارمند جدید:
Webhook (کارمند جدید از سیستم HR)
→ Microsoft Teams (add_member)
TeamId: COMPANY_TEAM_ID
UserId: ${newEmployeeEmail}
Role: member
→ Microsoft Teams (add_member)
TeamId: ${departmentTeamId}
UserId: ${newEmployeeEmail}
→ Microsoft Teams (send_message)
ChannelId: GENERAL_CHANNEL_ID
ContentType: html
Content:
"<h3>به تیم ما خوش آمدید!</h3>
<p><at id='0'>${newEmployeeName}</at> به عنوان ${jobTitle}
به تیم ${department} پیوست.</p>
<p>لطفا خوشآمد بگویید! 👋</p>"
→ Microsoft Teams (send_chat_message)
ChatId: DM_WITH_NEW_EMPLOYEE
Content:
"سلام ${firstName}!
به شرکت خوش آمدید.
راهنمای شروع کار: ${onboardingUrl}
در صورت هرگونه سوال با منتور خود تماس بگیرید."۶. گزارش روزانه خودکار
ارسال آمار روزانه به تیم مدیریت:
Schedule (هر روز ساعت 18:00)
→ Database (آمار فروش، کاربران، تیکتها)
→ Code (پردازش و فرمتبندی)
→ Microsoft Teams (send_card)
TeamId: MANAGEMENT_TEAM_ID
ChannelId: REPORTS_CHANNEL_ID
Card:
{
"type": "AdaptiveCard",
"body": [
{"type": "TextBlock", "text": "گزارش روزانه - ${today}", "weight": "bolder", "size": "large"},
{"type": "ColumnSet", "columns": [
{"type": "Column", "items": [
{"type": "TextBlock", "text": "${totalOrders}", "size": "extraLarge", "color": "good", "horizontalAlignment": "center"},
{"type": "TextBlock", "text": "سفارش", "horizontalAlignment": "center"}
]},
{"type": "Column", "items": [
{"type": "TextBlock", "text": "${revenue}", "size": "extraLarge", "color": "accent", "horizontalAlignment": "center"},
{"type": "TextBlock", "text": "درآمد (تومان)", "horizontalAlignment": "center"}
]},
{"type": "Column", "items": [
{"type": "TextBlock", "text": "${newUsers}", "size": "extraLarge", "color": "warning", "horizontalAlignment": "center"},
{"type": "TextBlock", "text": "کاربر جدید", "horizontalAlignment": "center"}
]}
]},
{"type": "FactSet", "facts": [
{"title": "تیکتهای باز", "value": "${openTickets}"},
{"title": "میانگین زمان پاسخ", "value": "${avgResponseTime}"},
{"title": "رضایت مشتری", "value": "${satisfaction}%"}
]}
],
"actions": [
{"type": "Action.OpenUrl", "title": "مشاهده داشبورد کامل", "url": "${dashboardUrl}"}
]
}۷. یکپارچهسازی Azure DevOps / GitHub
اعلان رویدادهای CI/CD:
GitHub Trigger (push to main / PR merged)
→ Microsoft Teams (send_card)
ChannelId: DEVOPS_CHANNEL_ID
Card:
{
"type": "AdaptiveCard",
"body": [
{"type": "TextBlock", "text": "Deploy جدید به Production", "weight": "bolder", "color": "good"},
{"type": "FactSet", "facts": [
{"title": "Branch", "value": "${branch}"},
{"title": "Commit", "value": "${commitMessage}"},
{"title": "Author", "value": "${author}"},
{"title": "Build", "value": "#${buildNumber}"},
{"title": "Status", "value": "موفق ✅"}
]}
],
"actions": [
{"type": "Action.OpenUrl", "title": "مشاهده تغییرات", "url": "${compareUrl}"},
{"type": "Action.OpenUrl", "title": "Build Logs", "url": "${buildUrl}"}
]
}۸. مدیریت تیکت پشتیبانی
اعلان تیکت جدید و مدیریت در Teams:
Webhook (تیکت جدید از سایت)
→ Microsoft Teams (send_message)
ChannelId: SUPPORT_CHANNEL_ID
ContentType: html
Importance: high
Content:
"<h3>تیکت جدید #${ticketId}</h3>
<b>موضوع:</b> ${subject}<br>
<b>مشتری:</b> ${customerName}<br>
<b>اولویت:</b> ${priority}<br>
<b>دسته:</b> ${category}"
→ Microsoft Teams (reply_to_message)
MessageId: ${parentMessageId}
Content: "جزئیات: ${description}"۹. چرخش On-Call و هشدار شیفت
مدیریت خودکار شیفتهای آنکال:
Schedule (هر دوشنبه ساعت 9:00)
→ Database (دریافت نوبت آنکال جاری)
→ Microsoft Teams (update_channel)
TeamId: OPS_TEAM_ID
ChannelId: ONCALL_CHANNEL_ID
Description: "آنکال این هفته: ${oncallName} | تلفن: ${oncallPhone}"
→ Microsoft Teams (send_card)
ChannelId: ONCALL_CHANNEL_ID
Card:
{
"type": "AdaptiveCard",
"body": [
{"type": "TextBlock", "text": "تغییر شیفت آنکال", "weight": "bolder"},
{"type": "FactSet", "facts": [
{"title": "آنکال قبلی", "value": "${previousOncall}"},
{"title": "آنکال جدید", "value": "${currentOncall}"},
{"title": "شروع", "value": "${startDate}"},
{"title": "پایان", "value": "${endDate}"}
]}
]
}
→ Microsoft Teams (send_chat_message)
ChatId: DM_WITH_ONCALL
Content: "سلام! شیفت آنکال این هفته با شماست. راهنما: ${runbookUrl}"۱۰. ایجاد خودکار تیم برای پروژه
ایجاد تیم و کانالها برای هر پروژه جدید:
Webhook (پروژه جدید از سیستم PM)
→ Microsoft Teams (create_team)
DisplayName: "پروژه: ${projectName}"
Description: "${projectDescription}"
Visibility: private
→ Microsoft Teams (create_channel)
DisplayName: "طراحی"
Description: "بحثهای طراحی و UX/UI"
→ Microsoft Teams (create_channel)
DisplayName: "توسعه"
Description: "بحثهای فنی و کد"
→ Microsoft Teams (create_channel)
DisplayName: "تست"
Description: "گزارش باگ و QA"
→ Loop (اعضای پروژه)
→ Microsoft Teams (add_member)
UserId: ${memberEmail}
Role: ${isLead ? 'owner' : 'member'}
→ Microsoft Teams (send_message)
ChannelId: GENERAL_CHANNEL_ID
Content: "تیم پروژه ${projectName} آماده است! بیایید شروع کنیم."۱۱. ارسال گزارش فایل خودکار
تولید و ارسال گزارش Excel/PDF به کانال:
Schedule (اول هر ماه)
→ Database (دادههای ماهانه)
→ Code (ساخت Excel/CSV)
→ Microsoft Teams (upload_file)
TeamId: FINANCE_TEAM_ID
ChannelId: REPORTS_CHANNEL_ID
FileName: "report-${year}-${month}.xlsx"
→ Microsoft Teams (send_message)
Content: "گزارش مالی ${monthName} آماده شد. فایل در تب Files موجود است."نکات حرفهای
نکات حرفهای
۱. Adaptive Cards - سیستم پیامهای تعاملی
Adaptive Cards قدرتمندترین روش نمایش اطلاعات در Teams است:
{
"type": "AdaptiveCard",
"version": "1.4",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"body": [
{
"type": "TextBlock",
"text": "عنوان پیام",
"weight": "bolder",
"size": "large",
"color": "accent"
},
{
"type": "FactSet",
"facts": [
{"title": "وضعیت", "value": "فعال"},
{"title": "تاریخ", "value": "1403/10/25"}
]
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "auto",
"items": [
{"type": "Image", "url": "https://...", "size": "small"}
]
},
{
"type": "Column",
"width": "stretch",
"items": [
{"type": "TextBlock", "text": "نام کاربر", "weight": "bolder"},
{"type": "TextBlock", "text": "توسعهدهنده ارشد", "isSubtle": true}
]
}
]
},
{
"type": "Input.Text",
"id": "comment",
"placeholder": "نظر خود را بنویسید..."
}
],
"actions": [
{"type": "Action.Submit", "title": "تایید", "style": "positive"},
{"type": "Action.Submit", "title": "رد", "style": "destructive"},
{"type": "Action.OpenUrl", "title": "مشاهده", "url": "https://..."},
{"type": "Action.ShowCard", "title": "جزئیات بیشتر",
"card": {
"type": "AdaptiveCard",
"body": [{"type": "TextBlock", "text": "اطلاعات تکمیلی..."}]
}
}
]
}۲. Adaptive Cards Designer
قبل از کدنویسی، کارت را در محیط بصری طراحی کنید:
https://adaptivecards.io/designer/- Host App: Microsoft Teams را انتخاب کنید
- JSON خروجی را مستقیماً در n8n استفاده کنید
- پیشنمایش دقیق در Teams را مشاهده کنید
- نسخه Card را روی 1.4 یا 1.5 تنظیم کنید
۳. @Mention کاربران در پیام
برای منشن کردن کاربر در پیام HTML:
<at id="0">نام کاربر</at>
<!-- در body درخواست API: -->
{
"body": {
"contentType": "html",
"content": "<at id=\"0\">علی احمدی</at> لطفا بررسی کنید."
},
"mentions": [
{
"id": 0,
"mentionText": "علی احمدی",
"mentioned": {
"user": {
"id": "USER_ID",
"displayName": "علی احمدی",
"userIdentityType": "aadUser"
}
}
}
]
}۴. فرمتبندی HTML در Teams
Teams از زیرمجموعهای از HTML پشتیبانی میکند:
<b>Bold</b> → متن ضخیم
<i>Italic</i> → متن مورب
<s>Strikethrough</s> → خط خورده
<h1>Header 1</h1> → سرتیتر (h1-h6)
<ul><li>Item</li></ul> → لیست نقطهای
<ol><li>Item</li></ol> → لیست شمارهای
<a href="url">Link</a> → لینک
<pre>Code block</pre> → بلوک کد
<code>Inline code</code> → کد خطی
<blockquote>Quote</blockquote> → نقل قول
<table><tr><td></td></tr></table> → جدول
<img src="url" alt=""/> → تصویر
<br> → خط جدید
<hr> → خط جداکننده۵. Importance (اولویت پیام)
سطوح اولویت پیام در Teams:
normal: پیام عادی بدون اعلان خاص
high: پیام مهم با اعلان Priority
urgent: پیام فوری با اعلان مکرر هر 2 دقیقه تا 20 دقیقهاز urgent فقط برای Incidentها و هشدارهای بحرانی استفاده کنید.
۶. Incoming Webhook با Adaptive Card
ارسال Adaptive Card از طریق Webhook (بدون OAuth):
{
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"contentUrl": null,
"content": {
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{"type": "TextBlock", "text": "اعلان از سیستم خارجی", "weight": "bolder"}
]
}
}
]
}۷. Microsoft Graph API Explorer
قبل از پیادهسازی، API را در محیط تست اجرا کنید:
https://developer.microsoft.com/graph/graph-explorer- با حساب Microsoft وارد شوید
- APIهای مختلف Teams را تست کنید
- پاسخ JSON را مشاهده و بررسی کنید
۸. OData Filter برای لیستها
فیلتر کردن نتایج List Teams و List Channels:
// فیلتر تیمها بر اساس نام
$filter=displayName eq 'DevOps'
// فیلتر کانالهای Standard
$filter=membershipType eq 'standard'
// جستجو در نام
$filter=startsWith(displayName, 'پروژه')
// Select فیلدهای خاص
$select=id,displayName,description
// ترتیب
$orderby=displayName asc
// صفحهبندی
$top=50&$skip=0۹. محدودیتهای مهم Microsoft Teams API
پیام متنی: حدود 28KB
Adaptive Card: 28KB (شامل JSON)
فایل آپلود: 250MB per file
اعضای تیم: 25,000 نفر
کانالهای تیم: 1000 (شامل حذفشدهها)
کانالهای Private: 30 per team
اعضای چت گروهی: 250 نفر
Mentions per Message: 50 عدد
Webhooks per Channel: بدون محدودیت رسمی
Rate Limit: متغیر (معمولا 2000 req/10 sec)۱۰. تفاوت Delegated و Application Permissions
Delegated Permissions:
- عملیات به نیابت از کاربر
- نیاز به OAuth2 Login
- محدود به دسترسیهای کاربر
- مناسب برای: عملیات کاربر-محور
Application Permissions:
- عملیات بدون کاربر (Background/Service)
- از Client Credentials Flow استفاده میکند
- دسترسی سطح سازمان
- نیاز به Admin Consent
- مناسب برای: Cron Jobs، اتوماسیون بدون تعامل کاربر۱۱. Thread و Reply برای مکالمات سازمانیافته
از Thread برای نظمدهی بحثها استفاده کنید:
// ارسال پیام اصلی
Microsoft Teams (send_message) → خروجی: messageId
// پاسخ در Thread
Microsoft Teams (reply_to_message)
messageId: {{$json.id}}
content: "پاسخ در Thread"
// نکته: Thread replies هم از HTML و Adaptive Card پشتیبانی میکنند۱۲. Actionable Messages با Webhook
پیامهای تعاملی با دکمه و لینک از طریق Webhook:
{
"@type": "MessageCard",
"@context": "http://schema.org/extensions",
"summary": "خلاصه پیام",
"themeColor": "0076D7",
"title": "عنوان کارت",
"sections": [
{
"activityTitle": "رویداد جدید",
"facts": [
{"name": "نوع", "value": "هشدار"},
{"name": "زمان", "value": "10:30"}
],
"markdown": true
}
],
"potentialAction": [
{
"@type": "OpenUri",
"name": "مشاهده جزئیات",
"targets": [{"os": "default", "uri": "https://..."}]
},
{
"@type": "ActionCard",
"name": "پاسخ",
"inputs": [{"@type": "TextInput", "id": "comment", "title": "نظر شما"}],
"actions": [{"@type": "HttpPOST", "name": "ارسال", "target": "https://webhook-url"}]
}
]
}۱۳. Error Handling حرفهای
Microsoft Teams (send_message)
→ On Error: Continue
→ IF (خطا)
→ Switch (error code)
→ 401: Refresh Token → Retry
→ 403: Log "Permission denied" → Alert Admin
→ 404: Log "Team/Channel not found" → Skip
→ 429: Wait (Retry-After header) → Retry
→ Default: Log Error → Fallback (Email/Webhook)۱۴. Batch Operations برای عملکرد بهتر
برای عملیات روی چندین آیتم:
// به جای ارسال جداگانه به 10 کانال:
// از Microsoft Graph Batch API استفاده کنید
POST https://graph.microsoft.com/v1.0/$batch
{
"requests": [
{"id": "1", "method": "POST", "url": "/teams/{id}/channels/{id}/messages", "body": {...}},
{"id": "2", "method": "POST", "url": "/teams/{id}/channels/{id}/messages", "body": {...}}
]
}
// حداکثر 20 درخواست در هر Batch۱۵. تنظیمات جلسه آنلاین پیشرفته
{
"subject": "جلسه Sprint Review",
"startDateTime": "2025-01-15T10:00:00+03:30",
"endDateTime": "2025-01-15T11:00:00+03:30",
"lobbyBypassSettings": {
"scope": "organization",
"isDialInBypassEnabled": true
},
"isEntryExitAnnounced": true,
"allowedPresenters": "roleIsPresenter",
"audioConferencing": {
"tollNumber": "+1-xxx-xxx-xxxx"
}
}۱۶. متن فارسی RTL در Teams
Teams به صورت خودکار متن RTL فارسی را تشخیص میدهد:
<!-- فرمت HTML برای متنهای فارسی-انگلیسی ترکیبی -->
<div dir="rtl">
<b>گزارش وضعیت سرویس</b><br>
سرویس API: <span style="color:green">فعال</span><br>
سرویس Database: <span style="color:red">غیرفعال</span><br>
آخرین بررسی: 14:30
</div>۱۷. PowerAutomate vs n8n برای Teams
n8n مزایا:
+ Self-hosted (حاکمیت داده)
+ بدون محدودیت اجرا
+ یکپارچهسازی با +400 سرویس
+ رایگان و Open-source
+ سرعت بالاتر در اجرا
Power Automate مزایا:
+ یکپارچهسازی عمیقتر با Microsoft 365
+ Triggerهای بیشتر Teams
+ بدون نیاز به سرور
توصیه: از n8n برای اتوماسیونهای پیچیده و Cross-platform استفاده کنید.رفع مشکلات
خطاهای رایج و راهحلها
۱. خطای "Authorization_RequestDenied" (403)
علت: App Registration دسترسی (Permission) لازم را ندارد
راهحل
- به Azure Portal > App registrations > API permissions بروید
- Permission مورد نیاز را اضافه کنید (مثل
ChannelMessage.Send) - مهم: حتما Grant admin consent را بزنید
- بدون Admin Consent، Permissionها فعال نمیشوند
- برای Application Permissions حتما Admin Consent لازم است
- لیست Permissionهای مورد نیاز هر عملیات در مستندات Microsoft Graph موجود است
۲. خطای "InvalidAuthenticationToken" (401)
علت: Token نامعتبر، منقضی شده یا Client Secret اشتباه
راهحل
- مطمئن شوید Client Secret منقضی نشده باشد (بررسی تاریخ انقضا در Azure)
- Client ID و Tenant ID صحیح باشند
- Credential را در n8n حذف و مجدد ایجاد کنید
- مجدد OAuth2 Authorization را انجام دهید (Connect)
- اگر Multi-tenant است، Tenant ID را
commonقرار دهید
۳. خطای "TeamNotFound" یا "ResourceNotFound" (404)
علت: Team ID یا Channel ID اشتباه، یا تیم/کانال حذف شده
راهحل
- از عملیات
list_teamsوlist_channelsبرای دریافت ID صحیح استفاده کنید - Team ID فرمت GUID دارد: مثل
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - مطمئن شوید تیم آرشیو یا حذف نشده باشد
- کاربر احراز هویت شده باید عضو تیم باشد
- برای کانالهای Private، کاربر باید عضو کانال باشد
۴. خطای "Forbidden: BotNotInConversationRoster"
علت: App به تیم یا چت اضافه نشده
راهحل
- برای ارسال پیام در کانال، App باید به تیم نصب شده باشد
- از Teams Admin Center: Manage apps > اپلیکیشن را به تیم اضافه کنید
- یا از Microsoft Graph:
POST /teams/{teamId}/installedApps - برای چتها: App باید در چت نصب شده باشد
۵. خطای "ItemNotFound" هنگام آپلود فایل
علت: مسیر SharePoint یا Drive ID نادرست
راهحل
- ابتدا Drive ID کانال را دریافت کنید:
GET /teams/{teamId}/channels/{channelId}/filesFolder- مطمئن شوید SharePoint site فعال و قابل دسترسی باشد
- مسیر پوشه را بررسی کنید (از / شروع نمیشود)
- دسترسی
Files.ReadWrite.Allفعال باشد
۶. خطای "ThrottledRequest" (429 - Rate Limit)
علت: تعداد درخواستها از محدودیت Microsoft Graph عبور کرده
راهحل
- محدودیتهای Microsoft Graph:
- Per-App: 2000 request/10 seconds
- Per-App per Tenant: 200,000 request/10 minutes
- Per-Thread: متغیر بسته به عملیات
- Header
Retry-Afterمدت انتظار (ثانیه) را مشخص میکند - از Wait Node استفاده کنید:
Loop → Teams → Wait (2 seconds) → Next- پیامها را Batch کنید و با فاصله ارسال کنید
- از Exponential Backoff استفاده کنید
۷. خطای "BadRequest" هنگام ارسال Adaptive Card
علت: ساختار JSON کارت نادرست
راهحل
- از [Adaptive Cards Designer](https://adaptivecards.io/designer/) برای طراحی و تست استفاده کنید
- version باید
1.4یا بالاتر باشد (Teams از 1.5 پشتیبانی میکند) - Card باید در attachment با contentType مناسب ارسال شود:
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": { "type": "AdaptiveCard", "version": "1.4", "body": [...] }
}- مطمئن شوید JSON معتبر است (از JSON Validator استفاده کنید)
- حداکثر حجم Card: 28KB
۸. خطای "NameAlreadyExists" هنگام ایجاد تیم/کانال
علت: نام تیم یا کانال تکراری است
راهحل
- نام تیم/کانال باید در سازمان/تیم یکتا باشد
- از پیشوند تاریخ یا شناسه استفاده کنید:
پروژه-${projectId}-${date} - قبل از ایجاد، وجود نام را با List Teams/Channels بررسی کنید
- کانالهای حذف شده ممکن است هنوز نام را اشغال کنند (Soft Delete 30 روزه)
۹. خطای "InsufficientPrivileges" هنگام اضافه کردن عضو
علت: کاربر جاری Owner تیم نیست
راهحل
- فقط Ownerهای تیم میتوانند عضو جدید اضافه کنند
- با Application Permission و Admin Consent این محدودیت برطرف میشود
- از
TeamMember.ReadWrite.AllPermission استفاده کنید - برای Guest Invitation: دسترسی
Guest Inviterدر Azure AD لازم است
۱۰. Webhook ارسال پیام نمیکند
علت: URL نامعتبر یا Webhook غیرفعال شده
راهحل
- Webhook URL را مجدد از Teams Channel Settings کپی کنید
- مطمئن شوید Incoming Webhook connector هنوز فعال است
- Content-Type باید
application/jsonباشد - Body حداقل باید شامل
textیاattachmentsباشد:
{
"text": "پیام ساده",
"@type": "MessageCard",
"summary": "خلاصه"
}- برای Adaptive Card در Webhook از فرمت خاص استفاده کنید
