一、接口权限确认与准备
- 确认接口权限
• 登录开放平台,进入「文档」→「接口权限」→ 搜索「关键词搜索接口」(通常为item.search
)。
• 若未开通,需提交权限申请,需填写用途说明(如“用于本站商品搜索功能”)。 - 获取接口参数
• 根据文档确认必选参数:
method: item.search
keyword: 搜索关键词
page_no: 分页页码
page_size: 每页数量
• 其他可选参数:价格区间(start_price
/end_price
)、排序方式(sort_by
)等。
二、签名认证与请求构造
微店API使用AppKey签名认证,需按规则生成签名(sign
)。
1.签名生成步骤
• 参数排序:将所有请求参数按字母升序排列(排除sign
自身)。
• 拼接字符串:格式为 key1=value1&key2=value2
(需URL编码)。
• 加密签名:使用 HMAC-SHA256
算法,以 App Secret
为密钥加密。
Python签名示例:
import hmac
import urllib.parse
from hashlib import sha256
def generate_sign(params, app_secret):
# 1. 参数排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接字符串
query_str = '&'.join([f'{k}={urllib.parse.quote_plus(str(v))}' for k, v in sorted_params])
# 3. HMAC-SHA256加密
sign = hmac.new(app_secret.encode(), query_str.encode(), sha256).hexdigest()
return sign.upper() # 微店要求大写
2.构造完整请求
import requests
def search_weidian_items(keyword, page=1, page_size=20):
app_key = "YOUR_APP_KEY"
app_secret = "YOUR_APP_SECRET"
url = "https://api.weidian.com/router"
# 基础参数
params = {
"method": "item.search",
"app_key": app_key,
"keyword": keyword,
"page_no": page,
"page_size": page_size,
"timestamp": int(time.time() * 1000) # 毫秒级时间戳
}
# 生成签名
sign = generate_sign(params, app_secret)
params["sign"] = sign
# 发送请求
response = requests.get(url, params=params)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"API请求失败: {response.text}")
三、数据解析与系统对接
1.字段映射与存储
• 解析接口返回的JSON数据,提取关键字段并映射到本地数据库:
# 示例:解析商品数据
def parse_items(response_data):
items = []
for item in response_data.get("result", {}).get("items", []):
mapped_item = {
"product_id": item["num_iid"],
"title": item["title"],
"price": float(item["price"]),
"image_url": item["image_url"],
"seller_id": item["seller_id"],
"category": item["category_name"]
}
items.append(mapped_item)
return items
# 存储到MySQL
def save_to_database(items):
with mysql.connector.connect() as db:
cursor = db.cursor()
sql = """
INSERT INTO products
(product_id, title, price, image_url, seller_id, category)
VALUES (%s, %s, %s, %s, %s, %s)
ON DUPLICATE KEY UPDATE price=VALUES(price)
"""
for item in items:
cursor.execute(sql, (
item["product_id"],
item["title"],
item["price"],
item["image_url"],
item["seller_id"],
item["category"]
))
db.commit()
2.分页与全量同步
• 循环调用直到无更多数据:
def sync_all_items(keyword):
page = 1
while True:
data = search_weidian_items(keyword, page=page)
items = parse_items(data)
if not items:
break
save_to_database(items)
if data["result"]["has_next"]:
page += 1
else:
break
四、系统集成实战场景
场景:搭建商品搜索中台
1.前端搜索页面
<!-- 搜索框 -->
<input type="text" id="searchInput" placeholder="输入商品关键词">
<button onclick="searchItems()">搜索</button>
<!-- 结果展示 -->
<div id="results"></div>
<script>
async function searchItems() {
const keyword = document.getElementById('searchInput').value;
const response = await fetch(`/api/search?keyword=${encodeURIComponent(keyword)}`);
const data = await response.json();
renderResults(data.items);
}
function renderResults(items) {
const html = items.map(item => `
<div class="item">
<img src="${item.image_url}" />
<h3>${item.title}</h3>
<p>价格:¥${item.price}</p>
</div>
`).join('');
document.getElementById('results').innerHTML = html;
}
</script>
2.后端API路由(Node.js示例)
const express = require('express');
const router = express.Router();
const { search_weidian_items } = require('./weidian_api');
router.get('/api/search', async (req, res) => {
try {
const { keyword } = req.query;
const data = await search_weidian_items(keyword);
res.json({ items: data.result.items });
} catch (error) {
res.status(500).json({ error: '搜索失败' });
}
});
五、安全与性能优化
1.防止高频调用
• 使用令牌桶算法限制用户搜索频率:
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
limiter = Limiter(app, key_func=get_remote_address)
@app.route('/api/search')
@limiter.limit("10/minute") # 每分钟最多10次
def search_api():
# ...
2.缓存热门关键词
• 对高频搜索词结果缓存1小时:
import redis
r = redis.Redis()
def get_cached_search(keyword):
cache_key = f"search:{keyword}"
cached = r.get(cache_key)
if cached:
return json.loads(cached)
data = search_weidian_items(keyword)
r.setex(cache_key, 3600, json.dumps(data)) # 缓存1小时
return data
六、常见问题处理
1.返回“无效签名”错误
• 检查项:
◦ 时间戳是否为毫秒级(需13位数字)。
◦ 参数是否按字母升序排列。
◦ App Secret
是否与平台显示一致。
2.搜索词包含特殊字符
• 使用URL编码处理关键词:
keyword = urllib.parse.quote_plus("手机/电脑")
3.高并发场景优化
• 使用异步任务队列(如Celery)处理搜索请求:
@celery.task
def async_search(keyword):
return search_weidian_items(keyword)
# 前端轮询任务结果
task = async_search.delay(keyword)
result = task.get(timeout=30)
七、高级功能扩展
1.结合NLP增强搜索
• 在调用微店API前,对用户输入进行分词和意图识别:
import jieba
from text_analysis import extract_keywords
def preprocess_query(query):
# 分词与去停用词
words = jieba.lcut(query)
keywords = extract_keywords(words)
return ' '.join(keywords)
2.数据聚合展示
• 整合微店与其他平台(如淘宝、京东)的搜索结果:
def multi_platform_search(keyword):
weidian = search_weidian_items(keyword)
taobao = search_taobao_items(keyword)
return merge_results(weidian, taobao)
通过以上步骤,可快速将微店关键词搜索能力对接到自有系统。重点关注数据一致性(定期同步更新价格库存)、搜索体验优化(智能推荐、纠错)及安全防护(防爬虫、参数校验)。