企业号 / 全部接口
入门指南
快速入门
术语解释
接口清单(Scope权限点)
Oauth2.0授权
简版授权流程说明
授权管理说明
新版授权常见问题
OAuth2.0原理及Marketing-API使用
回调地址怎么设置和使用
Token管理
获取Access Token
刷新Refresh Token
获取已授权账户
获取授权User信息
获取APP Access Token
账号服务
企业号账号管理
获取企业号信息
纵横组织账户管理
获取纵横组织下资产账户列表
获取纵横组织下资产账户列表(分页)
抖音企业号
消息管理
企业号私信发送消息接口
企业号私信菜单保存接口
企业号私信自动回复保存接口
企业号私信消息卡片保存接口
企业号私信消息卡片删除接口
企业号私信菜单读取接口
企业号私信自动回复读取接口
企业号私信用户群聊读取接口
企业号私信经营工具读取接口
企业号私信消息卡片读取接口
基础信息
企业号用户权限读取接口
评论管理
获取评论列表
获取评论的回复
获取评论从属信息
回复评论
获取企业号视频列表
经营分析
获取广告主关联的企业号列表
获取企业号推广操作记录
获取企业号基础数据
获取企业号流量来源数据
获取企业号视频分析数据
不同时间维度下支持查询指标一览表
用户分析
企业号意向用户标签创建
企业号意向用户标签编辑
企业号意向用户标签删除
企业号意向用户标签查询
企业号意向用户列表查询
企业号意向用户打标签或取消标签
企业号意向用户互动记录查询
素材管理
企业号用户素材列表接口
企业号永久素材上传接口
企业号素材删除接口
数据订阅服务
SPI数据订阅
SPI回调地址设置
订阅服务类型
X-Open-Signature签名校验
推送失败数据查询
获取推送数据列表
频控限制
最佳实践
附录
枚举值
返回码
过滤条件
企业号私信菜单保存接口

设置企业号的私信菜单信息,包含私信菜单标题、跳转链接、回复内容、经营工具、子菜单等。

  • 保存菜单后,需经过平台审核才能生效;前一次提交还未审核完成,再次提交会报错;
  • 保存菜单时,如使用经营工具、消息卡片等能力,请确保对应功能为审核通过状态,否则会报错;
  • 菜单保存是全量覆盖,之前创建的菜单需要传menu_id,否则再次创建会被删除;
  • 外链,即私信菜单类型为LINK,仅支持品牌号/部分特殊权限企业号配置;
  • 最多可设计两级菜单。

请求地址

https://ad.oceanengine.com/open_api/v1.0/enterprise/im/menu/save/

请求方法

POST

请求Header

字段类型描述
Access-Token必填
string
授权access-token,获取方法见接口文档【获取Access-Token】

请求参数

字段类型描述
e_douyin_id必填
string
企业号账户id,纵横组织管理员授权后,先通过【获取已授权账户】接口,查询到账号角色为“2-纵横组织”的纵横组织账户ID,再通过【获取纵横组织下资产账户列表】接口,查询到e_douyin_id,即为企业号账户ID
menu_list必填
object[]
私信菜单列表
menu_id
string
私信菜单ID,仅更新菜单时需传入
menu_title必填
string
私信菜单标题
menu_type必填
string
私信菜单类型
允许值:SUB_MENU 复合菜单、LINK 跳转链接、REPLY 回复、COMPONENT 经营工具
其中,LINK跳转链接 类型仅品牌号/部分特殊权限企业号可用
sub_menu_list
object[]
私信子菜单列表,结构同menu_list,私信菜单类型为 SUB_MENU 复合菜单时必填,子菜单列表的menu_type不支持 SUB_MENU 复合菜单,即最多两层菜单
link
string
私信菜单跳转链接,私信菜单类型为LINK跳转链接时可用且必填
reply
object
私信菜单回复内容
reply_type
string
私信菜单回复内容类型,私信菜单类型为REPLY 回复时可用且必填
允许值:TEXT 文字内容、IMAGE 图片内容、CARD 消息卡片、GROUP 群聊邀请
text
string
文字内容,回复内容类型为TEXT 文字内容时可用且必填
image
object
图片内容
media_id
string
素材ID,回复内容类型为 IMAGE 图片内容时可用且必填,可以通过【企业号永久素材上传接口】上传素材,获取素材ID,仅支持图片类型素材,仅支持审核通过的素材,可以通过【企业号用户素材列表接口】查询素材审核状态
card_id
string
消息卡片ID,回复内容类型为 CARD 消息卡片时可用且必填,可以通过【企业号私信消息卡片读取接口】读取授权企业号创建的消息卡片
group_id
string
群聊ID,回复内容类型为GROUP 群聊邀请时可用且必填,可以通过【企业号私信用户群聊读取接口】读取授权企业号所在的群聊列表
component
object
经营工具
component_id
string
经营工具ID,私信菜单类型为COMPONENT经营工具 时可用且必填,可以通过【企业号私信经营工具读取接口】读取授权企业号创建的经营工具列表
component_type
string
经营工具类型
允许值:
AD_ADVANCED_CONTACT_US 联系我们
RESERVE_SERVICE 在线预约
LEADS_COLLECTOR 线索收集
CAR_LEADS_COLLECTOR 汽车线索收集
AD_ADVANCED_OFFICIAL_SITE 官网主页
GROUPON_ACTIVITY 团购商品聚合页
SHOP_PRODUCT 电商商品
SHOP_COUPON 电商卡券

请求示例

Python请求示例
JAVA请求示例
PHP请求示例
curl请求示例
# coding=utf-8 import json import requests from six import string_types from six.moves.urllib.parse import urlencode, urlunparse # noqa ACCESS_TOKEN = "xxx" PATH = "/open_api/v1.0/enterprise/im/menu/save/" def build_url(path, query=""): # type: (str, str) -> str """ Build request URL :param path: Request path :param query: Querystring :return: Request URL """ scheme, netloc = "https", "ad.oceanengine.com" return urlunparse((scheme, netloc, path, "", query, "")) def post(json_str): # type: (str) -> dict """ Send POST request :param json_str: Args in JSON format :return: Response in JSON format """ url = build_url(PATH) args = json.loads(json_str) headers = { "Access-Token": ACCESS_TOKEN, "Content-Type": "application/json", } rsp = requests.post(url, headers=headers, json=args) return rsp.json() if __name__ == '__main__': e_douyin_id = E_DOUYIN_ID menu_id = MENU_ID menu_title = MENU_TITLE menu_type = MENU_TYPE link = LINK reply_type = REPLY_TYPE text = TEXT material_id = MATERIAL_ID url = URL card_id = CARD_ID group_id = GROUP_ID component_id = COMPONENT_ID component_type = COMPONENT_TYPE menu_id = MENU_ID menu_title = MENU_TITLE menu_type = MENU_TYPE link = LINK reply_type = REPLY_TYPE text = TEXT material_id = MATERIAL_ID url = URL card_id = CARD_ID group_id = GROUP_ID component_id = COMPONENT_ID component_type = COMPONENT_TYPE # Args in JSON format my_args = "{\"e_douyin_id\": \"%s\", \"menu_list\": [{\"menu_id\": \"%s\", \"menu_title\": \"%s\", \"menu_type\": \"%s\", \"link\": \"%s\", \"reply\": {\"reply_type\": \"%s\", \"text\": \"%s\", \"image\": {\"material_id\": \"%s\", \"url\": \"%s\"}, \"card_id\": \"%s\", \"group_id\": \"%s\"}, \"component\": {\"component_id\": \"%s\", \"component_type\": \"%s\"}, \"sub_menu_list\": [{\"menu_id\": \"%s\", \"menu_title\": \"%s\", \"menu_type\": \"%s\", \"link\": \"%s\", \"reply\": {\"reply_type\": \"%s\", \"text\": \"%s\", \"image\": {\"material_id\": \"%s\", \"url\": \"%s\"}, \"card_id\": \"%s\", \"group_id\": \"%s\"}, \"component\": {\"component_id\": \"%s\", \"component_type\": \"%s\"}}]}]}" % (e_douyin_id, menu_id, menu_title, menu_type, link, reply_type, text, material_id, url, card_id, group_id, component_id, component_type, menu_id, menu_title, menu_type, link, reply_type, text, material_id, url, card_id, group_id, component_id, component_type) print(post(my_args))
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import okhttp3.*; import org.apache.http.client.utils.URIBuilder; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Demo { private static final String ACCESS_TOKEN = "xxx"; private static final String PATH = "/open_api/v1.0/enterprise/im/menu/save/"; private static final ObjectMapper mapper = new ObjectMapper(); /** * Build request URL * * @param path Request path * @return Request URL */ private static String buildUrl(String path) throws URISyntaxException { URI uri = new URI("https", "ad.oceanengine.com", path, "", ""); return uri.toString(); } /** * Send POST request * * @param jsonStr Args in JSON format * @return Response in JSON format */ private static String post(String jsonStr) throws IOException, URISyntaxException { OkHttpClient client = new OkHttpClient().newBuilder().build(); String url = buildUrl(PATH); RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonStr); Request request = new Request.Builder() .url(url) .method("POST", body) .addHeader("Content-Type", "application/json") .addHeader("Access-Token", ACCESS_TOKEN) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } public static void main(String[] args) throws IOException, URISyntaxException { String e_douyin_id = E_DOUYIN_ID; String menu_id = MENU_ID; String menu_title = MENU_TITLE; String menu_type = MENU_TYPE; String link = LINK; String reply_type = REPLY_TYPE; String text = TEXT; String material_id = MATERIAL_ID; String url = URL; String card_id = CARD_ID; String group_id = GROUP_ID; String component_id = COMPONENT_ID; String component_type = COMPONENT_TYPE; String menu_id = MENU_ID; String menu_title = MENU_TITLE; String menu_type = MENU_TYPE; String link = LINK; String reply_type = REPLY_TYPE; String text = TEXT; String material_id = MATERIAL_ID; String url = URL; String card_id = CARD_ID; String group_id = GROUP_ID; String component_id = COMPONENT_ID; String component_type = COMPONENT_TYPE; // Args in JSON format String myArgs = String.format("{\"e_douyin_id\": \"%s\", \"menu_list\": [{\"menu_id\": \"%s\", \"menu_title\": \"%s\", \"menu_type\": \"%s\", \"link\": \"%s\", \"reply\": {\"reply_type\": \"%s\", \"text\": \"%s\", \"image\": {\"material_id\": \"%s\", \"url\": \"%s\"}, \"card_id\": \"%s\", \"group_id\": \"%s\"}, \"component\": {\"component_id\": \"%s\", \"component_type\": \"%s\"}, \"sub_menu_list\": [{\"menu_id\": \"%s\", \"menu_title\": \"%s\", \"menu_type\": \"%s\", \"link\": \"%s\", \"reply\": {\"reply_type\": \"%s\", \"text\": \"%s\", \"image\": {\"material_id\": \"%s\", \"url\": \"%s\"}, \"card_id\": \"%s\", \"group_id\": \"%s\"}, \"component\": {\"component_id\": \"%s\", \"component_type\": \"%s\"}}]}]}",e_douyin_id, menu_id, menu_title, menu_type, link, reply_type, text, material_id, url, card_id, group_id, component_id, component_type, menu_id, menu_title, menu_type, link, reply_type, text, material_id, url, card_id, group_id, component_id, component_type); System.out.println(post(myArgs)); } }
$ACCESS_TOKEN = "xxx"; $PATH = "/open_api/v1.0/enterprise/im/menu/save/"; /** * Build request URL * @param $path : Request path * @return string */ function build_url($path) { return "https://ad.oceanengine.com" . $path; } /** * Send POST request * @param $json_str : Args in JSON format * @return bool|string : Response in JSON format */ function post($json_str) { global $ACCESS_TOKEN, $PATH; $curl = curl_init(); $url = build_url($PATH); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $json_str, CURLOPT_HTTPHEADER => array( "Content-Type: application/json", "Access-Token: " . $ACCESS_TOKEN, ), )); $response = curl_exec($curl); curl_close($curl); return $response; } $e_douyin_id = E_DOUYIN_ID; $menu_id = MENU_ID; $menu_title = MENU_TITLE; $menu_type = MENU_TYPE; $link = LINK; $reply_type = REPLY_TYPE; $text = TEXT; $material_id = MATERIAL_ID; $url = URL; $card_id = CARD_ID; $group_id = GROUP_ID; $component_id = COMPONENT_ID; $component_type = COMPONENT_TYPE; $menu_id = MENU_ID; $menu_title = MENU_TITLE; $menu_type = MENU_TYPE; $link = LINK; $reply_type = REPLY_TYPE; $text = TEXT; $material_id = MATERIAL_ID; $url = URL; $card_id = CARD_ID; $group_id = GROUP_ID; $component_id = COMPONENT_ID; $component_type = COMPONENT_TYPE; /* Args in JSON format */ $my_args = sprintf("{\"e_douyin_id\": \"%s\", \"menu_list\": [{\"menu_id\": \"%s\", \"menu_title\": \"%s\", \"menu_type\": \"%s\", \"link\": \"%s\", \"reply\": {\"reply_type\": \"%s\", \"text\": \"%s\", \"image\": {\"material_id\": \"%s\", \"url\": \"%s\"}, \"card_id\": \"%s\", \"group_id\": \"%s\"}, \"component\": {\"component_id\": \"%s\", \"component_type\": \"%s\"}, \"sub_menu_list\": [{\"menu_id\": \"%s\", \"menu_title\": \"%s\", \"menu_type\": \"%s\", \"link\": \"%s\", \"reply\": {\"reply_type\": \"%s\", \"text\": \"%s\", \"image\": {\"material_id\": \"%s\", \"url\": \"%s\"}, \"card_id\": \"%s\", \"group_id\": \"%s\"}, \"component\": {\"component_id\": \"%s\", \"component_type\": \"%s\"}}]}]}", $e_douyin_id, $menu_id, $menu_title, $menu_type, $link, $reply_type, $text, $material_id, $url, $card_id, $group_id, $component_id, $component_type, $menu_id, $menu_title, $menu_type, $link, $reply_type, $text, $material_id, $url, $card_id, $group_id, $component_id, $component_type); echo post($my_args);
curl -H "Access-Token:xxx" -H "Content-Type:application/json" -X POST \ -d '{ "e_douyin_id": "E_DOUYIN_ID", "menu_list": [ { "menu_id": "MENU_ID", "menu_title": "MENU_TITLE", "menu_type": "MENU_TYPE", "link": "LINK", "reply": { "reply_type": "REPLY_TYPE", "text": "TEXT", "image": { "material_id": "MATERIAL_ID", "url": "URL" }, "card_id": "CARD_ID", "group_id": "GROUP_ID" }, "component": { "component_id": "COMPONENT_ID", "component_type": "COMPONENT_TYPE" }, "sub_menu_list": [ { "menu_id": "MENU_ID", "menu_title": "MENU_TITLE", "menu_type": "MENU_TYPE", "link": "LINK", "reply": { "reply_type": "REPLY_TYPE", "text": "TEXT", "image": { "material_id": "MATERIAL_ID", "url": "URL" }, "card_id": "CARD_ID", "group_id": "GROUP_ID" }, "component": { "component_id": "COMPONENT_ID", "component_type": "COMPONENT_TYPE" } } ] } ] }' \ https://ad.oceanengine.com/open_api/v1.0/enterprise/im/menu/save/

应答字段

字段类型描述
code
number
返回码,详见【附录-返回码】
message
string
返回信息,详见【附录-返回码】
data
json
json返回值
request_id
string
请求日志ID

应答示例

{ "code": 0, "message": "OK", "request_id": "xxxxx", "data": {} }