易貝 (eBay (eBay) 關鍵字搜索 API 實戰:從認證到商品列表獲取全流程解析

在跨境電商開發領域,eBay 作為全球最大的在線交易平臺之一,其開放 API 為開發者提供了豐富的商品數據獲取能力。本文將聚焦 eBay 關鍵字搜索商品列表接口的實現,涵蓋 OAuth2.0 認證、高級搜索參數配置、分頁策略及完整代碼實現,幫助開發者快速構建穩定的 eBay 商品檢索功能。

一、eBay 搜索 API 基礎信息

eBay 提供的 Finding API 是獲取商品列表的核心接口,支持通過關鍵字、分類、價格區間等多維度篩選商品。

核心特點

  • 基于 RESTful 架構設計,支持 JSON/XML 響應格式
  • 采用 OAuth2.0 認證機制,安全性更高
  • 提供豐富的篩選參數,支持精確搜索
  • 單頁最大返回 100 條數據,支持分頁查詢

接口端點https://api.ebay.com/services/search/FindingService/v1

二、認證機制詳解

eBay Finding API 使用 OAuth2.0 進行身份驗證,獲取訪問令牌的步驟如下:

  1. 在 eBay 開發者平臺創建應用,獲取 Client ID 和 Client Secret
  2. 通過客戶端憑證流程 (Client Credentials Flow) 獲取訪問令牌
  3. 令牌有效期為 7200 秒 (2 小時),過期前需重新獲取

點擊獲取key和secret

三、核心搜索參數說明

  1. 基礎參數

    • keywords:搜索關鍵字(必填)
    • categoryId:商品分類 ID(可選)
    • itemFilter:過濾條件(價格區間、賣家類型等)
    • sortOrder:排序方式(BestMatch、PricePlusShippingLowest 等)
  2. 分頁參數

    • paginationInput.pageNumber:頁碼
    • paginationInput.entriesPerPage:每頁條數 (1-100)
  3. 輸出控制

    • outputSelector:指定返回字段,減少數據傳輸量

四、完整代碼實現

下面是使用 Python 實現的 eBay 關鍵字搜索商品列表功能,包含令牌管理和搜索邏輯:

eBay關鍵字搜索商品列表接口實現

import requests
import time
import json
from typing import Dict, List, Optionalclass EbaySearchAPI:def __init__(self, client_id: str, client_secret: str, site_id: str = '0'):"""初始化eBay搜索API客戶端:param client_id: 應用的Client ID:param client_secret: 應用的Client Secret:param site_id: 站點ID,0表示美國站"""self.client_id = client_idself.client_secret = client_secretself.site_id = site_idself.base_url = "https://api.ebay.com/services/search/FindingService/v1"self.oauth_url = "https://api.ebay.com/identity/v1/oauth2/token"self.access_token = Noneself.token_expiry = 0  # 令牌過期時間戳def _get_access_token(self) -> Optional[str]:"""獲取或刷新訪問令牌"""# 檢查令牌是否有效if self.access_token and time.time() < self.token_expiry:return self.access_token# 準備請求參數headers = {"Content-Type": "application/x-www-form-urlencoded","Authorization": f"Basic {self._encode_credentials()}"}data = {"grant_type": "client_credentials","scope": "https://api.ebay.com/oauth/api_scope"}try:response = requests.post(self.oauth_url,headers=headers,data=data,timeout=10)response.raise_for_status()token_data = response.json()# 保存令牌及過期時間self.access_token = token_data["access_token"]self.token_expiry = time.time() + token_data["expires_in"] - 60  # 提前60秒刷新return self.access_tokenexcept requests.exceptions.RequestException as e:print(f"獲取令牌失敗: {str(e)}")return Nonedef _encode_credentials(self) -> str:"""編碼客戶端憑證"""import base64credentials = f"{self.client_id}:{self.client_secret}".encode("utf-8")return base64.b64encode(credentials).decode("utf-8")def search_products(self,keywords: str,page: int = 1,per_page: int = 20,min_price: Optional[float] = None,max_price: Optional[float] = None,sort_order: str = "BestMatch") -> Dict:"""搜索eBay商品:param keywords: 搜索關鍵字:param page: 頁碼:param per_page: 每頁條數(1-100):param min_price: 最低價格:param max_price: 最高價格:param sort_order: 排序方式:return: 搜索結果"""# 獲取訪問令牌token = self._get_access_token()if not token:return {"error": "無法獲取訪問令牌"}# 準備請求參數params = {"OPERATION-NAME": "findItemsAdvanced","SERVICE-VERSION": "1.13.0","SECURITY-APPNAME": self.client_id,"GLOBAL-ID": f"EBAY-{self.site_id}","keywords": keywords,"paginationInput.pageNumber": page,"paginationInput.entriesPerPage": per_page,"sortOrder": sort_order,"response-data-format": "JSON"}# 添加價格過濾條件filter_index = 0if min_price is not None:params[f"itemFilter({filter_index}).name"] = "MinPrice"params[f"itemFilter({filter_index}).value"] = min_priceparams[f"itemFilter({filter_index}).paramName"] = "Currency"params[f"itemFilter({filter_index}).paramValue"] = "USD"filter_index += 1if max_price is not None:params[f"itemFilter({filter_index}).name"] = "MaxPrice"params[f"itemFilter({filter_index}).value"] = max_priceparams[f"itemFilter({filter_index}).paramName"] = "Currency"params[f"itemFilter({filter_index}).paramValue"] = "USD"filter_index += 1# 設置請求頭headers = {"Authorization": f"Bearer {token}","X-EBAY-SOA-REQUEST-DATA-FORMAT": "JSON"}try:response = requests.get(self.base_url,params=params,headers=headers,timeout=15)response.raise_for_status()return self._parse_response(response.json())except requests.exceptions.RequestException as e:print(f"搜索請求失敗: {str(e)}")return {"error": str(e)}def _parse_response(self, response: Dict) -> Dict:"""解析API響應,提取有用信息"""result = {"total_items": 0,"page": 0,"per_page": 0,"items": []}try:search_result = response["findItemsAdvancedResponse"][0]# 提取分頁信息pagination = search_result["paginationOutput"][0]result["total_items"] = int(pagination["totalEntries"][0])result["page"] = int(pagination["pageNumber"][0])result["per_page"] = int(pagination["entriesPerPage"][0])# 提取商品信息if "searchResult" in search_result and len(search_result["searchResult"][0]["item"]) > 0:for item in search_result["searchResult"][0]["item"]:result["items"].append({"item_id": item["itemId"][0],"title": item["title"][0],"price": {"value": float(item["sellingStatus"][0]["currentPrice"][0]["__value__"]),"currency": item["sellingStatus"][0]["currentPrice"][0]["@currencyId"]},"url": item["viewItemURL"][0],"location": item.get("location", [""])[0],"shipping_cost": float(item["shippingInfo"][0]["shippingServiceCost"][0]["__value__"]),"is_top_rated": "topRatedListing" in item and item["topRatedListing"][0].lower() == "true"})except (KeyError, IndexError, ValueError) as e:print(f"解析響應失敗: {str(e)}")result["error"] = f"解析響應失敗: {str(e)}"return result# 使用示例
if __name__ == "__main__":# 替換為你的eBay應用憑證CLIENT_ID = "your_client_id"CLIENT_SECRET = "your_client_secret"# 初始化API客戶端(美國站)ebay_api = EbaySearchAPI(CLIENT_ID, CLIENT_SECRET, site_id='0')# 搜索商品search_result = ebay_api.search_products(keywords="wireless headphones",page=1,per_page=20,min_price=20.0,max_price=100.0,sort_order="PricePlusShippingLowest")# 處理搜索結果if "error" not in search_result:print(f"找到 {search_result['total_items']} 個商品")print(f"當前第 {search_result['page']} 頁,共 {search_result['per_page']} 條/頁\n")for idx, item in enumerate(search_result["items"], 1):print(f"{idx}. {item['title']}")print(f"   價格: {item['price']['currency']} {item['price']['value']}")print(f"   運費: {item['price']['currency']} {item['shipping_cost']}")print(f"   鏈接: {item['url']}\n")else:print(f"搜索失敗: {search_result['error']}")

?

五、代碼核心功能解析

  1. 令牌管理機制

    • 自動處理令牌的獲取與刷新,無需手動干預
    • 提前 60 秒刷新令牌,避免請求時令牌過期
    • 使用 Base64 編碼客戶端憑證,符合 OAuth2.0 規范
  2. 搜索參數處理

    • 支持多維度篩選,包括價格區間、排序方式等
    • 靈活處理可選參數,僅在提供時添加到請求中
    • 嚴格遵循 eBay API 的參數命名規范
  3. 響應解析優化

    • 將原始 API 響應轉換為更友好的字典格式
    • 提取核心商品信息,去除冗余數據
    • 包含錯誤處理,提高代碼健壯性
  4. 多站點支持

    • 通過 site_id 參數支持不同國家 / 地區的 eBay 站點
    • 默認為美國站 (0),可根據需求切換為其他站點

六、實戰注意事項

  1. API 調用限制

    • Finding API 有調用頻率限制,默認每日 10,000 次
    • 建議實現請求間隔控制,避免觸發限流
  2. 站點選擇

    • 不同站點的商品和價格存在差異
    • 完整站點 ID 列表可參考 eBay 開發者文檔
  3. 錯誤處理

    • 常見錯誤包括令牌過期、參數錯誤、頻率超限
    • 實際開發中應根據錯誤代碼實現針對性處理
  4. 數據緩存

    • 對熱門搜索詞結果進行緩存,減少 API 調用
    • 緩存時間建議設置為 15-30 分鐘,保證數據新鮮度

七、功能擴展建議

  1. 實現批量搜索功能,支持多關鍵字同時查詢
  2. 添加商品圖片 URL 提取,豐富展示內容
  3. 集成價格趨勢分析,提供歷史價格數據
  4. 實現搜索結果的本地存儲,支持離線查看

通過本文介紹的方法,開發者可以快速集成 eBay 的商品搜索功能,為跨境電商應用提供穩定可靠的數據源。在實際開發中,需遵守 eBay 開發者協議,合理使用 API 獲取的數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

敏捷數據開發實踐:基于 Amazon Q Developer + Remote MCP 構建本地與云端 Amazon Redshift 交互體系

敏捷數據開發實踐&#xff1a;基于 Amazon Q Developer Remote MCP 構建本地與云端 Amazon Redshift 交互體系 新用戶可獲得高達 200 美元的服務抵扣金 亞馬遜云科技新用戶可以免費使用亞馬遜云科技免費套餐&#xff08;Amazon Free Tier&#xff09;。注冊即可獲得 100 美元的…

【SpringBoot】11 概念理解 - 深入理解 Java 和 Spring 中的容器、組件、類、對象與 Bean

文章目錄引言1. 基本概念解析1.1 類&#xff08;Class&#xff09;1.2 對象&#xff08;Object&#xff09;1.3 組件&#xff08;Component&#xff09;1.4 Bean 實例&#xff08;Bean Instance&#xff09;1.5 容器&#xff08;Container&#xff09;2. 運行時 vs. 非運行時的…

【學習嵌入式day-25-線程】

exec函數族exec函數族利用進程空間執行另一份代碼#include "../head.h"int main(void) {char *parg[5] {"./hello","how","are","you",NULL,};printf("execl-up\n");//execl("./hello", "./hello…

Rust 中 Box 的深度解析:作用、原理與最佳實踐

Rust 中 Box 的深度解析&#xff1a;作用、原理與最佳實踐 Box 是 Rust 中最基礎且最重要的智能指針類型&#xff0c;它在 Rust 的內存管理和所有權系統中扮演著核心角色。以下是關于 Box 的全面解析&#xff1a; Box 的核心作用 #mermaid-svg-m6liFZlmqOHRfIZB {font-family:&…

【測試用例】

需求背景部分金融/政企等行業客戶&#xff0c;企業內部安全要求較高&#xff0c;且因為某些原因未接入 sso 登錄&#xff0c;會要求 MG 提供較為復雜的密碼規則甚至提供強更機制&#xff1b;且每個客戶的安全要求不一樣目前 MG 線上密碼規則&#xff1a; 8 位以上&#xff0c;包…

Klipper-probe模塊

配置信息[probe] pin: !PD4 x_offset: 0 y_offset: 0 z_offset: -0.20 #the distance between nozzle and level switch speed: 10 samples: 2 #probe one point three times get an average samples_result: average sample_retract_dist: 5 samples_tolerance: 0.05 # …

Excel多級數據結構導入導出工具

Excel多級數據結構導入導出工具 這是一個功能強大的Excel導入導出工具庫&#xff0c;專門用于處理復雜的多級嵌套數據結構。通過自定義注解配置&#xff0c;可以輕松實現Java對象與Excel文件之間的雙向轉換。 核心功能特性 1. 多級數據結構支持 嵌套對象處理: 支持任意層級的對…

基于UniApp的新大陸物聯網平臺溫濕度檢測系統開發方案

新大陸物聯網平臺對接要點 認證方式&#xff1a; 使用AccessToken進行API認證 Token存儲在本地緩存中 數據格式&#xff1a; 溫度數據單位&#xff1a;攝氏度(C) 濕度數據單位&#xff1a;百分比(%) 時間格式&#xff1a;ISO 8601或時間戳 設備狀態&#xff1a; online:…

Git、JSON、MQTT

GIT簡介&#xff1a;Git是什么&#xff1f;Git是目前世界上最先進的分布式版本控制系統作用&#xff1a;版本控制&#xff08;版本的備份--->版本的回溯和前進&#xff09;多人協作優勢&#xff1a;SVN(集中式)劣勢&#xff1a;過度依賴服務器和網絡&#xff0c;容災性差Git…

yolo目標檢測技術之yolov11項目實戰(三)

yolo目標檢測技術之yolov11項目實戰&#xff08;三&#xff09; 文章目錄yolo目標檢測技術之yolov11項目實戰&#xff08;三&#xff09;一、 基于 YOLO11 的火焰與煙霧檢測系統&#xff08;實戰代碼&#xff09;項目目標環境搭建創建虛擬環境安裝依賴1.1 數據集準備1. 下載地址…

CF思維小訓練(二)

清晰的繽紛的都可以 臟兮兮的甜的也都有轉機 不想太小心 錯過第一百零一場美麗 CF思維小訓練&#xff08;二&#xff09; 書接上回CF思維小訓練-CSDN博客 雖然代碼很短&#xff0c;都是每一道題的背后都思維滿滿&#xff1b; 目錄CF思維小訓練&#xff08;二&#xff09;Arbo…

分布式鎖:從理論到實戰的深度指南

1. 分布式鎖是啥&#xff1f;為什么它比單機鎖更“硬核”&#xff1f;分布式鎖&#xff0c;聽起來高大上&#xff0c;其實核心問題很簡單&#xff1a;在多個機器、進程或服務同時搶奪資源時&#xff0c;怎么保證不打架&#xff1f; 想象一下&#xff0c;你在雙十一搶購限量款球…

基于UniApp的智能在線客服系統前端設計與實現

了解更多&#xff0c;搜索“程序員老狼”一、引言在當今數字化時代&#xff0c;客戶服務已成為企業競爭力的重要組成部分。本文將詳細介紹一款基于UniApp框架開發的跨平臺智能客服系統前端實現方案&#xff0c;該系統不僅具備傳統客服功能&#xff0c;還融入了現代即時通訊和人…

react與vue的對比,來實現標簽內部類似v-for循環,v-if等功能

前言&#xff1a;在vue中我們提供了很多標簽方法&#xff0c;比如用的比較多的v-for循環內容&#xff0c;v-if/v-show等判斷&#xff0c;可以直接寫在標簽中&#xff0c;大大提高了我們的開發效率&#xff0c;那么在react中有沒有類似的方法呢&#xff1f;我們這里來說一說。re…

PCB工藝-四層板制作流程(簡單了解下)

一&#xff09;流程&#xff1a;四層板的內層芯板&#xff0c;是由一張雙面覆銅板PP*2銅箔*2覆銅板蝕刻好線路&#xff0c;就是我們的芯板了PP全名叫半固化片&#xff0c;主體是玻璃纖維布環氧樹脂&#xff0c;是絕緣介質銅箔片&#xff0c;是單獨一張銅箔&#xff0c;很薄&…

無人機三維路徑規劃

文章目錄 1、引言 2、背景知識 3、核心算法 4、挑戰與優化 5、初始效果 6、需要改進地方 7、水平方向優化路線 8、垂直方向優化路線 9、與經過路線相交的網格都繪制出來 1、引言 介紹三維路徑規劃的定義和重要性:在無人機、機器人導航、虛擬現實等領域的應用。 概述文章目標和…

Spring-解決項目依賴異常問題

一.檢查項目的Maven路徑是否正確在確保新項目中的依賴在自己的電腦中已經存在的情況下&#xff1a;可以檢查項目的Maven路徑是否正確在拿到一個新項目時&#xff0c;要檢查這個項目的Maven路徑是自己電腦上設置好的Maven路徑嗎&#xff1f;如果不是&#xff0c;項目依賴會出問題…

系統設計——DDD領域模型驅動實踐

摘要本文主要介紹了DDD&#xff08;領域驅動設計&#xff09;在系統設計中的實踐應用&#xff0c;包括其在編碼規范、分層架構設計等方面的具體要求和建議。重點強調了應用層的命名規范&#xff0c;如避免使用模糊的Handler、Processor等命名&#xff0c;推薦使用動詞加業務動作…

開源衛星軟件平臺LibreCube技術深度解析

LibreCube技術深度解析&#xff1a;開源衛星軟件平臺的完整指南 LibreCube是一個專為CubeSat設計的模塊化開源衛星軟件平臺&#xff0c;它通過整合姿態控制、通信管理和任務調度等核心功能&#xff0c;為立方星開發者提供了完整的解決方案。本文將全面剖析LibreCube的技術架構…

React(四):事件總線、setState的細節、PureComponent、ref

React(四) 一、事件總線 二、關于setState的原理 1. setState的三種使用方式 (1)基本使用 (2)傳入一個回調 (3)第一個參數是對象,第二個參數是回調 2. 為什么setState要設置成異步 (1)提升性能,減少render次數 (2)避免state和props數據不同步 3. 獲取異步修改完數…