Mainstream messaging
Microsoft Teams
Durum: metin + DM ekleri desteklenir; kanal/grup dosyası göndermek için sharePointSiteId + Graph izinleri gerekir (bkz. Grup sohbetlerinde dosya gönderme). Anketler Adaptive Cards aracılığıyla gönderilir. Mesaj eylemleri, önce dosya gönderimleri için açıkça upload-file sunar.
Paketle birlikte gelen plugin
Microsoft Teams, güncel OpenClaw sürümlerinde paketle birlikte gelen bir plugin olarak sunulur; normal paketlenmiş derlemede ayrı kurulum gerekmez.
Paketle birlikte gelen Teams'i içermeyen eski bir derlemede veya özel kurulumda npm paketini doğrudan kurun:
openclaw plugins install @openclaw/msteamsGüncel resmî sürüm etiketini takip etmek için sürüm belirtilmemiş paketi kullanın. Yalnızca tekrarlanabilir bir kurulum gerektiğinde tam bir sürümü sabitleyin.
Yerel çalışma kopyası (bir git deposundan çalıştırırken):
openclaw plugins install ./path/to/local/msteams-pluginAyrıntılar: Plugin'ler
Hızlı kurulum
@microsoft/teams.cli, bot kaydını, manifest oluşturmayı ve kimlik bilgisi üretimini tek komutla gerçekleştirir.
1. Kurun ve oturum açın
npm install -g @microsoft/teams.cli@previewteams loginteams status # oturum açtığınızı doğrulayın ve kiracı bilgilerinizi görüntüleyin2. Bir tünel başlatın (Teams localhost'a erişemez)
Gerekirse devtunnel CLI'yi kurup kimlik doğrulaması yapın (başlangıç kılavuzu).
# Tek seferlik kurulum (oturumlar arasında kalıcı URL):devtunnel create my-openclaw-bot --allow-anonymousdevtunnel port create my-openclaw-bot -p 3978 --protocol auto # Her geliştirme oturumunda:devtunnel host my-openclaw-bot# Uç noktanız: https://<tunnel-id>.devtunnels.ms/api/messagesAlternatifler: ngrok http 3978 veya tailscale funnel 3978 (URL'ler her oturumda değişebilir).
3. Uygulamayı oluşturun
teams app create \ --name "OpenClaw" \ --endpoint "https://<your-tunnel-url>/api/messages"Bu komut bir Entra ID (Azure AD) uygulaması oluşturur, bir istemci gizli anahtarı üretir, bir Teams uygulama manifesti (simgelerle birlikte) oluşturup yükler ve Teams tarafından yönetilen bir bot kaydeder (Azure aboneliği gerekmez). Çıktı; CLIENT_ID, CLIENT_SECRET, TENANT_ID ve bir Teams Uygulama Kimliği içerir; ayrıca uygulamayı doğrudan Teams'e yüklemeyi teklif eder.
4. OpenClaw'ı yapılandırın; bunun için çıktıdaki kimlik bilgilerini kullanın:
{ channels: { msteams: { enabled: true, appId: "<CLIENT_ID>", appPassword: "<CLIENT_SECRET>", tenantId: "<TENANT_ID>", webhook: { port: 3978, path: "/api/messages" }, }, },}Alternatif olarak ortam değişkenlerini doğrudan kullanın: MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID.
5. Uygulamayı Teams'e yükleyin
teams app create, uygulamayı yüklemenizi ister; "Install in Teams" seçeneğini belirleyin. Yükleme bağlantısını daha sonra almak için:
teams app get <teamsAppId> --install-link6. Her şeyin çalıştığını doğrulayın
teams app doctor <teamsAppId>Bot kaydı, AAD uygulama yapılandırması, manifest geçerliliği ve SSO kurulumu genelinde tanılamalar çalıştırır.
Üretim ortamında istemci gizli anahtarları yerine federe kimlik doğrulamasını (sertifika veya yönetilen kimlik) değerlendirin.
Hedefler
- Teams DM'leri, grup sohbetleri veya kanalları aracılığıyla OpenClaw ile konuşun.
- Yönlendirmeyi deterministik tutun: yanıtlar her zaman geldikleri kanala geri gider.
- Varsayılan olarak güvenli kanal davranışını kullanın (aksi yapılandırılmadıkça bahsetme gerekir).
Yapılandırma yazımları
Microsoft Teams, varsayılan olarak /config set|unset tarafından tetiklenen yapılandırma güncellemelerini yazabilir (commands.config: true gerekir).
Şununla devre dışı bırakın:
{ channels: { msteams: { configWrites: false } },}Erişim denetimi (DM'ler + gruplar)
DM erişimi
- Varsayılan:
channels.msteams.dmPolicy = "pairing". Bilinmeyen göndericiler onaylanana kadar yok sayılır. channels.msteams.allowFrom, kararlı AAD nesne kimliklerini veyaaccessGroup:core-teamgibi statik gönderici erişim gruplarını kullanmalıdır.- İzin listeleri için UPN/görünen ad eşleştirmesine güvenmeyin; bunlar değişebilir. OpenClaw, doğrudan ad eşleştirmesini varsayılan olarak devre dışı bırakır; etkinleştirmek için
channels.msteams.dangerouslyAllowNameMatching: truekullanın. - Sihirbaz, kimlik bilgileri izin verdiğinde Microsoft Graph aracılığıyla adları kimliklere çözümleyebilir.
Grup erişimi
- Varsayılan:
channels.msteams.groupPolicy = "allowlist"(groupAllowFromeklemediğiniz sürece engellenir).channels.msteams.groupPolicyayarlanmamışsachannels.defaults.groupPolicy, paylaşılan varsayılanı geçersiz kılabilir. channels.msteams.groupAllowFrom, grup sohbetlerinde/kanallarda hangi göndericilerin veya statik gönderici erişim gruplarının tetikleme yapabileceğini denetler (channels.msteams.allowFromayarına geri döner).- Herhangi bir üyeye izin vermek için
groupPolicy: "open"ayarını belirleyin (varsayılan olarak yine bahsetme koşulludur). - Tüm kanalları engellemek için
channels.msteams.groupPolicy: "disabled"ayarını belirleyin.
Örnek:
{ channels: { msteams: { groupPolicy: "allowlist", groupAllowFrom: ["00000000-0000-0000-0000-000000000000", "accessGroup:core-team"], }, },}Ekip + kanal izin listesi
- Ekipleri ve kanalları
channels.msteams.teamsaltında listeleyerek grup/kanal yanıtlarının kapsamını belirleyin. - Anahtar olarak değiştirilebilir görünen adları değil, Teams bağlantılarındaki kararlı Teams konuşma kimliklerini kullanın (bkz. Ekip ve Kanal Kimlikleri).
groupPolicy="allowlist"ve bir ekip izin listesi mevcut olduğunda yalnızca listelenen ekipler/kanallar kabul edilir (bahsetme koşuluyla).- Yapılandırma sihirbazı
Team/Channelgirdilerini kabul eder ve bunları sizin için saklar. - Başlatma sırasında OpenClaw, ekip/kanal ve kullanıcı izin listesindeki adları kimliklere çözümler (Graph izinleri elverdiğinde) ve eşlemeyi günlüğe kaydeder. Çözümlenemeyen adlar yazıldığı hâliyle tutulur ancak
channels.msteams.dangerouslyAllowNameMatching: trueayarlanmadıkça yönlendirme için yok sayılır.
Örnek:
{ channels: { msteams: { groupPolicy: "allowlist", teams: { "My Team": { channels: { General: { requireMention: true }, }, }, }, }, },}Manuel kurulum (Teams CLI olmadan)
Nasıl çalışır?
- Microsoft Teams plugin'inin kullanılabilir olduğundan emin olun (güncel sürümlerde paketle birlikte gelir).
- Bir Azure Bot oluşturun (Uygulama Kimliği + gizli anahtar + kiracı kimliği).
- Aşağıdaki RSC izinlerini içeren ve bota başvuran bir Teams uygulama paketi oluşturun.
- Teams uygulamasını bir ekibe (veya DM'ler için kişisel kapsama) yükleyin/kurun.
~/.openclaw/openclaw.jsoniçindemsteamsayarını yapılandırın (veya ortam değişkenlerini kullanın) ve Gateway'i başlatın.- Gateway, varsayılan olarak
/api/messagesüzerinde Bot Framework Webhook trafiğini dinler.
1. Adım: Azure Bot oluşturun
-
Create Azure Bot sayfasına gidin.
-
Basics sekmesini doldurun:
Alan Değer Bot handle Botunuzun adı, ör. openclaw-msteams(benzersiz olmalıdır)Subscription Azure aboneliğinizi seçin Resource group Yeni oluşturun veya mevcut olanı kullanın Pricing tier Geliştirme/test için Free Type of App Single Tenant (önerilir; aşağıdaki nota bakın) Creation type Create new Microsoft App ID
- Review + create, ardından Create düğmesine tıklayın (~1-2 dakika).
2. Adım: Kimlik bilgilerini alın
- Azure Bot kaynağı → Configuration → Microsoft App ID değerini kopyalayın (
appIddeğeriniz). - Manage Password → App Registration → Certificates & secrets → New client secret → Value değerini kopyalayın (
appPassworddeğeriniz). - Overview → Directory (tenant) ID değerini kopyalayın (
tenantIddeğeriniz).
3. Adım: Mesajlaşma uç noktasını yapılandırın
- Azure Bot → Configuration.
- Messaging endpoint ayarını belirleyin:
- Üretim:
https://your-domain.com/api/messages - Yerel geliştirme: bir tünel kullanın (bkz. Yerel geliştirme)
- Üretim:
4. Adım: Teams kanalını etkinleştirin
- Azure Bot → Channels.
- Microsoft Teams → Configure → Save öğelerine tıklayın.
- Hizmet Şartları'nı kabul edin.
5. Adım: Teams uygulama manifestini oluşturun
botId = <App ID>içeren birbotgirdisi ekleyin.- Kapsamlar:
personal,team,groupChat. supportsFiles: true(kişisel kapsamda dosya işleme için gereklidir).- RSC izinlerini ekleyin (bkz. RSC izinleri).
- Simgeleri oluşturun:
outline.png(32x32) vecolor.png(192x192). manifest.json,outline.pngvecolor.pngdosyalarını birlikte zip arşivine alın.
6. Adım: OpenClaw'ı yapılandırın
{ channels: { msteams: { enabled: true, appId: "<APP_ID>", appPassword: "<APP_PASSWORD>", tenantId: "<TENANT_ID>", webhook: { port: 3978, path: "/api/messages" }, }, },}Ortam değişkenleri: MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID.
7. Adım: Gateway'i çalıştırın
Plugin kullanılabilir olduğunda ve msteams yapılandırması kimlik bilgilerini içerdiğinde Teams kanalı otomatik olarak başlar.
Federe kimlik doğrulaması (sertifika ve yönetilen kimlik)
OpenClaw, üretim ortamında istemci gizli anahtarlarına alternatif olarak channels.msteams.authType: "federated" aracılığıyla federe kimlik doğrulamasını destekler. İki yöntem vardır:
A Seçeneği: Sertifika tabanlı kimlik doğrulaması
Entra ID uygulama kaydınızla kaydedilmiş bir PEM sertifikası kullanın.
Kurulum:
- Bir sertifika oluşturun veya edinin (özel anahtar içeren PEM biçimi).
- Entra ID → App Registration → Certificates & secrets → Certificates → ortak sertifikayı yükleyin.
Yapılandırma:
{ channels: { msteams: { enabled: true, appId: "<APP_ID>", tenantId: "<TENANT_ID>", authType: "federated", certificatePath: "/path/to/cert.pem", webhook: { port: 3978, path: "/api/messages" }, }, },}Ortam değişkenleri:
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem
B Seçeneği: Azure Managed Identity
Azure altyapısında (AKS, App Service, Azure VM'leri) parolasız kimlik doğrulaması için Azure Managed Identity kullanın.
Nasıl çalışır?
- Bot pod'u/VM'si, yönetilen bir kimliğe (sistem veya kullanıcı tarafından atanmış) sahiptir.
- Federe kimlik bilgisi, yönetilen kimliği Entra ID uygulama kaydına bağlar.
- OpenClaw, çalışma zamanında Azure IMDS uç noktasından token almak için
@azure/identitykullanır. - Token, bot kimlik doğrulaması için Teams SDK'ya iletilir.
Ön koşullar:
- Yönetilen kimliğin etkinleştirildiği Azure altyapısı (AKS iş yükü kimliği, App Service, VM).
- Entra ID uygulama kaydında oluşturulmuş federasyon kimlik bilgisi.
- Pod/VM'den IMDS'ye (
169.254.169.254:80) ağ erişimi.
Yapılandırma (sistem tarafından atanan yönetilen kimlik):
{ channels: { msteams: { enabled: true, appId: "<APP_ID>", tenantId: "<TENANT_ID>", authType: "federated", useManagedIdentity: true, webhook: { port: 3978, path: "/api/messages" }, }, },}Yapılandırma (kullanıcı tarafından atanan yönetilen kimlik): yukarıdaki bloğa managedIdentityClientId: "<MI_CLIENT_ID>" ekleyin.
Ortam değişkenleri:
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_USE_MANAGED_IDENTITY=trueMSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>(yalnızca kullanıcı tarafından atanan)
AKS İş Yükü Kimliği kurulumu
İş yükü kimliğini kullanan AKS dağıtımları için:
-
AKS kümenizde iş yükü kimliğini etkinleştirin.
-
Entra ID uygulama kaydında bir federasyon kimlik bilgisi oluşturun:
bash az ad app federated-credential create --id <APP_OBJECT_ID> --parameters '{ "name": "my-bot-workload-identity", "issuer": "<AKS_OIDC_ISSUER_URL>", "subject": "system:serviceaccount:<NAMESPACE>:<SERVICE_ACCOUNT>", "audiences": ["api://AzureADTokenExchange"]}' -
Uygulama istemci kimliğiyle Kubernetes hizmet hesabına ek açıklama ekleyin:
yaml apiVersion: v1kind: ServiceAccountmetadata: name: my-bot-sa annotations: azure.workload.identity/client-id: "<APP_CLIENT_ID>" -
İş yükü kimliği ekleme işlemi için pod'u etiketleyin:
yaml metadata: labels: azure.workload.identity/use: "true" -
IMDS'ye (
169.254.169.254) ağ erişimine izin verin: NetworkPolicy kullanılıyorsa 80 numaralı bağlantı noktasında169.254.169.254/32için bir çıkış kuralı ekleyin.
Kimlik doğrulama türlerinin karşılaştırması
| Yöntem | Yapılandırma | Avantajlar | Dezavantajlar |
|---|---|---|---|
| İstemci gizli anahtarı | appPassword |
Basit kurulum | Gizli anahtar döndürme gerekir, daha az güvenlidir |
| Sertifika | authType: "federated" + certificatePath |
Ağ üzerinden paylaşılan gizli anahtar yoktur | Sertifika yönetimi ek yükü |
| Yönetilen Kimlik | authType: "federated" + useManagedIdentity |
Parolasızdır, yönetilecek gizli anahtar yoktur | Azure altyapısı gerekir |
certificateThumbprint, certificatePath ile birlikte ayarlanabilir ancak şu anda kimlik doğrulama yolu tarafından okunmaz; yalnızca ileriye dönük uyumluluk için kabul edilir.
Varsayılan: authType ayarlanmadığında OpenClaw, istemci gizli anahtarıyla kimlik doğrulamasını (appPassword) kullanır. Mevcut yapılandırmalar değişiklik yapılmadan çalışmaya devam eder.
Yerel geliştirme (tünelleme)
Teams, localhost adresine erişemez. URL'nin oturumlar arasında sabit kalması için kalıcı bir geliştirme tüneli kullanın:
# Tek seferlik kurulum:devtunnel create my-openclaw-bot --allow-anonymousdevtunnel port create my-openclaw-bot -p 3978 --protocol auto # Her geliştirme oturumunda:devtunnel host my-openclaw-botAlternatifler: ngrok http 3978 veya tailscale funnel 3978 (URL'ler her oturumda değişebilir).
Tünel URL'si değişirse uç noktayı güncelleyin:
teams app update <teamsAppId> --endpoint "https://<new-url>/api/messages"Botu test etme
Tanılamayı çalıştırın:
teams app doctor <teamsAppId>Bot kaydını, AAD uygulamasını, manifesti ve SSO yapılandırmasını tek geçişte denetler.
Test iletisi gönderin:
- Teams uygulamasını yükleyin (
teams app get <id> --install-linkiçindeki yükleme bağlantısı). - Teams'de botu bulun ve doğrudan ileti gönderin.
- Gelen etkinlik için Gateway günlüklerini denetleyin.
Ortam değişkenleri
Kimlik doğrulamayla ilgili bu yapılandırma anahtarları, openclaw.json yerine ortam değişkenleri aracılığıyla ayarlanabilir (örneğin groupPolicy veya historyLimit gibi diğer yapılandırma anahtarları yalnızca yapılandırma üzerinden ayarlanabilir):
| Ortam değişkeni | Yapılandırma anahtarı | Notlar |
|---|---|---|
MSTEAMS_APP_ID |
appId |
|
MSTEAMS_APP_PASSWORD |
appPassword |
|
MSTEAMS_TENANT_ID |
tenantId |
|
MSTEAMS_AUTH_TYPE |
authType |
"secret" veya "federated" |
MSTEAMS_CERTIFICATE_PATH |
certificatePath |
federasyon + sertifika |
MSTEAMS_CERTIFICATE_THUMBPRINT |
certificateThumbprint |
kabul edilir, kimlik doğrulama için gerekli değildir |
MSTEAMS_USE_MANAGED_IDENTITY |
useManagedIdentity |
federasyon + yönetilen kimlik |
MSTEAMS_MANAGED_IDENTITY_CLIENT_ID |
managedIdentityClientId |
yalnızca kullanıcı tarafından atanan yönetilen kimlik |
Üye bilgisi eylemi
OpenClaw, ajanların ve otomasyonların yapılandırılmış bir konuşma için doğrulanmış katılımcı listesi ayrıntılarını çözümleyebilmesi amacıyla Microsoft Teams için Graph destekli bir member-info eylemi sunar.
Gereksinimler:
ChannelSettings.Read.GroupveTeamMember.Read.GroupRSC izinleri (önerilen manifestte zaten bulunur).
Graph kimlik bilgileri yapılandırıldığında eylem kullanılabilir; ayrı bir channels.msteams.actions.memberInfo anahtarı yoktur.
Standart kanal aramaları; eşleşen ekip katılımcı listesi kimliğini, görünen adı, e-posta adresini ve rolleri döndürür.
Eylem, mevcut doğrudan ileti veya grup sohbetinde güvenilir gönderenin kararlı kullanıcı kimliğini döndürebilir.
Özel/paylaşılan kanal ve mevcut olmayan sohbet üyesi aramaları ek katılımcı listesi izinleri gerektirir
ve varsayılan izin temeli tarafından reddedilir.
Geçmiş bağlamı
channels.msteams.historyLimit, isteme kaç adet yakın tarihli kanal/grup iletisinin dahil edileceğini denetler. Öncemessages.groupChat.historyLimitdeğerine geri döner, ardından varsayılan olarak 50 değerini kullanır. Devre dışı bırakmak için0ayarlayın.- Getirilen ileti dizisi geçmişi, gönderen izin listelerine (
allowFrom/groupAllowFrom) göre filtrelenir; dolayısıyla ileti dizisi bağlamının başlangıç verileri yalnızca izin verilen gönderenlerin iletilerini içerir. - Alıntılanan ek bağlamı (bir yanıtın kendi eklerindeki Skype Reply şeması HTML'sinden ayrıştırılır) filtrelenmeden aktarılır; gönderen izin listesi filtresi şu anda yalnızca ileti dizisi geçmişinin başlangıç verilerine uygulanır.
- Doğrudan ileti geçmişi,
channels.msteams.dmHistoryLimit(kullanıcı sıraları) ile sınırlandırılabilir. Kullanıcı başına geçersiz kılmalar:channels.msteams.dms["<user_id>"].historyLimit.
Geçerli Teams RSC izinleri (manifest)
Bunlar, Teams uygulama manifestimizdeki mevcut resourceSpecific izinleridir. Yalnızca uygulamanın yüklü olduğu ekip/sohbet içinde geçerlidir.
Kanallar için (ekip kapsamı):
ChannelMessage.Read.Group(Application) - tüm kanal iletilerini @bahsetme olmadan alırChannelMessage.Send.Group(Application)Member.Read.Group(Application)Owner.Read.Group(Application)ChannelSettings.Read.Group(Application)TeamMember.Read.Group(Application)TeamSettings.Read.Group(Application)
Grup sohbetleri için:
ChatMessage.Read.Chat(Application) - tüm grup sohbeti iletilerini @bahsetme olmadan alır
Teams CLI aracılığıyla RSC izinlerini ekleyin:
teams app rsc add <teamsAppId> ChannelMessage.Read.Group --type ApplicationÖrnek Teams manifesti (bilgileri gizlenmiş)
Gerekli alanları içeren asgari ve geçerli örnek. Kimlikleri ve URL'leri değiştirin.
{ $schema: "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json", manifestVersion: "1.23", version: "1.0.0", id: "00000000-0000-0000-0000-000000000000", name: { short: "OpenClaw" }, developer: { name: "Your Org", websiteUrl: "https://example.com", privacyUrl: "https://example.com/privacy", termsOfUseUrl: "https://example.com/terms", }, description: { short: "OpenClaw in Teams", full: "OpenClaw in Teams" }, icons: { outline: "outline.png", color: "color.png" }, accentColor: "#5B6DEF", bots: [ { botId: "11111111-1111-1111-1111-111111111111", scopes: ["personal", "team", "groupChat"], isNotificationOnly: false, supportsCalling: false, supportsVideo: false, supportsFiles: true, }, ], webApplicationInfo: { id: "11111111-1111-1111-1111-111111111111", }, authorization: { permissions: { resourceSpecific: [ { name: "ChannelMessage.Read.Group", type: "Application" }, { name: "ChannelMessage.Send.Group", type: "Application" }, { name: "Member.Read.Group", type: "Application" }, { name: "Owner.Read.Group", type: "Application" }, { name: "ChannelSettings.Read.Group", type: "Application" }, { name: "TeamMember.Read.Group", type: "Application" }, { name: "TeamSettings.Read.Group", type: "Application" }, { name: "ChatMessage.Read.Chat", type: "Application" }, ], }, },}Manifest uyarıları (zorunlu alanlar)
bots[].botId, Azure Bot App ID ile eşleşmelidir.webApplicationInfo.id, Azure Bot App ID ile eşleşmelidir.bots[].scopes, kullanmayı planladığınız yüzeyleri (personal,team,groupChat) içermelidir.- Kişisel kapsamda dosya işleme için
bots[].supportsFiles: truegereklidir. authorization.permissions.resourceSpecific, kanal trafiği için kanal okuma/gönderme izinlerini içermelidir.
Mevcut bir uygulamayı güncelleme
# Manifesti indirin, düzenleyin ve yeniden yükleyinteams app manifest download <teamsAppId> manifest.json# manifest.json dosyasını yerel olarak düzenleyin...teams app manifest upload manifest.json <teamsAppId># İçerik değiştiyse sürüm otomatik olarak artırılırGüncellemeden sonra uygulamayı her ekibe yeniden yükleyin ve önbelleğe alınmış uygulama meta verilerini temizlemek için Teams'den tamamen çıkıp yeniden başlatın (yalnızca pencereyi kapatmayın).
Manuel manifest güncellemesi (CLI olmadan)
manifest.jsonöğesini yeni ayarlarla güncelleyin.versionalanını artırın (ör.1.0.0→1.1.0).- Manifesti simgelerle birlikte yeniden zip dosyasına dönüştürün (
manifest.json,outline.png,color.png). - Yeni zip dosyasını yükleyin:
- Teams Admin Center: Teams apps → Manage apps → uygulamanızı bulun → Upload new version.
- Sideload: Teams → Apps → Manage your apps → Upload a custom app.
Yetenekler: yalnızca RSC ve Graph karşılaştırması
Yalnızca Teams RSC ile (uygulama yüklü, Graph API izni yok)
Çalışanlar:
- Kanal iletilerinin metin içeriğini okuma.
- Kanal iletilerinin metin içeriğini gönderme.
- Kişisel (doğrudan ileti) dosya eklerini alma.
Çalışmayanlar:
- Kanal/grup görüntü veya dosya içerikleri (yük yalnızca bir HTML taslağı içerir).
- SharePoint/OneDrive'da depolanan ekleri indirme.
- Canlı Webhook olayının ötesindeki ileti geçmişini okuma.
Teams RSC + Microsoft Graph Application izinleri ile
Eklenenler:
- Barındırılan içeriği (iletilere yapıştırılmış görüntüler) indirme.
- SharePoint/OneDrive'da depolanan dosya eklerini indirme.
- Graph aracılığıyla kanal/sohbet iletisi geçmişini okuma.
RSC ve Graph API karşılaştırması
| Yetenek | RSC izinleri | Graph API |
|---|---|---|
| Gerçek zamanlı iletiler | Evet (webhook aracılığıyla) | Hayır (yalnızca yoklama) |
| Geçmiş iletiler | Hayır | Evet (geçmiş sorgulanabilir) |
| Kurulum karmaşıklığı | Yalnızca uygulama manifesti | Yönetici onayı + token akışı gerektirir |
| Çevrimdışı çalışır | Hayır (çalışıyor olmalıdır) | Evet (istenildiği zaman sorgulanabilir) |
Özet: RSC gerçek zamanlı dinleme, Graph API ise geçmişe erişim içindir. Çevrimdışıyken kaçırılan iletileri almak için ChannelMessage.Read.All ile Graph API gerekir (yönetici onayı gerektirir).
Graph destekli medya + geçmiş
Yalnızca kullandığınız Teams kapsamları ve verileri için gereken Microsoft Graph uygulama izinlerini etkinleştirin:
- Entra ID (Azure AD) App Registration → Graph Application permissions ekleyin:
- Kanal ekleri ve kanal geçmişi için
ChannelMessage.Read.All. - Grup sohbeti ekleri ve grup sohbeti geçmişi için
Chat.Read.All. - Ek baytlarının SharePoint/OneDrive depolama alanından indirilmesi gerektiğinde
Files.Read.All; yalnızca geçmiş kullanan kurulumlarda buna gerek yoktur.
- Kanal ekleri ve kanal geçmişi için
- Kiracı için Grant admin consent işlemini uygulayın.
- Teams uygulamasının manifest sürümünü artırın, yeniden yükleyin ve uygulamayı Teams'e yeniden kurun.
- Önbelleğe alınmış uygulama meta verilerini temizlemek için Teams'i tamamen kapatıp yeniden başlatın.
Kanal/grup dosyası kurtarma (graphMediaFallback)
Teams, bir bota gönderilen HTML etkinliğinden dosya işaretçilerini kaldırabilir. Bu durumda Bot Framework etkinliği sıradan bir HTML iletisinden ayırt edilemez; eksiksiz ek referansı yalnızca iletinin Graph kopyasında bulunur.
Yukarıdaki izinleri verdikten sonra geri dönüş mekanizmasını etkinleştirin:
{ channels: { msteams: { graphMediaFallback: true, }, },}Bu yalnızca kanallar ve grup sohbetleri için geçerlidir. Bir HTML etkinliği doğrudan indirilebilir medya üretmediğinde, sıradan veya yalnızca bahsetme içeren iletiler dâhil olmak üzere bir Graph ileti araması ekler. Mevcut kurulumların otomatik olarak ek Graph trafiği veya izin hatalarıyla karşılaşmaması için varsayılan değer false şeklindedir.
Kullanıcı bahsetmeleri: @bahsetmeleri, zaten konuşmada bulunan kullanıcılar için doğrudan çalışır. Mevcut konuşmada bulunmayan kullanıcıları dinamik olarak aramak ve onlardan bahsetmek için User.Read.All (Application) iznini ekleyip yönetici onayı verin.
Bilinen sınırlamalar
Webhook zaman aşımları
Teams iletileri HTTP webhook aracılığıyla iletir. OpenClaw bu webhook dinleyicisine sabit HTTP sunucusu zaman aşımları uygular: 30 sn hareketsizlik, toplam 30 sn istek ve üstbilgileri almak için 15 sn. İsteğe bağlı gelen medya ve bağlam zenginleştirme, paylaşılan 10 saniyelik bir bütçeye sahiptir. SDK, ham etkinlik kalıcı olarak eklendikten sonra döner; ajan dönüşü bağımsız olarak işlenir ve yanıtları proaktif biçimde gönderir. İstek işleme veya kalıcı kabul işlemi aktarım penceresini kaçırırsa Teams etkinliği yeniden deneyebilir ve giriş mezar taşı yinelenen bir etkinlik kimliğini reddeder.
Teams bulutu ve hizmet URL'si desteği
SDK destekli bu Teams yolu, Microsoft Teams genel bulutu için canlı ortamda doğrulanmıştır.
Gelen yanıtlarda, gelen Teams SDK dönüş bağlamı kullanılır. Bağlam dışı proaktif işlemler (gönderimler, düzenlemeler, silmeler, kartlar, anketler, dosya onayı iletileri ve kuyruğa alınmış uzun süreli yanıtlar) depolanan serviceUrl konuşma referansını kullanır. Genel bulut, varsayılan olarak Teams SDK genel bulut ortamını kullanır ve genel Teams Connector ana makinesindeki depolanmış referanslara izin verir: https://smba.trafficmanager.net/.
Genel bulut varsayılandır. Normal genel bulut botları için channels.msteams.cloud veya channels.msteams.serviceUrl ayarlamanız gerekmez.
Genel olmayan Teams bulutları için cloud ve Microsoft yayımladığında eşleşen proaktif sınırı ayarlayın:
channels.msteams.cloud; kimlik doğrulama, JWT doğrulaması, token hizmetleri ve Graph kapsamı için Teams SDK bulut ön ayarını seçer.channels.msteams.serviceUrl; proaktif gönderimler, düzenlemeler, silmeler, kartlar, anketler, dosya onayı iletileri ve kuyruğa alınmış uzun süreli yanıtlar öncesinde depolanan konuşma referanslarını doğrulamak için kullanılan Bot Connector uç noktası sınırını seçer. USGov ve DoD SDK bulutları için gereklidir. China/21Vianet için OpenClaw, SDKChinaön ayarını kullanır ve depolanan/yapılandırılan hizmet URL'lerini yalnızca Azure China Bot Framework kanal ana makinelerinde kabul eder.
Microsoft, genel proaktif Bot Connector uç noktalarını Teams proaktif mesajlaşma belgelerinin Konuşmayı oluşturma bölümünde yayımlar. Varsa gelen etkinliğin serviceUrl değerini kullanın; aksi takdirde aşağıdaki Microsoft tablosunu kullanın.
| Teams ortamı | OpenClaw yapılandırması | Proaktif serviceUrl |
|---|---|---|
| Genel | bulut/serviceUrl yapılandırması gerekmez | https://smba.trafficmanager.net/teams |
| GCC | serviceUrl ayarlayın; ayrı bir Teams SDK bulut ön ayarı yoktur |
https://smba.infra.gcc.teams.microsoft.com/teams |
| GCC High | cloud: "USGov" + serviceUrl |
https://smba.infra.gov.teams.microsoft.us/teams |
| DoD | cloud: "USGovDoD" + serviceUrl |
https://smba.infra.dod.teams.microsoft.us/teams |
| China/21Vianet | cloud: "China" |
gelen etkinliğin serviceUrl değerini kullanın |
Microsoft'un ayrı bir proaktif hizmet URL'si belgelediği ancak Teams SDK'nın ayrı bir GCC bulut ön ayarı sunmadığı GCC örneği:
{ "channels": { "msteams": { "serviceUrl": "https://smba.infra.gcc.teams.microsoft.com/teams" } }}GCC High örneği:
{ "channels": { "msteams": { "cloud": "USGov", "serviceUrl": "https://smba.infra.gov.teams.microsoft.us/teams" } }}channels.msteams.serviceUrl, desteklenen Microsoft Teams Bot Connector ana makineleriyle sınırlıdır. Bir hizmet URL'si yapılandırıldığında OpenClaw; proaktif gönderimler, düzenlemeler, silmeler, kartlar, anketler veya kuyruğa alınmış uzun süreli yanıtlar çalıştırılmadan önce depolanan konuşmanın serviceUrl değerinin aynı ana makineyi kullandığını denetler. Varsayılan genel bulut yapılandırmasında, depolanan bir konuşma genel Teams Connector ana makinesinin dışını gösteriyorsa OpenClaw güvenli biçimde başarısız olur. Depolanan konuşma referansının güncel olması için bulut/hizmet URL'si ayarlarını değiştirdikten sonra konuşmadan yeni bir ileti alın.
Microsoft'un Teams proaktif uç nokta tablosunda China/21Vianet için ayrı bir genel proaktif smba URL'si yoktur. Teams SDK'nın Azure China kimlik doğrulama, token ve JWT uç noktalarını kullanması için cloud: "China" yapılandırın. Bundan sonra proaktif gönderimler, Azure China Bot Framework kanal sınırında (*.botframework.azure.cn) gelen bir China Teams etkinliğinden depolanmış bir konuşma referansı veya açıkça yapılandırılmış bir hizmet URL'si gerektirir. OpenClaw, Graph isteklerini Azure China Graph uç noktası üzerinden yönlendirene kadar Graph destekli Teams yardımcıları cloud: "China" için devre dışıdır.
Biçimlendirme
Teams markdown'ı Slack veya Discord'a göre daha sınırlıdır:
- Temel biçimlendirme çalışır: kalın, italik,
code, bağlantılar. - Karmaşık markdown (tablolar, iç içe listeler) doğru görüntülenmeyebilir.
- Anketler ve anlamsal sunum gönderimleri için Adaptive Cards desteklenir (aşağıya bakın).
Yapılandırma
Temel ayarlar (paylaşılan kanal kalıpları için /gateway/configuration sayfasına bakın):
channels.msteams.enabled: kanalı etkinleştirin/devre dışı bırakın.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: bot kimlik bilgileri.channels.msteams.cloud: Teams SDK bulut ortamı (Public,USGov,USGovDoDveyaChina; varsayılanPublic). USGov/DoD SDK bulutları içinserviceUrlile ayarlayın; Çin, SDK ön ayarını ve depolanan Azure China Bot Framework konuşma referanslarını kullanır; Azure China Graph yönlendirmesi kullanıma sunulana kadar Graph destekli yardımcılar devre dışıdır.channels.msteams.serviceUrl: SDK proaktif işlemleri için Bot Connector hizmet URL'si sınırı. Genel bulut SDK varsayılanını kullanır; GCC (https://smba.infra.gcc.teams.microsoft.com/teams), GCC High veya DoD için ayarlayın. Depolanan konuşma referansı 21Vianet tarafından işletilen Teams'den geldiğinde Çin, Azure China Bot Framework kanal ana makinelerini kabul eder.channels.msteams.webhook.port(varsayılan3978).channels.msteams.webhook.path(varsayılan/api/messages).channels.msteams.dmPolicy:pairing | allowlist | open | disabled(varsayılanpairing).channels.msteams.allowFrom: DM izin listesi (AAD nesne kimlikleri önerilir). Graph erişimi kullanılabilir olduğunda sihirbaz, kurulum sırasında adları kimliklere çözümler.channels.msteams.dangerouslyAllowNameMatching: değiştirilebilir UPN/görünen ad eşleştirmesini ve doğrudan ekip/kanal adı yönlendirmesini yeniden etkinleştiren acil durum anahtarı.channels.msteams.textChunkLimit: karakter cinsinden giden metin parçası boyutu (varsayılan4000; yapılandırılan değer daha yüksek olsa bile kesin üst sınır4000).channels.msteams.streaming.chunkMode: uzunluğa göre parçalara ayırmadan önce boş satırlardan (paragraf sınırlarından) bölmek içinlength(varsayılan) veyanewline.channels.msteams.mediaAllowHosts: gelen eklerin ana makineleri için izin listesi (varsayılan olarak Microsoft/Teams etki alanları: Graph, SharePoint/OneDrive, Teams CDN, Bot Framework, Azure Media Services).channels.msteams.mediaAuthAllowHosts: medya yeniden denemelerinde Authorization üstbilgilerinin eklenmesine yönelik izin listesi (varsayılan olarak Graph + Bot Framework ana makineleri).channels.msteams.graphMediaFallback: kanal/grup HTML'si dosya işaretçilerini içermediğinde Graph ileti aramalarını etkinleştirin (varsayılanfalse; bkz. Kanal/grup dosya kurtarma).channels.msteams.mediaMaxMb: kanal başına medya boyutu sınırını MB cinsinden geçersiz kılma. Ayarlanmadığındaagents.defaults.mediaMaxMbdeğerine geri döner.channels.msteams.requireMention: kanallarda/gruplarda @bahsetme gerektirir (varsayılantrue).channels.msteams.replyStyle:thread | top-level(bkz. Yanıt biçimi).channels.msteams.teams.<teamId>.replyStyle: ekip başına geçersiz kılma.channels.msteams.teams.<teamId>.requireMention: ekip başına geçersiz kılma.channels.msteams.teams.<teamId>.tools: kanal geçersiz kılması eksik olduğunda kullanılan varsayılan ekip başına araç politikası geçersiz kılmaları (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.toolsBySender: ekip başına ve gönderen başına varsayılan araç politikası geçersiz kılmaları ("*"joker karakteri desteklenir).channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: kanal başına geçersiz kılma.channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: kanal başına geçersiz kılma.channels.msteams.teams.<teamId>.channels.<conversationId>.tools: kanal başına araç politikası geçersiz kılmaları (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: kanal başına ve gönderen başına araç politikası geçersiz kılmaları ("*"joker karakteri desteklenir).toolsBySenderanahtarları açık önekler kullanmalıdır:channel:,id:,e164:,username:,name:(önek içermeyen eski anahtarlar hâlâ yalnızcaid:ile eşlenir).channels.msteams.authType: kimlik doğrulama türü -"secret"(varsayılan) veya"federated".channels.msteams.certificatePath: PEM sertifika dosyasının yolu (federe + sertifika kimlik doğrulaması).channels.msteams.certificateThumbprint: sertifika parmak izi; kabul edilir, kimlik doğrulaması için zorunlu değildir.channels.msteams.useManagedIdentity: yönetilen kimlik doğrulamasını etkinleştirin (federe mod).channels.msteams.managedIdentityClientId: kullanıcı tarafından atanan yönetilen kimlik için istemci kimliği.channels.msteams.sharePointSiteId: grup sohbetlerinde/kanallarda dosya yüklemeleri için SharePoint site kimliği (bkz. Grup sohbetlerinde dosya gönderme).channels.msteams.welcomeCard,channels.msteams.groupWelcomeCard,channels.msteams.promptStarters: ilk DM/grup iletişiminde gösterilen karşılama Adaptive Card'ı ve önerilen istem düğmeleri.channels.msteams.responsePrefix: giden yanıtların başına eklenen metin.channels.msteams.feedbackEnabled(varsayılantrue),channels.msteams.feedbackReflection(varsayılantrue),channels.msteams.feedbackReflectionCooldownMs: yanıtlarda başparmak yukarı/aşağı geri bildirimi ve olumsuz geri bildirim üzerine düşünme takibi.channels.msteams.sso,channels.msteams.delegatedAuth: SSO destekli akışlar için Bot Framework OAuth bağlantısı ve devredilmiş Graph kapsamları;sso.enabled: true,sso.connectionNamegerektirir.
Yönlendirme ve oturumlar
- Oturum anahtarları standart aracı biçimini izler (bkz. /concepts/session):
- Doğrudan iletiler ana oturumu paylaşır (
agent:<agentId>:<mainKey>). - Kanal/grup iletileri konuşma kimliğini kullanır:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Doğrudan iletiler ana oturumu paylaşır (
Yanıt biçimi: ileti dizileri ve gönderiler
Teams, aynı temel veri modeli üzerinde iki kanal kullanıcı arayüzü biçimine sahiptir:
| Biçim | Açıklama | Önerilen replyStyle |
|---|---|---|
| Gönderiler (klasik) | İletiler, altında ileti dizili yanıtlar bulunan kartlar olarak görünür | thread (varsayılan) |
| İleti dizileri (Slack benzeri) | İletiler, Slack'e daha benzer biçimde doğrusal olarak akar | top-level |
Sorun: Teams API'si bir kanalın hangi kullanıcı arayüzü biçimini kullandığını göstermez. Yanlış replyStyle kullanırsanız:
- İleti dizisi biçimindeki bir kanalda
thread→ yanıtlar uygunsuz biçimde iç içe görünür. - Gönderi biçimindeki bir kanalda
top-level→ yanıtlar ileti dizisi içinde olmak yerine ayrı üst düzey gönderiler olarak görünür.
Çözüm: kanalın nasıl ayarlandığına bağlı olarak replyStyle değerini kanal başına yapılandırın:
{ channels: { msteams: { replyStyle: "thread", teams: { "19:abc...@thread.tacv2": { channels: { "19:xyz...@thread.tacv2": { replyStyle: "top-level", }, }, }, }, }, },}Çözümleme önceliği
Bot bir kanala yanıt gönderdiğinde replyStyle, en özel geçersiz kılmadan varsayılana doğru çözümlenir. undefined olmayan ilk değer geçerli olur:
- Kanal başına -
channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle - Ekip başına -
channels.msteams.teams.<teamId>.replyStyle - Genel -
channels.msteams.replyStyle - Örtük varsayılan -
requireMentionüzerinden türetilir:requireMention: true→threadrequireMention: false→top-level
Açık bir replyStyle olmadan requireMention: false değerini genel olarak ayarlarsanız, gelen ileti bir ileti dizisi yanıtı olsa bile Gönderi biçimindeki kanallarda bahsetmeler üst düzey gönderiler olarak görünür. Beklenmedik durumları önlemek için replyStyle: "thread" değerini genel, ekip veya kanal düzeyinde sabitleyin.
Depolanan bir kanal konuşmasına yapılan proaktif gönderimlerde (kuyruğa alınmış araç çağrısı yanıtları, uzun süre çalışan aracılar) aynı ekip/kanal çözümlemesi uygulanır; grup sohbetleri ve kişisel (DM) konuşmalar, replyStyle değerinden bağımsız olarak proaktif gönderimler için her zaman top-level değerine çözümlenir.
İleti dizisi bağlamını koruma
replyStyle: "thread" geçerliyken ve bottan bir kanal ileti dizisinin içinden @bahsedildiğinde OpenClaw, yanıtın aynı ileti dizisinin içine düşmesi için özgün ileti dizisi kökünü giden konuşma referansına (19:...@thread.tacv2;messageid=<root>) yeniden ekler. Bu, hem canlı (aynı tur içindeki) gönderimler hem de Bot Framework tur bağlamı sona erdikten sonra yapılan proaktif gönderimler (ör. uzun süre çalışan aracılar, mcp__openclaw__message üzerinden kuyruğa alınmış araç çağrısı yanıtları) için geçerlidir.
İleti dizisi kökü, konuşma referansında depolanan threadId değerinden alınır. threadId öncesinden kalan eski depolanmış referanslar, activityId değerine (konuşmayı en son başlatan gelen etkinlik neyse ona) geri döner; böylece mevcut dağıtımların yeniden başlatılmadan çalışmayı sürdürmesi sağlanır.
replyStyle: "top-level" geçerliyken kanal ileti dizilerinden gelen iletiler kasıtlı olarak yeni üst düzey gönderilerle yanıtlanır; ileti dizisi soneki eklenmez. Bu, İleti dizisi biçimindeki kanallar için doğrudur; ileti dizili yanıtlar beklediğiniz yerde üst düzey gönderiler görünüyorsa replyStyle o kanal için yanlış ayarlanmıştır.
Ekler ve görüntüler
Mevcut sınırlamalar:
- DM'ler: görüntüler ve dosya ekleri Teams bot dosya API'leri üzerinden çalışır.
- Kanallar/gruplar: ekler M365 depolama alanında (SharePoint/OneDrive) bulunur. Webhook yükü gerçek dosya baytlarını değil, yalnızca bir HTML taslağını içerir. Kanal eklerini indirmek için Graph API izinleri gereklidir.
- Açıkça önce dosya göndermek için
action=upload-filedeğerinimedia/filePath/pathile kullanın; isteğe bağlımessageeşlik eden metin/yorum olur vefilename(veyatitle) yüklenen adı geçersiz kılar.
Graph izinleri olmadan görüntü içeren kanal iletileri yalnızca metin olarak gelir (görüntü içeriğine bot tarafından erişilemez).
OpenClaw varsayılan olarak medyayı yalnızca Microsoft/Teams ana makine adlarından indirir. channels.msteams.mediaAllowHosts ile geçersiz kılın (herhangi bir ana makineye izin vermek için ["*"] kullanın).
Authorization üstbilgileri yalnızca channels.msteams.mediaAuthAllowHosts içindeki ana makineler için eklenir (varsayılan olarak Graph + Bot Framework ana makineleri). Bu listeyi sıkı tutun (çok kiracılı soneklerden kaçının).
Grup sohbetlerinde dosya gönderme
Botlar, yerleşik FileConsentCard akışını kullanarak DM'lerde dosya gönderebilir. Grup sohbetlerinde/kanallarda dosya gönderme ek kurulum gerektirir:
| Bağlam | Dosyaların gönderilme biçimi | Gerekli kurulum |
|---|---|---|
| DM'ler | FileConsentCard → kullanıcı kabul eder → bot yükler | Kullanıma hazır olarak çalışır |
| Grup sohbetleri/kanallar | SharePoint'e yükleme → yerel dosya kartı | sharePointSiteId + Graph izinleri gerektirir |
| Görüntüler (herhangi bir bağlam) | Base64 kodlu satır içi | Kullanıma hazır olarak çalışır |
Grup sohbetleri neden SharePoint gerektirir?
Botlar bir uygulama kimliği kullanırken Microsoft Graph'ın /me kaynağı oturum açmış bir kullanıcı gerektirir. Grup sohbetlerinde/kanallarda dosya göndermek için bot, dosyayı bir SharePoint sitesine yükler ve bir paylaşım bağlantısı oluşturur.
Kurulum
-
Entra ID (Azure AD) → App Registration içinde Graph API izinlerini ekleyin:
Sites.ReadWrite.All(Uygulama) - SharePoint'e dosya yükleyin.ChatMember.Read.All(Uygulama) - grup sohbeti dosya gönderimleri için en az ayrıcalıklı, kiracı genelinde izin.Chat.Read.Allde çalışır ve grup sohbeti geçmişi etkinleştirildiğinde bunu zaten kapsar. Sohbet başına alternatif olarakChatMember.Read.Chatkaynağa özgü onay iznini kullanın.
-
Kiracı için yönetici onayı verin.
-
SharePoint site kimliğinizi alın:
bash # Graph Explorer veya geçerli bir belirteçle curl aracılığıyla:curl -H "Authorization: Bearer $TOKEN" \ "https://graph.microsoft.com/v1.0/sites/{hostname}:/{site-path}" # Örnek: "contoso.sharepoint.com/sites/BotFiles" konumundaki bir site içincurl -H "Authorization: Bearer $TOKEN" \ "https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/BotFiles" # Yanıt şunu içerir: "id": "contoso.sharepoint.com,guid1,guid2" -
OpenClaw'ı yapılandırın:
json5 { channels: { msteams: { // ... diğer yapılandırmalar ... sharePointSiteId: "contoso.sharepoint.com,guid1,guid2", }, },}
Paylaşım davranışı
| Bağlam ve izin | Paylaşım davranışı |
|---|---|
Kanal + Sites.ReadWrite.All |
Kuruluş genelinde paylaşım bağlantısı (kuruluştaki herkes erişebilir) |
Grup sohbeti + Sites.ReadWrite.All + desteklenen bir sohbet üyesi okuma izni |
Kullanıcı başına paylaşım bağlantısı (yalnızca sohbet üyeleri erişebilir) |
| Desteklenen bir sohbet üyesi okuma izni olmayan grup sohbeti | Gönderim güvenli biçimde başarısız olur |
Yalnızca sohbet katılımcıları dosyaya erişebildiğinden kullanıcı başına paylaşım daha güvenlidir. OpenClaw, grup sohbetleri için başarılı bir üye sorgulaması gerektirir; zaman aşımları, aktarım hataları, boş sonuçlar ve Graph API retleri, erişimi kuruluşun geneline genişletmek yerine gönderimin başarısız olmasına neden olur.
Geri dönüş davranışı
| Senaryo | Sonuç |
|---|---|
| Grup sohbeti + dosya + yapılandırılmış SharePoint ve üye izinleri | SharePoint'e yükle, yerel bir dosya kartı gönder |
| Grup sohbeti + dosya + eksik SharePoint veya üye izinleri | Uygulanabilir bir yapılandırma hatasıyla başarısız ol |
Kanal + dosya + yapılandırılmış sharePointSiteId |
SharePoint'e yükle, yerel bir dosya kartı gönder |
| Kişisel sohbet + dosya | FileConsentCard akışı (SharePoint olmadan çalışır) |
| Herhangi bir bağlam + görüntü | Base64 kodlu satır içi veri (SharePoint olmadan çalışır) |
Dosyaların depolandığı konum
Yüklenen dosyalar, yapılandırılmış SharePoint sitesinin varsayılan belge kitaplığındaki bir /OpenClawShared/ klasöründe depolanır.
Anketler (Adaptive Cards)
OpenClaw, Teams anketlerini Adaptive Cards olarak gönderir (yerel bir Teams anket API'si yoktur).
- CLI:
openclaw message poll --channel msteams --target conversation:<id> --poll-question "..." --poll-option "..." --poll-option "...". - Oylar, Gateway tarafından OpenClaw Plugin durumu SQLite veritabanında
state/openclaw.sqlitealtında kaydedilir. - Mevcut
msteams-polls.jsondosyaları, çalışan Plugin tarafından değil,openclaw doctor --fixtarafından içe aktarılır. - Oyların kaydedilmesi için Gateway çevrimiçi kalmalıdır.
- Anketler sonuç özetlerini otomatik olarak yayımlamaz ve henüz bir anket sonuçları CLI'si yoktur.
Sunum kartları
message aracını, CLI'yi veya normal yanıt teslimini kullanarak Teams kullanıcılarına ya da konuşmalarına anlamsal sunum yükleri gönderin. OpenClaw bunları genel sunum sözleşmesinden Teams Adaptive Cards olarak işler.
presentation parametresi anlamsal blokları kabul eder. presentation sağlandığında mesaj metni isteğe bağlıdır. Düğmeler, Adaptive Card gönderme veya URL eylemleri olarak işlenir. Seçim menüleri Teams işleyicisinde yerel olarak desteklenmediğinden OpenClaw, teslimden önce bunları okunabilir metne dönüştürür.
Aracı aracı:
{ action: "send", channel: "msteams", target: "user:<id>", presentation: { title: "Merhaba", blocks: [{ type: "text", text: "Merhaba!" }], },}CLI:
openclaw message send --channel msteams \ --target "conversation:19:abc...@thread.tacv2" \ --presentation '{"title":"Merhaba","blocks":[{"type":"text","text":"Merhaba!"}]}'Hedef biçimi ayrıntıları için aşağıdaki Hedef biçimleri bölümüne bakın.
Hedef biçimleri
MSTeams hedefleri, kullanıcılarla konuşmaları ayırt etmek için ön ekler kullanır:
| Hedef türü | Biçim | Örnek |
|---|---|---|
| Kullanıcı (kimlikle) | user:<aad-object-id> |
user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| Kullanıcı (adla) | user:<display-name> |
user:John Smith (Graph API gerektirir) |
| Grup/kanal | conversation:<conversation-id> |
conversation:19:abc123...@thread.tacv2 |
| Grup/kanal (ham) | <conversation-id> |
19:abc123...@thread.tacv2, 19:...@unq.gbl.spaces veya çıplak bir a:/8:orgid:/29: Bot Framework kimliği |
CLI örnekleri:
# Kimliğe göre bir kullanıcıya gönderopenclaw message send --channel msteams --target "user:40a1a0ed-..." --message "Merhaba" # Görünen ada göre bir kullanıcıya gönder (Graph API sorgulamasını tetikler)openclaw message send --channel msteams --target "user:John Smith" --message "Merhaba" # Bir grup sohbetine veya kanala gönderopenclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" --message "Merhaba" # Bir konuşmaya sunum kartı gönderopenclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" \ --presentation '{"title":"Merhaba","blocks":[{"type":"text","text":"Merhaba"}]}'Aracı aracı örnekleri:
{ action: "send", channel: "msteams", target: "user:John Smith", message: "Merhaba!",}{ action: "send", channel: "msteams", target: "conversation:19:abc...@thread.tacv2", presentation: { title: "Merhaba", blocks: [{ type: "text", text: "Merhaba" }], },}Proaktif mesajlaşma
- OpenClaw konuşma başvurularını bu noktada depoladığı için proaktif mesajlar yalnızca bir kullanıcı etkileşimde bulunduktan sonra gönderilebilir.
dmPolicyve izin verilenler listesi denetimi için /gateway/configuration bölümüne bakın.
Ekip ve Kanal Kimlikleri (Yaygın Sorun)
Teams URL'lerindeki groupId sorgu parametresi, yapılandırmada kullanılan ekip kimliği DEĞİLDİR. Bunun yerine kimlikleri URL yolundan çıkarın:
Ekip URL'si:
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=... └────────────────────────────┘ Ekip konuşması kimliği (bunun URL kodunu çözün)Kanal URL'si:
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=... └─────────────────────────┘ Kanal kimliği (bunun URL kodunu çözün)Yapılandırma için:
- Ekip anahtarı =
/team/sonrasındaki yol bölümü (URL kodu çözülmüş, ör.19:Bk4j...@thread.tacv2; eski kiracılarda yine geçerli olan@thread.skypegörünebilir). - Kanal anahtarı =
/channel/sonrasındaki yol bölümü (URL kodu çözülmüş). - OpenClaw yönlendirmesi için
groupIdsorgu parametresini yok sayın. Bu, gelen Teams etkinliklerinde kullanılan Bot Framework konuşma kimliği değil, Microsoft Entra grup kimliğidir.
Özel kanallar
Botların özel kanallardaki desteği sınırlıdır:
| Özellik | Standart kanallar | Özel kanallar |
|---|---|---|
| Bot yükleme | Evet | Sınırlı |
| Gerçek zamanlı mesajlar (Webhook) | Evet | Çalışmayabilir |
| RSC izinleri | Evet | Farklı davranabilir |
| @bahsetmeler | Evet | Bot erişilebilirse |
| Graph API geçmişi | Evet | Evet (izinlerle) |
Özel kanallar çalışmıyorsa geçici çözümler:
- Bot etkileşimleri için standart kanalları kullanın.
- DM'leri kullanın; kullanıcılar her zaman bota doğrudan mesaj gönderebilir.
- Geçmiş erişimi için Graph API'yi kullanın (
ChannelMessage.Read.Allgerektirir).
Sorun giderme
Yaygın sorunlar
- Görüntüler kanallarda görünmüyor: Graph izinleri veya yönetici onayı eksik. Teams uygulamasını yeniden yükleyin ve Teams'i tamamen kapatıp yeniden açın.
- Kanalda yanıt yok: varsayılan olarak bahsetmeler gereklidir;
channels.msteams.requireMention=falseayarını belirleyin veya ekip/kanal başına yapılandırın. - Sürüm uyuşmazlığı (Teams hâlâ eski manifesti gösteriyor): uygulamayı kaldırıp yeniden ekleyin ve yenilemek için Teams'i tamamen kapatın.
- Webhook'tan 401 Unauthorized: Azure JWT olmadan elle test yaparken beklenen bir durumdur; uç noktaya erişilebildiğini ancak kimlik doğrulamanın başarısız olduğunu gösterir. Doğru şekilde test etmek için Azure Web Chat'i kullanın.
Manifest yükleme hataları
- "Icon file cannot be empty": manifest, 0 bayt boyutundaki simge dosyalarına başvuruyor. Geçerli PNG simgeleri oluşturun (
outline.pngiçin 32x32,color.pngiçin 192x192). - "webApplicationInfo.Id already in use": uygulama hâlâ başka bir ekipte/sohbette yüklü. Önce uygulamayı bulup kaldırın veya yayılım için 5-10 dakika bekleyin.
- Yükleme sırasında "Something went wrong": bunun yerine https://admin.teams.microsoft.com üzerinden yükleyin, tarayıcı DevTools'u (F12) → Network sekmesini açın ve gerçek hata için yanıt gövdesini denetleyin.
- Sideload başarısız oluyor: "Upload a custom app" yerine "Upload an app to your org's app catalog" seçeneğini deneyin; bu genellikle sideload kısıtlamalarını aşar.
RSC izinleri çalışmıyor
webApplicationInfo.iddeğerinin botunuzun App ID'siyle tam olarak eşleştiğini doğrulayın.- Uygulamayı yeniden yükleyin ve ekipte/sohbette yeniden kurun.
- Kuruluş yöneticinizin RSC izinlerini engelleyip engellemediğini denetleyin.
- Doğru kapsamı kullandığınızı doğrulayın: ekipler için
ChannelMessage.Read.Group, grup sohbetleri içinChatMessage.Read.Chat.
Kaynaklar
- Azure Bot oluşturma - Azure Bot kurulum kılavuzu
- Teams Developer Portal - Teams uygulamaları oluşturma/yönetme
- Teams uygulama manifesti şeması
- RSC ile kanal mesajlarını alma
- RSC izinleri başvurusu
- Teams bot dosya işleme (kanal/grup Graph gerektirir)
- Proaktif mesajlaşma
- @microsoft/teams.cli - bot yönetimi için Teams CLI
İlgili içerikler
- Kanallara Genel Bakış - desteklenen tüm kanallar
- Eşleştirme - DM kimlik doğrulaması ve eşleştirme akışı
- Gruplar - grup sohbeti davranışı ve bahsetme koşulu
- Kanal Yönlendirme - iletiler için oturum yönlendirmesi
- Güvenlik - erişim modeli ve güvenlik sıkılaştırması