社交与聊天 API(正式服 — Patch 12.0.0)
聊天、社交、公会/社区、好友、语音、BattleNet 及相关 API 的综合参考。
来源: https://warcraft.wiki.gg/wiki/World_of_Warcraft_API
截至: Patch 12.0.0(Build 65655)——2026 年 1 月 28 日
范围: 仅限正式服。
重要:12.0.0 副本限制
- 副本内禁止使用
SendAddonMessage()(地下城、团队副本、战场、竞技场)
- 副本内的聊天消息可能是机密值(KStrings)
- 插件通信必须在副本外使用替代方案
- 在副本内调用
C_ChatInfo.SendAddonMessage() 和 C_ChatInfo.SendAddonMessageLogged() 会报错
范围
- C_ChatInfo — 聊天系统、频道、插件消息
- 聊天框函数 — SendChatMessage、聊天过滤器、聊天气泡
- C_Club — 社区/俱乐部系统
- C_ClubFinder — 俱乐部查找/招募
- C_FriendList — 好友列表管理
- C_BattleNet — BattleNet 好友、在线状态、游戏账号
- C_VoiceChat — 语音聊天系统
- C_SocialRestrictions — 社交限制检查
- C_SocialQueue — 社交队列系统
- C_RecentAllies — 最近盟友追踪
- C_PingManager — 游戏内标记系统
- C_TTSSettings — 文本转语音设置
C_ChatInfo — 聊天系统
主要函数
| 函数 | 返回值 | 描述 |
|---|
C_ChatInfo.SendAddonMessage(prefix, message, chatType [, target]) | success | 发送插件消息(副本内禁止) |
C_ChatInfo.SendAddonMessageLogged(prefix, message, chatType [, target]) | success | 发送已记录的插件消息(副本内禁止) |
C_ChatInfo.RegisterAddonMessagePrefix(prefix) | success | 为 CHAT_MSG_ADDON 注册前缀 |
C_ChatInfo.IsAddonMessagePrefixRegistered(prefix) | isRegistered | 检查前缀是否已注册 |
C_ChatInfo.GetRegisteredAddonMessagePrefixes() | prefixes | 获取所有已注册的前缀 |
C_ChatInfo.GetChannelInfoFromIdentifier(identifier) | info | 按标识符获取频道信息 |
C_ChatInfo.GetChannelRuleset(channelIndex) | rulesetID | 获取频道规则集 |
C_ChatInfo.GetChannelRulesetForChannelID(channelID) | rulesetID | 按频道 ID 获取规则集 |
C_ChatInfo.GetChannelShortcut(channelIndex) | shortcut | 获取频道快捷名称 |
C_ChatInfo.GetChannelShortcutForChannelID(channelID) | shortcut | 按频道 ID 获取快捷名称 |
C_ChatInfo.GetChatLineSenderGUID(lineID) | guid | 获取消息发送者的 GUID |
C_ChatInfo.GetChatLineSenderName(lineID) | name | 获取消息发送者的名称 |
C_ChatInfo.GetChatLineText(lineID) | text | 获取消息文本 |
C_ChatInfo.GetChatTypeByID(chatTypeID) | chatType | 根据 ID 获取聊天类型字符串 |
C_ChatInfo.GetColorForChatType(chatType) | r, g, b | 获取聊天类型的默认颜色 |
C_ChatInfo.GetNumActiveChannels() | numChannels | 获取活动频道数量 |
C_ChatInfo.GetActiveChannelList() | channels | 获取活动频道列表 |
C_ChatInfo.IsChannelRegional(chatType) | isRegional | 频道是否为区域频道? |
C_ChatInfo.IsChatLineCensored(lineID) | isCensored | 消息是否已屏蔽? |
C_ChatInfo.IsPartyPositionCategory(category) | isPartyPosition | 是否为队伍位置类别? |
C_ChatInfo.IsRegionalServiceAvailable() | isAvailable | 区域服务是否可用? |
C_ChatInfo.IsValidChatLine(lineID) | isValid | 消息行是否有效? |
C_ChatInfo.ReplaceIconAndGroupExpressions(message) | text | 展开 {rt1}、{skull} 等标记 |
C_ChatInfo.ResetDefaultZoneChannels() | — | 重置区域频道 |
C_ChatInfo.SwapChatChannelsByChannelIndex(i1, i2) | — | 交换频道顺序 |
全局聊天函数
| 函数 | 返回值 | 描述 |
|---|
SendChatMessage(msg [, chatType [, languageID [, target]]]) | — | 发送聊天消息 |
GetNumDisplayChannels() | numChannels | 显示的频道数量 |
GetChannelDisplayInfo(index) | name, header, collapsed, channelNumber, count, active, category, voiceEnabled, voiceActive | 频道显示信息 |
GetChannelName(idOrName) | id, name, instanceID, isCommChannel | 查询频道名称/ID |
JoinChannelByName(name [, password [, frameID]]) | type, name | 加入频道 |
LeaveChannelByName(name) | — | 离开频道 |
ListChannelByName(name) | — | 列出频道成员 |
GetChatWindowInfo(frameIndex) | name, fontSize, r, g, b, alpha, shown, locked, docked, uninteractable | 聊天窗口信息 |
SetChatWindowName(frameIndex, name) | — | 设置聊天窗口名称 |
LoggingChat(enable) | — | 切换聊天记录 |
LoggingCombat(enable) | — | 切换战斗记录 |
C_Club — 社区/俱乐部
俱乐部管理
| 函数 | 返回值 | 描述 |
|---|
C_Club.GetSubscribedClubs() | clubs | 所有已加入的俱乐部 |
C_Club.GetClubInfo(clubId) | info | 俱乐部信息 |
C_Club.GetClubMembers(clubId [, streamId]) | members | 俱乐部成员列表 |
C_Club.GetMemberInfo(clubId, memberId) | info | 成员信息 |
C_Club.GetClubStreamNotificationSettings(clubId) | settings | 频道通知设置 |
C_Club.CreateClub(name, shortName, description, clubType, avatarId) | — | 创建新俱乐部 |
C_Club.DestroyClub(clubId) | — | 解散俱乐部 |
C_Club.EditClub(clubId, name, shortName, description, avatarId, bgColorIndex) | — | 编辑俱乐部 |
C_Club.LeaveClub(clubId) | — | 离开俱乐部 |
C_Club.AcceptInvitation(clubId) | — | 接受俱乐部邀请 |
C_Club.DeclineInvitation(clubId) | — | 拒绝俱乐部邀请 |
C_Club.GetInvitationsForSelf() | invitations | 待处理的邀请 |
C_Club.SendInvitation(clubId, memberId) | — | 邀请加入俱乐部 |
俱乐部频道(俱乐部内的聊天频道)
| 函数 | 返回值 | 描述 |
|---|
C_Club.GetStreams(clubId) | streams | 俱乐部的所有频道 |
C_Club.GetStreamInfo(clubId, streamId) | info | 频道信息 |
C_Club.CreateStream(clubId, name, subject, leadersAndModeratorsOnly) | — | 创建频道 |
C_Club.DestroyStream(clubId, streamId) | — | 移除频道 |
C_Club.EditStream(clubId, streamId, name, subject, leadersAndModeratorsOnly) | — | 编辑频道 |
C_Club.GetMessagesBefore(clubId, streamId, messageId, count) | messages | 获取指定 ID 之前的消息 |
C_Club.GetMessagesAfter(clubId, streamId, messageId, count) | messages | 获取指定 ID 之后的消息 |
C_Club.GetMessagesInRange(clubId, streamId, oldest, newest) | messages | 获取范围内的消息 |
C_Club.SendMessage(clubId, streamId, message) | — | 向频道发送消息 |
C_Club.FocusStream(clubId, streamId) | — | 聚焦频道 |
C_Club.UnfocusStream(clubId, streamId) | — | 取消聚焦频道 |
C_Club.SetAutoAdvanceStreamViewMarker(clubId, streamId) | — | 自动前移查看标记 |
俱乐部类型
| 枚举 | 值 | 描述 |
|---|
Enum.ClubType.BattleNet | 0 | BattleNet 社区 |
Enum.ClubType.Character | 1 | 角色社区 |
Enum.ClubType.Guild | 2 | 公会(视为俱乐部) |
Enum.ClubType.Other | 3 | 其他 |
C_ClubFinder — 俱乐部查找 / 招募
| 函数 | 返回值 | 描述 |
|---|
C_ClubFinder.RequestClubsList(type, isLinkedSearch, searchText, specIDs) | — | 搜索俱乐部 |
C_ClubFinder.GetRecruitingClubInfoFromClubID(clubId) | recruitInfo | 俱乐部招募信息 |
C_ClubFinder.GetTotalMatchingCommunityListSize() | size | 匹配的社区总数 |
C_ClubFinder.GetTotalMatchingGuildListSize() | size | 匹配的公会总数 |
C_ClubFinder.RequestPostingInformationFromClubId(clubId) | — | 请求招募信息 |
C_ClubFinder.PostClub(clubId, minIlvl, minLevel, ...) | — | 发布俱乐部招募信息 |
C_ClubFinder.RequestApplicantList(type) | — | 请求申请者列表 |
C_ClubFinder.GetApplicantInfoList() | applicants | 获取申请者 |
C_ClubFinder.RespondToApplicant(clubFinderGUID, playerGUID, accepted, ...) | — | 回复申请者 |
C_FriendList — 好友
| 函数 | 返回值 | 描述 |
|---|
C_FriendList.GetNumFriends() | numFriends | 角色好友数量 |
C_FriendList.GetNumOnlineFriends() | numOnline | 在线好友数量 |
C_FriendList.GetFriendInfoByIndex(index) | info | 按索引获取好友信息 |
C_FriendList.GetFriendInfoByName(name) | info | 按名称获取好友信息 |
C_FriendList.GetFriendInfoByGUID(guid) | info | 按 GUID 获取好友信息 |
C_FriendList.AddFriend(name [, notes]) | — | 添加好友 |
C_FriendList.RemoveFriend(name) | — | 删除好友 |
C_FriendList.SetFriendNotes(name, notes) | — | 设置好友备注 |
C_FriendList.AddOrRemoveFriend(name, notes) | — | 切换好友状态 |
C_FriendList.IsFriend(guid) | isFriend | GUID 对应的玩家是好友吗? |
C_FriendList.AddIgnore(name) | — | 添加到忽略列表 |
C_FriendList.DelIgnore(name) | — | 从忽略列表中移除 |
C_FriendList.GetNumIgnores() | numIgnores | 忽略列表数量 |
C_FriendList.GetIgnoreName(index) | name | 被忽略玩家的名称 |
C_FriendList.IsIgnored(name) | isIgnored | 玩家已被忽略吗? |
C_FriendList.IsIgnoredByGUID(guid) | isIgnored | GUID 对应的玩家已被忽略吗? |
C_FriendList.ShowFriends() | — | 刷新好友列表 |
C_FriendList.GetSelectedFriend() | index | 已选好友的索引 |
C_FriendList.SetSelectedFriend(index) | — | 选择好友 |
C_BattleNet — BattleNet 好友
| 函数 | 返回值 | 描述 |
|---|
C_BattleNet.GetFriendAccountInfo(index) | accountInfo | BNet 好友账号信息 |
C_BattleNet.GetFriendGameAccountInfo(index, gameAccountIndex) | gameAccountInfo | 游戏账号信息 |
C_BattleNet.GetFriendNumGameAccounts(index) | numGameAccounts | 好友的游戏账号数量 |
C_BattleNet.GetAccountInfoByID(bnetAccountID) | accountInfo | 按 ID 获取账号信息 |
C_BattleNet.GetAccountInfoByGUID(guid) | accountInfo | 按 GUID 获取账号信息 |
C_BattleNet.GetGameAccountInfoByID(gameAccountID) | gameAccountInfo | 游戏账号信息 |
C_BattleNet.GetGameAccountInfoByGUID(guid) | gameAccountInfo | 按 GUID 获取游戏账号 |
BNGetNumFriends() | numFriends, numOnline | BNet 好友数量 |
BNGetNumFriendInvites() | numInvites | 待处理的 BNet 邀请数量 |
BNSendWhisper(bnetAccountID, message) | — | 发送 BNet 密语 |
BNInviteFriend(bnetAccountID) | — | 邀请加入队伍 |
BNRequestInviteFriend(presenceID) | — | 请求添加 BNet 好友 |
BNRemoveFriend(bnetAccountID) | — | 删除 BNet 好友 |
BNSetFriendNote(bnetAccountID, note) | — | 设置好友备注 |
BNSetCustomMessage(message) | — | 设置 BNet 状态消息 |
BNConnected() | isConnected | 已连接到 BNet 吗? |
C_VoiceChat — 语音聊天
| 函数 | 返回值 | 描述 |
|---|
C_VoiceChat.GetActiveChannelID() | channelID | 当前语音频道 |
C_VoiceChat.GetChannel(channelID) | channel | 频道信息 |
C_VoiceChat.GetChannelForChannelType(channelType) | channel | 按类型获取频道 |
C_VoiceChat.GetChannelForCommunityStream(clubId, streamId) | channel | 社区语音频道 |
C_VoiceChat.GetMasterVolumeScale() | scale | 主音量 |
C_VoiceChat.SetMasterVolumeScale(scale) | — | 设置主音量 |
C_VoiceChat.GetInputVolume() | volume | 麦克风音量 |
C_VoiceChat.SetInputVolume(volume) | — | 设置麦克风音量 |
C_VoiceChat.GetOutputVolume() | volume | 扬声器音量 |
C_VoiceChat.SetOutputVolume(volume) | — | 设置扬声器音量 |
C_VoiceChat.IsMuted() | isMuted | 是否已静音? |
C_VoiceChat.SetMuted(muted) | — | 设置静音 |
C_VoiceChat.IsDeafened() | isDeafened | 是否已屏蔽声音? |
C_VoiceChat.SetDeafened(deafened) | — | 设置屏蔽声音 |
C_VoiceChat.IsSilenced() | isSilenced | 是否已被禁言(由暴雪执行)? |
C_VoiceChat.ActivateChannel(channelID) | — | 激活语音频道 |
C_VoiceChat.DeactivateChannel(channelID) | — | 停用语音频道 |
C_VoiceChat.IsLoggedIn() | isLoggedIn | 是否已登录语音聊天? |
C_VoiceChat.Login() | — | 登录语音聊天 |
C_VoiceChat.Logout() | — | 退出语音聊天 |
C_VoiceChat.GetMemberName(memberID, channelID) | name | 语音成员名称 |
C_VoiceChat.GetMemberVolume(memberID, channelID) | volume | 成员音量 |
C_VoiceChat.SetMemberVolume(memberID, channelID, volume) | — | 设置成员音量 |
C_VoiceChat.IsMemberMuted(memberID, channelID) | isMuted | 成员是否已静音? |
C_VoiceChat.SetMemberMuted(memberID, channelID, muted) | — | 将成员静音 |
C_SocialRestrictions
| 函数 | 返回值 | 描述 |
|---|
C_SocialRestrictions.IsChatDisabled() | isDisabled | 聊天是否受限? |
C_SocialRestrictions.IsMuted() | isMuted | 玩家是否已静音? |
C_SocialRestrictions.IsSilenced() | isSilenced | 玩家是否已被禁言? |
C_SocialRestrictions.IsSquelched() | isSquelched | 玩家是否已被屏蔽? |
C_SocialQueue — 社交队列
| 函数 | 返回值 | 描述 |
|---|
C_SocialQueue.GetAllGroups() | groups | 所有社交队列群组 |
C_SocialQueue.GetGroupInfo(guid) | info | 群组队列信息 |
C_SocialQueue.GetGroupMembers(guid) | members | 群组成员列表 |
C_SocialQueue.GetGroupQueues(guid) | queues | 群组队列 |
C_RecentAllies
| 函数 | 返回值 | 描述 |
|---|
C_RecentAllies.GetRecentAllies() | allies | 最近组队的盟友 |
C_PingManager — 标记系统
| 函数 | 返回值 | 描述 |
|---|
C_PingManager.GetPingTypeFromUIMouseButton(button) | pingType | 根据鼠标按钮获取标记类型 |
C_PingManager.TogglePingListener(enabled) | — | 切换标记监听 |
C_TTSSettings — 文本转语音
| 函数 | 返回值 | 描述 |
|---|
C_TTSSettings.GetChatTypeEnabled(chatType) | enabled | 是否为该聊天类型启用 TTS? |
C_TTSSettings.SetChatTypeEnabled(chatType, enabled) | — | 切换该聊天类型的 TTS |
C_TTSSettings.GetSetting(setting) | value | 获取 TTS 设置 |
C_TTSSettings.SetSetting(setting, value) | — | 设置 TTS 设置 |
C_TTSSettings.GetVoiceOptionID(voiceType) | optionID | 获取语音选项 |
常见模式
注册并处理插件消息
local ADDON_PREFIX = "MyAddon"
C_ChatInfo.RegisterAddonMessagePrefix(ADDON_PREFIX)
local frame = CreateFrame("Frame")
frame:RegisterEvent("CHAT_MSG_ADDON")
frame:SetScript("OnEvent", function(self, event, prefix, message, channel, sender)
if prefix == ADDON_PREFIX then
-- Process addon message
print("Got message from", sender, ":", message)
end
end)
-- Send message (FAILS in instances in 12.0.0!)
local function SendMessage(msg, target)
if not IsInInstance() then
C_ChatInfo.SendAddonMessage(ADDON_PREFIX, msg, "PARTY")
else
-- In-instance: cannot send addon messages
-- Consider using encounter events or built-in APIs instead
end
end
聊天消息筛选器
-- Filter chat messages to modify or suppress them
ChatFrame_AddMessageEventFilter("CHAT_MSG_SAY", function(self, event, msg, author, ...)
if msg:find("badword") then
return true -- suppress the message
end
-- Modify the message
local newMsg = msg:gsub("hello", "|cff00ff00hello|r")
return false, newMsg, author, ...
end)
枚举好友
local function GetOnlineFriends()
local friends = {}
local numFriends = C_FriendList.GetNumFriends()
for i = 1, numFriends do
local info = C_FriendList.GetFriendInfoByIndex(i)
if info and info.connected then
table.insert(friends, info)
end
end
-- Also check BNet friends
local numBNet, numOnlineBNet = BNGetNumFriends()
for i = 1, numBNet do
local acctInfo = C_BattleNet.GetFriendAccountInfo(i)
if acctInfo and acctInfo.gameAccountInfo and acctInfo.gameAccountInfo.isOnline then
table.insert(friends, acctInfo)
end
end
return friends
end
关键事件
| 事件 | 负载 | 描述 |
|---|
CHAT_MSG_SAY | msg, author, language, channelString, target, flags, ... | /say 消息 |
CHAT_MSG_YELL | msg, author, ... | /yell 消息 |
CHAT_MSG_PARTY | msg, author, ... | 队伍消息 |
CHAT_MSG_PARTY_LEADER | msg, author, ... | 队伍队长消息 |
CHAT_MSG_RAID | msg, author, ... | 团队消息 |
CHAT_MSG_RAID_LEADER | msg, author, ... | 团队队长消息 |
CHAT_MSG_GUILD | msg, author, ... | 公会消息 |
CHAT_MSG_OFFICER | msg, author, ... | 公会官员消息 |
CHAT_MSG_WHISPER | msg, author, ... | 收到的密语 |
CHAT_MSG_WHISPER_INFORM | msg, target, ... | 发出的密语 |
CHAT_MSG_BN_WHISPER | msg, author, ... | 收到的战网密语 |
CHAT_MSG_BN_WHISPER_INFORM | msg, target, ... | 发出的战网密语 |
CHAT_MSG_CHANNEL | msg, author, language, channelString, target, flags, zoneChannelID, channelIndex, channelBaseName, ... | 频道消息 |
CHAT_MSG_ADDON | prefix, message, channel, sender | 收到的插件消息 |
CHAT_MSG_ADDON_LOGGED | prefix, message, channel, sender | 已记录的插件消息 |
CHAT_MSG_SYSTEM | msg | 系统消息 |
CHAT_MSG_EMOTE | msg, author, ... | 表情动作消息 |
CHAT_MSG_TEXT_EMOTE | msg, author, ... | /emote 文本 |
FRIENDLIST_UPDATE | — | 好友列表已更改 |
BN_FRIEND_LIST_SIZE_CHANGED | — | 战网列表已更改 |
BN_FRIEND_INFO_CHANGED | bnetAccountID | 战网好友信息已更新 |
BN_CONNECTED | — | 已连接到战网 |
BN_DISCONNECTED | — | 已断开与战网的连接 |
CLUB_ADDED | clubId | 已加入俱乐部 |
CLUB_REMOVED | clubId | 已离开俱乐部 |
CLUB_UPDATED | clubId | 俱乐部信息已更新 |
CLUB_MESSAGE_ADDED | clubId, streamId, messageId | 新俱乐部消息 |
CLUB_MEMBER_ADDED | clubId, memberId | 成员已加入俱乐部 |
CLUB_MEMBER_REMOVED | clubId, memberId | 成员已离开俱乐部 |
CLUB_MEMBER_UPDATED | clubId, memberId | 成员信息已更新 |
VOICE_CHAT_CHANNEL_ACTIVATED | channelID | 语音频道已激活 |
VOICE_CHAT_CHANNEL_DEACTIVATED | channelID | 语音频道已停用 |
VOICE_CHAT_CHANNEL_MEMBER_ADDED | memberID, channelID | 成员已加入语音频道 |
VOICE_CHAT_CHANNEL_MEMBER_REMOVED | memberID, channelID | 成员已离开语音频道 |
注意事项与限制
- 副本中禁止使用 SendAddonMessage — 在 12.0.0 中,
C_ChatInfo.SendAddonMessage() 和 SendAddonMessageLogged() 在地下城、团队副本、战场和竞技场内会抛出错误。
- 聊天消息可能是机密值 — 在副本中,其他玩家的聊天消息内容可能是 KStrings/机密值。
- 插件前缀长度限制 — 插件消息前缀最多为 16 个字符。
- 插件消息大小限制 — 每条插件消息最多为 255 个字符。
- 聊天频率限制 —
SendChatMessage() 有发送频率限制。发送过快会导致断开连接。
- 需要硬件事件 — 某些聊天函数需要硬件事件(鼠标点击/按键)才能执行。
- 战网好友列表 —
BNGetFriendInfo() 已弃用。请使用 C_BattleNet.GetFriendAccountInfo()。
- 公会俱乐部类型 — 公会被视为俱乐部,类型为
Enum.ClubType.Guild。请使用 C_Club 与公会聊天流交互。
- 语音聊天登录 — 语音聊天需要显式登录。执行操作前,请检查
C_VoiceChat.IsLoggedIn()。
- 聊天过滤器 —
ChatFrame_AddMessageEventFilter 过滤器会对所有聊天框中该事件的实例生效。