214 lines
7.6 KiB
Go
214 lines
7.6 KiB
Go
package jdapi
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"git.rosy.net.cn/baseapi"
|
|
"git.rosy.net.cn/baseapi/platformapi"
|
|
"git.rosy.net.cn/baseapi/utils"
|
|
)
|
|
|
|
const (
|
|
getStoreURL = "https://daojia.jd.com"
|
|
accessStorePageCookieName = "shop.o2o.jd.com1"
|
|
accessStorePageCookieName2 = "lsp-store1.jddj.com"
|
|
)
|
|
|
|
type SkuPageImg struct {
|
|
Big string `json:"big"`
|
|
Share string `json:"share"`
|
|
Small string `json:"small"`
|
|
}
|
|
|
|
type CorporationInfo struct {
|
|
Scope string `json:"scope"`
|
|
OperName string `json:"oper_name"`
|
|
Status string `json:"status"`
|
|
BelongOrg string `json:"belong_org"`
|
|
CreditNo string `json:"credit_no"`
|
|
RegNo string `json:"reg_no"`
|
|
ID string `json:"id"`
|
|
OrgNo string `json:"org_no"`
|
|
EconKind string `json:"econ_kind"`
|
|
EndDate string `json:"end_date"`
|
|
TermEnd string `json:"term_end"`
|
|
NeedID bool `json:"needID"`
|
|
Address string `json:"address"`
|
|
Partners []struct {
|
|
IdentifyType string `json:"identify_type"`
|
|
ShouldCapiItems []interface{} `json:"should_capi_items"`
|
|
StockType string `json:"stock_type"`
|
|
IdentifyNo string `json:"identify_no"`
|
|
RealCapiItems []interface{} `json:"real_capi_items"`
|
|
Name string `json:"name"`
|
|
} `json:"partners"`
|
|
Name string `json:"name"`
|
|
Province string `json:"province"`
|
|
TermStart string `json:"term_start"`
|
|
AbnormalItems []interface{} `json:"abnormal_items"`
|
|
CheckDate string `json:"check_date"`
|
|
RegistCapi string `json:"regist_capi"`
|
|
StartDate string `json:"start_date"`
|
|
Changerecords []struct {
|
|
BeforeContent string `json:"before_content"`
|
|
ChangeDate string `json:"change_date"`
|
|
ChangeItem string `json:"change_item"`
|
|
AfterContent string `json:"after_content"`
|
|
} `json:"changerecords"`
|
|
Branches []interface{} `json:"branches"`
|
|
Employees []struct {
|
|
JobTitle string `json:"job_title"`
|
|
Name string `json:"name"`
|
|
} `json:"employees"`
|
|
}
|
|
|
|
func (a *API) SetStoreCookie(storeCookie string) {
|
|
a.locker.Lock()
|
|
defer a.locker.Unlock()
|
|
a.storeCookie = storeCookie
|
|
}
|
|
|
|
func (a *API) GetStoreCookie() string {
|
|
a.locker.RLock()
|
|
defer a.locker.RUnlock()
|
|
return a.storeCookie
|
|
}
|
|
|
|
func (a *API) AccessStorePage(fullURL string, formData map[string]interface{}) (retVal map[string]interface{}, err error) {
|
|
storeCookie := a.GetStoreCookie()
|
|
if storeCookie == "" {
|
|
return nil, fmt.Errorf("需要设置Store Cookie才能使用此方法")
|
|
}
|
|
err = platformapi.AccessPlatformAPIWithRetry(a.client,
|
|
func() *http.Request {
|
|
var request *http.Request
|
|
if formData == nil {
|
|
request, _ = http.NewRequest(http.MethodGet, fullURL, nil)
|
|
} else {
|
|
request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(utils.Map2URLValues(formData).Encode()))
|
|
request.Header.Set("charset", "UTF-8")
|
|
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
|
}
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
request.AddCookie(&http.Cookie{
|
|
Name: accessStorePageCookieName,
|
|
Value: storeCookie,
|
|
})
|
|
request.AddCookie(&http.Cookie{
|
|
Name: accessStorePageCookieName2,
|
|
Value: storeCookie,
|
|
})
|
|
return request
|
|
},
|
|
a.config,
|
|
func(response *http.Response, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
|
retVal = jsonResult1
|
|
code := jsonResult1["code"].(string)
|
|
if code == ResponseCodeSuccess {
|
|
retVal = jsonResult1["result"].(map[string]interface{})
|
|
return platformapi.ErrLevelSuccess, nil
|
|
}
|
|
newErr := utils.NewErrorCode(jsonResult1["msg"].(string), code)
|
|
if _, ok := exceedLimitCodes[code]; ok {
|
|
return platformapi.ErrLevelExceedLimit, newErr
|
|
} else if _, ok := canRetryCodes[code]; ok {
|
|
return platformapi.ErrLevelRecoverableErr, newErr
|
|
} else {
|
|
baseapi.SugarLogger.Debugf("jd AccessStorePage failed, jsonResult1:%s", utils.Format4Output(jsonResult1, true))
|
|
return platformapi.ErrLevelCodeIsNotOK, newErr
|
|
}
|
|
})
|
|
return retVal, err
|
|
}
|
|
|
|
func (a *API) GetRealMobile4Order(orderId, stationNo string) (mobile string, err error) {
|
|
retVal, err := a.GetStoreOrderInfo(orderId, stationNo)
|
|
if err == nil {
|
|
return retVal["mobile"].(string), nil
|
|
}
|
|
return "", err
|
|
}
|
|
|
|
func (a *API) GetStoreOrderInfo(orderId, stationNo string) (storeOrderInfo map[string]interface{}, err error) {
|
|
urlStr := "http://store.jddj.com/order/newManager/search?pageNo=1&pageSize=1&orderBy=&desc=true¶m=" + orderId
|
|
if stationNo != "" {
|
|
urlStr += "&stationNo=" + stationNo
|
|
}
|
|
retVal, err := a.AccessStorePage(urlStr, nil)
|
|
// baseapi.SugarLogger.Debug(utils.Format4Output(retVal, false))
|
|
if err == nil {
|
|
newOrderinfoMains := retVal["newOrderinfoMains"].(map[string]interface{})
|
|
resultList := newOrderinfoMains["resultList"].([]interface{})
|
|
if len(resultList) > 0 {
|
|
return resultList[0].(map[string]interface{}), nil
|
|
}
|
|
return nil, fmt.Errorf("不能找到订单:%s的相关信息", orderId)
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
func (a *API) GetStoreOrderInfoList(fromTime, toTime string) (storeOrderList []map[string]interface{}, err error) {
|
|
pageSize := 100
|
|
pageNo := 1
|
|
urlTemplate := "http://store.jddj.com/order/newManager/tabQuery/all?o2oOrderType=10000&pageNo=%d&pageSize=%d&orderBy=&desc=true&startTimeQuery=%s&endTimeQuery=%s&stationNo="
|
|
for {
|
|
retVal, err := a.AccessStorePage(fmt.Sprintf(urlTemplate, pageNo, pageSize, url.QueryEscape(fromTime), url.QueryEscape(toTime)), nil)
|
|
// baseapi.SugarLogger.Debug(utils.Format4Output(retVal, false))
|
|
if err == nil {
|
|
newOrderinfoMains := retVal["newOrderinfoMains"].(map[string]interface{})
|
|
resultList := newOrderinfoMains["resultList"].([]interface{})
|
|
storeOrderList = append(storeOrderList, utils.Slice2MapSlice(resultList)...)
|
|
if len(storeOrderList) >= int(utils.MustInterface2Int64(newOrderinfoMains["totalCount"])) {
|
|
return storeOrderList, nil
|
|
}
|
|
pageNo++
|
|
} else {
|
|
return nil, err
|
|
}
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
func (a *API) GetSkuPageInfo(skuId int64) (skuPageInfo map[string]interface{}, err error) {
|
|
skuIDMap := map[string]interface{}{
|
|
"skuId": utils.Int64ToStr(skuId),
|
|
"storeId": "0",
|
|
}
|
|
skuPageInfo, err = a.AccessStorePage(fmt.Sprintf("https://daojia.jd.com/client?platCode=H5&functionId=product/detailV6_0&body=%s", utils.Format4Output(skuIDMap, true)), nil)
|
|
return skuPageInfo, err
|
|
}
|
|
|
|
func (a *API) GetSkuPageImageInfo(skuId int64) (imgList []*SkuPageImg, err error) {
|
|
skuPageInfo, err := a.GetSkuPageInfo(skuId)
|
|
if err == nil {
|
|
err = utils.Map2StructByJson(skuPageInfo["image"], &imgList, false)
|
|
}
|
|
return imgList, err
|
|
}
|
|
|
|
func (a *API) GetStoreInfo(storeId string) (storeInfo map[string]interface{}, err error) {
|
|
retVal, err := a.AccessStorePage(fmt.Sprintf("https://daojia.jd.com/client?functionId=store/storeDetailV220&body={\"storeId\":\"%s\"}&appVersion=6.1.0", storeId), nil)
|
|
return retVal, err
|
|
}
|
|
|
|
func (a *API) GetStoreList(lng string, lat string) (retVal map[string]interface{}, err error) {
|
|
retVal, err = a.AccessStorePage(fmt.Sprintf("https://daojia.jd.com/client?platCode=h5&appVersion=6.5.0&functionId=zone/recommendStoreList&body={\"channelId\":\"3997\",\"currentPage\":1,\"pageSize\":999,\"coordType\":\"2\",\"platform\":\"1\"}&signKey=b63f63fa9e27123b84a0c80ef5cd210d&lng=%s&lat=%s", lng, lat), nil)
|
|
return retVal, err
|
|
}
|
|
|
|
func (a *API) GetCorporationInfo(stationNo, qualifyNumber string) (corporatonInfo *CorporationInfo, err error) {
|
|
result, err := a.AccessStorePage("https://sta-store.jddj.com/store/requestQualify.o2o", map[string]interface{}{
|
|
"stationNo": stationNo,
|
|
"qualifyNumber": qualifyNumber,
|
|
})
|
|
if err == nil {
|
|
err = utils.Map2StructByJson(result, &corporatonInfo, false)
|
|
}
|
|
return corporatonInfo, err
|
|
}
|