我零零總總用了好幾個月的時間,寫了一個自用的小程序,從 Aliexpress 上抓取訂單的小程序。剛開始寫的時候,該API還沒有開放,而且沒有訂單相關的功能。我完全是通過模擬用戶在網頁上的操作來做的:獲取網頁源碼,用正則取數據,然後組裝到本地數據庫。
期間經歷過Ali 的數次微調,每次微調,我都要耗費幾個小時做程序上的調整,最大的改動就是Ali 弄個新的 和 老的 訂單展示頁並存的時候。
最難的部分當數用戶登陸部分,一次登陸,需要跨幾個域,收集這幾個域返回的 Cookie,收集好幾個ajax返回的結果. Cookie 的問題,我用同一個 CookieContainer 解決了,但是 ajax 的,我還得老老實實的每個每個的按順序去請求。
前兩天,Ali 搞了一個小飛機,某狀態下沒有訂單,分頁居然有 2147483648 頁,一看就是溢出了,正當我准備調整程序的時候,他們又神一般的把這個問題修復了。
數月前,我就申請成開發者賬戶,而且通過了,只是一直沒有去研究。通過這次小飛機後,我決定,改用API獲取訂單數據,不在從網頁抓取了。
首先要注冊成為開發者:
http://gw.api.alibaba.com/isv/index.htm
注冊成功後,會分配給你一個應用的唯一標志:
其中:
Key 即為API 中說的 YOUR_APPKEY
簽名串 即為 API 中說的YOUR_APPSECRET
API 說明可以打開如下地址:
http://gw.api.alibaba.com/dev/doc/sys_auth.htm?ns=aliexpress.open
該步驟請求如下地址:
http://gw.api.alibaba.com/auth/authorize.htm?client_id=xxx&site=aliexpress&redirect_uri=urn:ietf:wg:oauth:2.0:oob
client_id 要填寫 APPKEY
redirect_uri 是同意授權後回調的地址,因為我寫的是客戶端,不是WEB應用,所以當然沒有回調地址,所以就用這個:urn:ietf:wg:oauth:2.0:oob
在請求之前,需要把上面的地址進行簽名,把簽名的值做為參數:_aop_signature的值,加到上面的地址裡,一起請求,簽名說明如下:
,只用
http://gw.api.alibaba.com/dev/tools/app_signature.html
獲取到臨時碼後,需要,所有的API都是通過授權碼進行操作的
授權碼獲取地址:
https://gw.api.alibaba.com/openapi/http/1/system.oauth2/getToken/{0}?grant_type=authorization_code&&client_id={1}&client_secret={2}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&code={3}
其中:
{0}處和{1}處填寫 APPKEY
{2} 處填寫 APPSECRET
{3}處填寫上一步獲取到的那個臨時授權碼 Code
need_refresh_token 如果為 false 的話,不會返回用於刷新授權碼的
返回的結果如下:
{"aliId":"xxx","resource_owner":"xxx","expires_in":"36000","refresh_token":"xxx","access_token":"xxx"}
expires_in 是授權碼的過期時間(秒),10個小時 (60 x 60 x 10)。如果過了10小時,就需要刷新授權碼。
refresh_token 是後面需要用的
access_token 即新的授權碼
授權令牌自生成時間起,會在10小時後過期,這時如果在訪問API,返回的是401 未授權。當該狀況發生時,需要刷新授權令牌。不需要 重新獲取 臨時碼。
請求地址:
https://gw.api.alibaba.com/openapi/param2/1/system.oauth2/getToken/{0}
POST 如下數據:
grant_type 值為固定的 refresh_token
client_id 值為 APPKEY
client_secret 值為APPSECRET
refresh_token 即上一步中獲取的令牌中的(refhreshToken)
刷新授權令牌 得到的結果 和用 臨時授權碼 得到的 授權令牌 大致一致,但是少了刷新碼,因為刷新碼的有效期為半年。
令牌的刷新碼(refreshToken),在API文檔中,說是半年有效期,但是在令牌中並沒有關於刷新碼的過期時間信息。
不知道我這樣說有沒有什麼不妥。
[AttributeUsage(AttributeTargets.Class | }
opts = input.Target (opts.AuthToken == }
使用起來很簡單,就是在需要做授權判斷的方法上加上相關的 Attribute
OrderDetail FindOrderById( url = .SetUrlKeyValue( rh = RequestHelper( ctx = JsonConvert.DeserializeObject<OrderDetail> }
不過,上面的還不夠,還需要在獲取實例的時候:
APIOpts GetAPIOpts( user, opts = (opts == opts = PolicyInjection.Create<APIOpts> opts = PolicyInjection.Wrap<APIOpts> }
好了,現在只需要在需要有授權的API方法上加上 NeedAuth 特性就行了,如果沒有授權,就會自動去授權,如果需刷新授權碼,就會自動刷新授權碼,代碼看起來清爽多了。