获取数据包接口
请求地址
https://update.ti.360.cn/api/v2/list
请求方法
POST
请求参数
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
|---|---|---|---|---|
| timestamp | string | 是 | Header | 获取的设备上的当前时间戳,单位是秒。当设备上的timestamp与云端相差3600*24时,API返回出错 |
| key | string | 是 | Header | 由情报中心端颁发每台设备都会成对的颁发 key : salt |
| sign | string | 是 | Header | header 参数, sign = md5($type$timestamp$salt) |
| lid | string | 是 | Header | header 参数,能标识证书唯一性的ID。 |
| type | string | 是 | Body | body 要查询的子类型。目前支持的类型有:ti_data:IOC |
| package_type | string | 否 | Body | body需要查询的升级包类型。默认是 ti_data |
| version | string | 否 | Body | body当前设备上的 ioc 情报的版本 |
| data | list | 是 | Body | body默认传[] |
响应参数
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 结果状态,2000 表示成功,其它表示出错 |
| message | string | 对 code 的解释 |
| expire_time | int | 客户订阅的过期时间,单位是秒 |
| data | list | 结果数据,每个升级包为一个元素;如果证书已过期,则 data 为空; |
data中的每个元素的字段如下:
- type: string 升级包类型
- sub_type: string 子类型, all = 全量;increment=增量
- package_type: string ti_data 数据升级包
- name: string 升级包名称
- version : string 升级包版本
- size: int, 文件大小
- publish_time: int, 单位是秒, 升级包发布时间
- sha256: string 升级包的 sha256, 供校验升级包的完整性
- download_url: string 升级包的 S3 下载地址, 15 分钟内有效, 超过 15 分钟链接失效
请求示例
支持cUrl、Python、Java、PHP、Go语言的请求,示例如下
#!/usr/bin/env bash
set -euo pipefail
KEY="" # 设备 key
SALT="" # 设备 salt
LID="" # 证书唯一 ID
TYPE="ti_data:IOC"
URL="https://update.ti.360.net/api/v2/list"
BODY='{"type":"ti_data:IOC","version":"","data":[],"starttime":""}'
TIMESTAMP=$(date +%s)
SIGN=$(printf '%s' "${TYPE}${TIMESTAMP}${SALT}" | openssl dgst -md5 -hex | awk '{print $NF}')
curl --location --request POST "$URL" \
--header "Content-Type: application/json" \
--header "key: ${KEY}" \
--header "lid: ${LID}" \
--header "timestamp: ${TIMESTAMP}" \
--header "sign: ${SIGN}" \
--data "${BODY}"# -*- coding:utf-8 -*-
import requests
import time
import hashlib
import json
def get_package(ti_type, key, salt, lid):
cur_time=int(time.time())
sign= hashlib.md5((ti_type+str(cur_time)+salt).encode()).hexdigest()
print(sign)
header={
"lid": lid,
"sign": sign,
"timestamp": str(cur_time),
"key":key,
"Content-Type": 'application/json'
}
print(header)
data={
"type": ti_type,
"version": "",
"data": [],
"starttime":""
}
url="https://update.ti.360.net/api/v2/list"
res = requests.post(url=url, headers= header, data=json.dumps(data))
return res.text
if __name__ == "__main__":
ti_type="xxxx"
key="xxxx"
salt="xxxx"
lid="xxx"
res = get_package(ti_type, key, salt, lid)
print(res)import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
public class Demo {
static String md5(String input) throws Exception {
byte[] digest = MessageDigest.getInstance("MD5")
.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
String key = ""; // 设备 key
String salt = ""; // 设备 salt
String lid = ""; // 证书唯一 ID
String type = "ti_data:IOC";
String url = "https://update.ti.360.net/api/v2/list";
String body = "{\"type\":\"ti_data:IOC\",\"version\":\"\",\"data\":[],\"starttime\":\"\"}";
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String sign = md5(type + timestamp + salt);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("key", key)
.header("lid", lid)
.header("timestamp", timestamp)
.header("sign", sign)
.POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println(response.body());
}
}<?php
$key = ""; // 设备 key
$salt = ""; // 设备 salt
$lid = ""; // 证书唯一 ID
$type = "ti_data:IOC";
$url = "https://update.ti.360.net/api/v2/list";
$body = json_encode([
"type" => "ti_data:IOC",
"version" => "",
"data" => [],
"starttime" => "",
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$timestamp = (string) time();
$sign = md5($type . $timestamp . $salt);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"key: {$key}",
"lid: {$lid}",
"timestamp: {$timestamp}",
"sign: {$sign}",
],
]);
$response = curl_exec($ch);
if ($response === false) {
echo curl_error($ch), PHP_EOL;
} else {
echo $response, PHP_EOL;
}
curl_close($ch);package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"net/http"
"time"
)
func md5Hex(s string) string {
sum := md5.Sum([]byte(s))
return hex.EncodeToString(sum[:])
}
func main() {
key := "" // 设备 key
salt := "" // 设备 salt
lid := "" // 证书唯一 ID
typeName := "ti_data:IOC"
url := "https://update.ti.360.net/api/v2/list"
body := []byte(`{"type":"ti_data:IOC","version":"","data":[],"starttime":""}`)
timestamp := fmt.Sprintf("%d", time.Now().Unix())
sign := md5Hex(typeName + timestamp + salt)
req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("key", key)
req.Header.Set("lid", lid)
req.Header.Set("timestamp", timestamp)
req.Header.Set("sign", sign)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(respBody))
}响应示例
{
"expire_time": 1791820799,
"message": "OK",
"code": 2000,
"data": [
{
"publish_time": 1764275107,
"name": "IOC_all_v3.1.20251128.1.tar.gz",
"total_count": 6000001,
"package_type": "ti_data",
"download_url": "https://cn-zhengzhou-1.xstore.qihu.com/ioc-sdk-3g-plain/IOC_all_v3.1.20251128.1.tar.gz?response-content-disposition=attachment%3B%20filename%20%3D%20IOC_all_v3.1.20251128.1.477b2a70775d0991fef45bef3a20318d.tar.gz&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=VQR0WYKYCUGMPSO4CRVD%2F20251129%2Fsh-bt-1%2Fs3%2Faws4_request&X-Amz-Date=20251129T091113Z&X-Amz-Expires=21600&X-Amz-SignedHeaders=host&X-Amz-Signature=b662d1db1b710a9fe3762d87e3ff057df61fb628f4b6a792b0d309fb51cf060d",
"version": "v3.1.20251128.1",
"sha256": "39de3e3325442bfd431c2e472159a983426fafb169aed67a9cbe6037ae86338b",
"type": "IOC_SDK_3G_PLAIN",
"sub_type": "all",
"size": 146113824
}
]
}