一、引言
在电商领域,图片搜索功能越来越受到重视。通过图片搜索 API,开发者可以实现基于图像内容的商品搜索,为用户提供更直观、便捷的购物体验。京东作为国内领先的电商平台,提供了图片搜索 API 接口,允许开发者将京东的商品图片搜索能力集成到自己的应用中。
二、接口概述
京东图片搜索 API 是一个 RESTful 风格的接口,用于上传图片并返回相似商品结果。主要功能包括:
- 图片搜索:通过上传图片或提供图片 URL,搜索京东平台上的相似商品。
- 多维度筛选:支持按价格、销量、品牌等维度对搜索结果进行筛选。
- 分页获取结果:支持分页获取搜索结果,方便应用展示。
接口基本信息:
- 请求方式:POST
- 请求参数:
- access_token:访问令牌
- image:图片文件(二进制)或图片 URL
- category:商品分类(可选)
- price_min:最低价格(可选)
- price_max:最高价格(可选)
- sort:排序方式(可选,如 price_asc、price_desc 等)
- page:页码(可选,默认 1)
- page_size:每页数量(可选,默认 20)
返回结果:
返回 JSON 格式数据,包含搜索结果列表、商品信息、分页信息等。
三、Python 请求示例
下面是一个使用 Python 请求京东图片搜索 API 的示例代码:
python
import requests
import json
import base64
# API 接口地址
api_url = "c0b.cc/R4rbK2"
class JdImageSearchAPI:
def __init__(self, client_id, client_secret, redirect_uri):
"""初始化API客户端"""
self.client_id = client_id
self.client_secret = client_secret
self.redirect_uri = redirect_uri
self.access_token = None
self.refresh_token = None
self.token_expires_in = 0
def get_access_token(self, code=None):
"""获取访问令牌"""
if self.access_token and self.token_expires_in > 0:
# 检查令牌是否有效
return self.access_token
# 如果有授权码,使用授权码换取令牌
if code:
token_url = "https://auth.jd.com/oauth/token"
data = {
"grant_type": "authorization_code",
"client_id": self.client_id,
"client_secret": self.client_secret,
"code": code,
"redirect_uri": self.redirect_uri
}
response = requests.post(token_url, data=data)
token_data = response.json()
if "access_token" in token_data:
self.access_token = token_data["access_token"]
self.refresh_token = token_data.get("refresh_token", "")
self.token_expires_in = token_data.get("expires_in", 0)
return self.access_token
else:
raise Exception(f"获取访问令牌失败: {token_data.get('error_description', '未知错误')}")
# 如果没有授权码,抛出异常
raise Exception("需要授权码来获取访问令牌")
def refresh_access_token(self):
"""刷新访问令牌"""
if not self.refresh_token:
raise Exception("没有刷新令牌")
token_url = "https://auth.jd.com/oauth/token"
data = {
"grant_type": "refresh_token",
"client_id": self.client_id,
"client_secret": self.client_secret,
"refresh_token": self.refresh_token
}
response = requests.post(token_url, data=data)
token_data = response.json()
if "access_token" in token_data:
self.access_token = token_data["access_token"]
self.refresh_token = token_data.get("refresh_token", self.refresh_token)
self.token_expires_in = token_data.get("expires_in", 0)
return self.access_token
else:
raise Exception(f"刷新访问令牌失败: {token_data.get('error_description', '未知错误')}")
def search_by_image_file(self, image_path, category=None, price_min=None, price_max=None, sort=None, page=1, page_size=20):
"""通过图片文件进行搜索"""
if not self.access_token:
raise Exception("请先获取访问令牌")
# 读取图片文件并转换为Base64编码
try:
with open(image_path, "rb") as file:
image_data = file.read()
image_base64 = base64.b64encode(image_data).decode("utf-8")
except Exception as e:
raise Exception(f"读取图片失败: {str(e)}")
# 构建请求参数
params = {
"access_token": self.access_token,
"image": image_base64,
"page": page,
"page_size": page_size
}
# 添加可选参数
if category:
params["category"] = category
if price_min is not None:
params["price_min"] = price_min
if price_max is not None:
params["price_max"] = price_max
if sort:
params["sort"] = sort
# 发送请求
response = requests.post("https://api.jd.com/imageSearch", data=params)
return response.json()
def search_by_image_url(self, image_url, category=None, price_min=None, price_max=None, sort=None, page=1, page_size=20):
"""通过图片URL进行搜索"""
if not self.access_token:
raise Exception("请先获取访问令牌")
# 构建请求参数
params = {
"access_token": self.access_token,
"image_url": image_url,
"page": page,
"page_size": page_size
}
# 添加可选参数
if category:
params["category"] = category
if price_min is not None:
params["price_min"] = price_min
if price_max is not None:
params["price_max"] = price_max
if sort:
params["sort"] = sort
# 发送请求
response = requests.post("https://api.jd.com/imageSearch", data=params)
return response.json()
# 使用示例
if __name__ == "__main__":
# 替换为你的应用信息
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"
REDIRECT_URI = "https://your-redirect-uri.com/callback"
# 初始化API客户端
api = JdImageSearchAPI(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)
# 获取访问令牌(需要先获取授权码)
# 注意:这里需要用户先访问京东授权页面获取授权码
auth_code = "your_authorization_code"
api.get_access_token(auth_code)
# 通过图片文件搜索
try:
result = api.search_by_image_file("path/to/your/image.jpg", category="手机", price_min=1000, price_max=5000, sort="price_asc")
print(json.dumps(result, indent=2, ensure_ascii=False))
except Exception as e:
print(f"搜索失败: {str(e)}")
# 通过图片URL搜索
try:
image_url = "https://example.com/your-image.jpg"
result = api.search_by_image_url(image_url, category="服装", page=1, page_size=10)
print(json.dumps(result, indent=2, ensure_ascii=False))
except Exception as e:
print(f"搜索失败: {str(e)}")
使用说明
-
获取应用凭证:首先需要在京东开放平台注册应用,获取 client_id 和 client_secret。
-
获取授权码:引导用户访问京东授权页面,获取授权码。
-
获取访问令牌:使用授权码调用
get_access_token
方法获取访问令牌。 -
进行图片搜索:可以通过上传本地图片文件或提供图片 URL 两种方式进行搜索。
-
处理返回结果:API 返回 JSON 格式数据,包含商品列表和相关信息,根据需要进行解析和展示。
注意:以上代码示例中的 URL、参数名称等可能需要根据京东 API 的实际情况进行调整,请参考京东开放平台的官方文档获取最新信息。