C# CefSharp Winform抓取拼多多訂單


C# CefSharp Winform抓取拼多多訂單

前言

  • 只支持查詢自己的買家訂單
  • 支持Excel導出,只支持部分字段
  • 純技術實戰分享

如何使用

  • 直接運行項目
  • 登錄拼多多
  • 點擊全部訂單
  • 等待頁面加載不跳轉了,點擊 導出訂單按鈕

登錄驗證

基於CefSharp Winform加載Web瀏覽器(chrome內核),瀏覽器地址導航到http://mobile.yangkeduo.com/personal.html,然后用手機驗證碼方式登錄

獲取訂單數據

 if (request.Method.Equals("POST")&&request.Url.Contains("order_list"))
{
    var filter = FilterManager.GetFileter(request.Identifier.ToString()) as TestJsonFilter;
    if (filter==null)
    {
        return;
    }
    ASCIIEncoding encoding = new ASCIIEncoding();
    //這里截獲返回的數據
    var data = encoding.GetString(filter.DataAll.ToArray());
}

但是由於采用了分頁獲取的仍然不是全部,這樣我們必須通過手動模擬Post請求來加載全部

嘗試抓取Post數據

將byte轉為string之后得到json

{"timeout":1300,"type":"all","page":1,"pay_channel_list":["9","30","31","35","38","52","97","122","135","322","-1"],"origin_host_name":"mobile.yangkeduo.com","size":10,"offset":"200725-031832966363189"}

看得出size為10條數據 所以嘗試更改post入參試試,offset應該是分頁的最后條記錄作為偏移量,理論我們可以傳空試試,從第一條記錄消費

結論是拼多多那邊做了驗證 返回了errorCode 300000

重新梳理!

獲取Post Json

Encoding.Default.GetString(request.PostData.Elements[0].Bytes);將Byte轉為String
  • 第一頁json
{"timeout":1300,"type":"all","page":1,"pay_channel_list":["9","30","31","35","38","52","97","122","135","322","-1"],"origin_host_name":"mobile.yangkeduo.com","size":10,"offset":"200803-173139887143189"}
  • 第二頁
{"timeout":1300,"type":"all","page":1,"pay_channel_list":["9","30","31","35","38","52","97","122","135","322","-1"],"origin_host_name":"mobile.yangkeduo.com","size":10,"offset":"200727-071906181943189"}
  • 第三頁
{"timeout":1300,"type":"all","page":1,"pay_channel_list":["9","30","31","35","38","52","97","122","135","322","-1"],"origin_host_name":"mobile.yangkeduo.com","size":10,"offset":"200725-031832966363189"}

區別的只有offset,那么offset是啥

由於offset是前端請求必然是在后端返回的訂單數據里有,所以拿到offset值去搜索,可以找到為訂單order_sn字段!

那么下一步的思路清晰了,解析返回的json

解析返回json

  • 根據json建立model
public class Order
{
    public long server_time { get; set; }
    public List<OrderItem> orders { get; set; }
}
public class OrderItem { 
    /// <summary>
    /// 快遞單號
    /// </summary>
    public string tracking_number { get; set; }
    /// <summary>
    /// 訂單編碼
    /// </summary>
    public string order_sn { get; set; }
    /// <summary>
    /// 快遞公司ID
    /// </summary>
    public string shipping_id { get; set; }
    /// <summary>
    /// 訂單狀態 4為已收貨
    /// </summary>
    public int status { get; set; }
    /// <summary>
    /// 訂單金額
    /// </summary>
    public int display_amount { get; set; }
}
  • 獲取返回json,拿到最后一個的訂單編碼然后重新請求,直到訂單查完
if (request.Method.Equals("POST")&&request.Url.Contains("order_list"))
{
    var filter = FilterManager.GetFileter(request.Identifier.ToString()) as TestJsonFilter;
    if (filter==null)
    {
        return;
    }
    ASCIIEncoding encoding = new ASCIIEncoding();
    //這里截獲返回的數據
    var data = encoding.GetString(filter.DataAll.ToArray());
    var orderList= JsonConvert.DeserializeObject<Order>(data);
    if (orderList.orders!=null&& orderList.orders.Count!=0)
    {
        Thread.Sleep(1000);
        FilterManager.AddOrder(orderList);
        //反向排序
        orderList.orders.Reverse();
        //獲取第一個
        var order=orderList.orders.FirstOrDefault();
        string json = "{\"timeout\":1300,\"type\":\"all\",\"page\":1,\"pay_channel_list\":[\"9\",\"30\",\"31\",\"35\",\"38\",\"52\",\"97\",\"122\",\"135\",\"322\",\"-1\"],\"origin_host_name\":\"mobile.yangkeduo.com\",\"size\":10,\"offset\":\"#offset#\"}";
        json=json.Replace("#offset#", order.order_sn);
        chromiumWebBrowser.Navigate(Encoding.Default.GetBytes(json), request);
    }
}

導出Excel

引用NOPI進行導出,將List轉為DataTable

演示效果

企業微信截圖_15972252751830

開源地址

點我前往github


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM