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

admin7个月前淘宝api368
下面给出一份「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、转码、封面裁剪等后续流程。

相关文章

Python获取淘宝商品详情数据SKU接口

在电商领域,淘宝作为国内领先的电商平台,拥有海量的商品和丰富的店铺数据。对于开发者和数据分析师来说,能够获取淘宝商品的SKU(Stock Keeping Unit,库存进出计量的基本单元)详情数据至关...

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

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

item_cat_get:获得淘宝商品类目 API 接口实战演示说明

一、接口概述item_cat_get 接口是淘宝开放平台提供的用于获取商品类目信息的 API。通过该接口,开发者可以获取淘宝平台上的商品类目列表、类目属性、父类目等详细信息。这些信息包括但不限于类目的...

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

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

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

一、引言淘宝作为国内领先的电商平台,拥有海量的商品数据。对于开发者和数据分析师来说,获取淘宝商品详情数据对于市场分析、价格监控、用户体验优化等场景具有重要意义。本文将详细介绍如何使用Java编写爬虫程...

电商平台“图片搜索”接口获取数据全攻略

——淘宝、天猫、1688、京东、拼多多对比与实战一、背景:为什么需要“以图搜款”直播带货、社交电商、比价工具、ERP 选品、供应链爬虫都离不开“看到一张图,就能找到同款/相似款”的能力。各家官方把这项...

发表评论    

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