实战代码解析淘宝视频接口

admin4个月前淘宝api276
下面给出一份「Java 版」可落地的淘宝商品视频接口实战代码,覆盖「Token 获取 → 签名 → 调用 → 解析 → 下载」完整链路。
示例基于 2025 年仍稳定的 taobao.item.video 专用接口(非 taobao.item.get 顺带取视频),返回字段更简洁,适合批量场景

一、接口速览

表格
复制
接口taobao.item.video
地址https://o0b.cn/jelena
方法POST(application/x-www-form-urlencoded)
鉴权OAuth2 + TOP 签名(MD5 大写)
核心入参num_iid(商品 ID)、fields(url,cover_url,duration)
返回示例{"item_video_response":{"video":{"url":"https://cloud.video.taobao.com/...mp4","cover_url":"...jpg","duration":15000}}}

二、Maven 依赖

xml
复制
<!-- HTTP --><dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3</version></dependency><!-- JSON --><dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.42</version></dependency>

三、签名工具(TOP 标准)

java
复制
public class TopSignUtil {
    /**
     * TOP 签名规则:md5(appSecret + k1v1k2v2... + appSecret) 转大写
     */
    public static String sign(Map<String, String> params, String appSecret) {
        String concat = params.entrySet().stream()
                              .filter(e -> e.getValue() != null && !e.getValue().isBlank())
                              .sorted(Map.Entry.comparingByKey())
                              .map(e -> e.getKey() + e.getValue())
                              .collect(Collectors.joining());
        String raw = appSecret + concat + appSecret;
        return DigestUtils.md5Hex(raw).toUpperCase();
    }}

四、统一入参实体

java
复制
@Datapublic class ItemVideoReq {
    private String method = "taobao.item.video";
    private String appKey;
    private String accessToken;
    private String timestamp;
    private String format = "json";
    private String v = "2.0";
    private String signMethod = "md5";
    private String numIid;
    private String fields = "url,cover_url,duration";}

五、Service 核心代码

java
复制
public class TbVideoService {
    private static final String GATEWAY = "https://eco.taobao.com/router/rest";

    public static VideoDTO getVideo(String accessToken, String numIid,
                                    String appKey, String appSecret) throws Exception {
        ItemVideoReq req = new ItemVideoReq();
        req.setAppKey(appKey);
        req.setAccessToken(accessToken);
        req.setNumIid(numIid);
        req.setTimestamp(LocalDateTime.now()
                                      .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

        // 1. Bean → Map
        Map<String, String> map = new HashMap<>();
        BeanUtils.populate(req, map);
        // 2. 计算签名
        map.put("sign", TopSignUtil.sign(map, appSecret));

        // 3. 发送 POST
        try (CloseableHttpClient hc = HttpClients.createDefault()) {
            HttpPost post = new HttpPost(GATEWAY);
            List<NameValuePair> form = map.entrySet().stream()
                                          .map(e -> new BasicNameValuePair(e.getKey(), e.getValue()))
                                          .collect(Collectors.toList());
            post.setEntity(new UrlEncodedFormEntity(form, StandardCharsets.UTF_8));

            String json = hc.execute(post, r -> EntityUtils.toString(r.getEntity()));
            JSONObject root = JSON.parseObject(json);
            if (!root.containsKey("item_video_response")) {
                throw new RuntimeException("API 异常:" + json);
            }
            return root.getJSONObject("item_video_response")
                       .getObject("video", VideoDTO.class);
        }
    }}

六、返回 DTO & 下载示例

java
复制
@Datapublic class VideoDTO {
    private String url;       // 视频 mp4 直链
    private String coverUrl;  // 封面 jpg
    private Long duration;    // 毫秒}// 额外工具:把视频拉到本地public static void download(VideoDTO dto, String savePath) throws IOException {
    try (CloseableHttpClient hc = HttpClients.createDefault();
         FileOutputStream out = new FileOutputStream(savePath)) {
        hc.execute(new HttpGet(dto.getUrl()), resp -> {
            IOUtils.copy(resp.getEntity().getContent(), out);
            return null;
        });
    }}

七、Main 运行

java
复制
public class Application {
    public static void main(String[] args) throws Exception {
        String token = "YOUR_OAUTH_TOKEN";   // OAuth2 授权后获得
        String numIid = "906637149849";      // 淘宝商品 ID
        VideoDTO video = TbVideoService.getVideo(token, numIid,
                                                 "YOUR_APP_KEY", "YOUR_APP_SECRET");
        System.out.println("视频地址:" + video.getUrl());
        System.out.println("时长:" + video.getDuration() / 1000 + "s");

        // 可选:下载到本地
        download(video, "./" + numIid + ".mp4");
    }}

八、常见问题速查

表格
复制
现象原因解决
sign invalid顺序/大小写/时间戳格式错严格 ASCII 升序,时间戳格式 yyyy-MM-dd HH:mm:ss 
403 Forbidden未申请 item_video 权限到淘宝开放平台后台勾选权限包 
视频 url 403无 Referer 或 Cookie直链可空 Referer 下载,若遇 403 带 User-Agent: Mozilla/5.0 重试 
429频率超限免费版默认 1000 次/天,可购买增量包 

九、小结

  1. 专用 taobao.item.video 接口字段少、速度快,适合批量拿视频
  2. TOP 签名是固定套路,写好工具类后可复用到所有淘宝 API。
  3. 拿到 mp4 直链即可无缝集成 CDN、转码、封面裁剪等后续流程。

相关文章

Java 获取淘宝/天猫推荐商品列表实战指南

一、方案选择:官方 API vs 第三方数据服务1. 淘宝开放平台官方 API(推荐用于自有店铺)淘宝开放平台(Taobao Open Platform, TOP)提供了官方 SDK,适合管理自有店铺...

从客户需求到 API 落地:淘宝商品详情批量爬取与接口封装实践

一、需求分析:不只是"爬数据"那么简单在电商数据分析场景中,客户的核心需求通常包含三个层次:基础层:批量获取商品标题、价格、销量、评价等公开信息加工层:数据清洗、格式统一、实时更新...

淘宝商品评论数据获取实战:基于 Taobao.item_review 接口

在电商数据分析、用户体验优化和竞品分析中,获取商品评论是一项重要的功能。淘宝开放平台提供了商品评论的 API 接口,允许开发者通过合法的方式获取商品的用户评论数据。本文将详细介绍如何使用 Python...

1688 商品详情接口实战指南

在 B2B 电商领域,1688 作为国内最大的批发采购平台,沉淀了海量的商品与供应商资源。对于采购企业、数据分析机构及开发者来说,精准获取商品详情数据是实现智能选品、供应链优化、市场洞察的核心前提。而...

获取淘宝SKU商品详情数据api的实战指南

在电商数据分析、竞品监控、个性化推荐等场景中,获取淘宝商品的SKU(Stock Keeping Unit,库存进出计量的基本单元)详情数据至关重要。本文将详细介绍如何通过合法途径获取淘宝SKU商品详情...

API接口如何实现高并发:技术方案与优化策略

在现代互联网应用中,API接口的高并发处理能力是确保系统稳定性和用户体验的关键。高并发场景下,API接口需要能够快速响应大量同时请求,同时保持系统的稳定性和数据的准确性。本文将从多个方面探讨如何实现A...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。