public static T DoPostFileWithUrl <T>(string url, IDictionary <string, string> para, byte[] file, IDictionary <string, string> headers = null) where T : ResponseBase { if (headers == null) { headers = new Dictionary <string, string>(); } headers["session"] = ServiceContainer.AccessToken; string param = string.Join("&", para.Select(obj => obj.Key + "=" + MsHttpRestful.UrlEncode(obj.Value, Encoding.UTF8))); string json = MsHttpRestful.PostBytesBodyReturnString(ServiceContainer.ServerAddress + "/" + url + "?" + param, file, Encoding.UTF8, headers); return(DeserializeObject <T>(json)); }
private List <PopGoods> QueryHtmlGoodsPage(Shop shop, int pageIndex, PopGoodsState state) { Uri goodsListPageUri = new Uri(shop.PopType == PopType.TMALL ? "https://item.manager.tmall.com/tmall/manager/table.htm" : "https://item.publish.taobao.com/taobao/manager/table.htm"); string goodsEditPageDomain = shop.PopType == PopType.TMALL ? "item.upload.tmall.com" : "item.publish.taobao.com"; string goodsEditPageUrlBase = shop.PopType == PopType.TMALL ? "https://item.upload.tmall.com/tmall/publish.htm?id=" : "https://item.publish.taobao.com/sell/publish.htm?itemId="; var goodsListPageXsrfCookieValue = CefCookieVisitor.GetCookieValues(goodsListPageUri.Host, "XSRF-TOKEN"); if (string.IsNullOrWhiteSpace(goodsListPageXsrfCookieValue)) { throw new Exception("没有找到相应XSRF-TOKEN,刷新页面重新登录"); } var goodsListPageDomainCookie = CefCookieVisitor.GetCookieValues(goodsListPageUri.Host, null); if (string.IsNullOrWhiteSpace(goodsListPageDomainCookie)) { throw new Exception("未找到域:" + goodsListPageUri.Host + " 的任何COOKIE ,刷新页面重新登录"); } var goodsEditPageCookie = CefCookieVisitor.GetCookieValues(goodsEditPageDomain, null); string goodsState = state == PopGoodsState.NONE ? "all" : (state == PopGoodsState.ONSALE ? "on_sale" : "in_stock"); var xhrdata = "jsonBody=" + MsHttpRestful.UrlEncode("{\"filter\":{},\"pagination\":{\"current\":" + pageIndex + ",\"pageSize\":20},\"table\":{\"sort\":{}},\"tab\":\"" + goodsState + "\"}", Encoding.UTF8); var header = new Dictionary <string, string>(); header.Add("X-XSRF-TOKEN", goodsListPageXsrfCookieValue.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries)[1]); var content = MsHttpRestful.SendTbData(System.Net.Http.HttpMethod.Post, goodsListPageUri, header, goodsListPageDomainCookie, xhrdata); var resp = Newtonsoft.Json.JsonConvert.DeserializeObject <TaobaoQueryGoodsListResponse>(content); List <PopGoods> goods = new List <PopGoods>(); if (resp == null || resp.success == false) { throw new Exception("返回数据错误,请点击页面分页进行验证后重新开始"); } if (resp.data.table.dataSource == null) { return(goods); } foreach (var g in resp.data.table.dataSource) { if (this.WaitGoOn() == false) { break; } //每个商品获取的时候,都有可能,登录超时或者其它问题,需要循环 PopGoods pg = null; string goodsEditPageUrl = goodsEditPageUrlBase + g.itemId; for (int i = 0; i < 5; i++) { if (this.WaitGoOn() == false) { break; } Debug.WriteLine("开始抓取商品:" + g.itemId); this.OnDownload("暂停", true, "第:" + (i + 1) + " 次下载,第:" + pageIndex + "/" + ((resp.data.pagination.total / resp.data.pagination.pageSize) + 1) + "页,第" + (goods.Count + 1) + "条商品详情", false); bool ret = QueryHtmlGoods(g, goodsEditPageUrl, goodsEditPageCookie, ref pg); if (ret == true) { goods.Add(pg); break; } } if (this.isStop == false && pg == null) { throw new Exception("抓取商品5次都为成功:" + g.itemId); } if (this.WaitGoOn() == false) { break; } //每次等待3秒,太快淘宝会返回错误 Thread.Sleep(3000); } return(goods); }
private void MarkPopDelivery(string popOrderId, string deliveryCompany, string deliveryNumber) { string formId = "//form[@id = 'orderForm']"; string inputMark = "input"; //第一步读取页面信息 var uri = new Uri("https://wuliu.taobao.com/user/consign.htm?trade_id=" + popOrderId); string cookies = CefCookieVisitor.GetCookieValues(uri.Host, null); string html = MsHttpRestful.SendTbData(System.Net.Http.HttpMethod.Get, uri, null, cookies, null); //第二步 提取数据 Dictionary <string, string> paras = new Dictionary <string, string>(); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); var form = doc.DocumentNode.SelectSingleNode(formId); if (form == null) { Debug.WriteLine(form); throw new Exception("未在页面中找到:" + formId); } var inputNodes = doc.DocumentNode.SelectNodes("//input"); if (inputNodes == null || inputNodes.Count < 1) { throw new Exception("未找到任何:" + inputMark + " 元素"); } foreach (var v in inputNodes) { if (string.IsNullOrWhiteSpace(v.GetAttributeValue("name", ""))) { continue; } paras[v.GetAttributeValue("name", "")] = v.GetAttributeValue("value", ""); } paras.Remove("q"); paras.Remove("type"); paras.Remove("cat"); paras["companyName"] = "请输入物流公司名称"; paras["event_submit_do_offline_consign"] = "1"; paras["offlineNewFlag"] = "1"; paras["_fmw.r._0.c"] = paras["receiverContactName"]; paras["_fmw.r._0.adr"] = paras["receiverDetail"]; paras["_fmw.f._0.fe"] = ""; paras["_fmw.f._0.fet"] = ""; paras["_fmw.n._0.g"] = "您可以在此输入备忘信息(仅卖家自己可见)。"; paras["initialWeightOld"] = "all"; //进行几种常见错误的检测 if (paras.ContainsKey("receiverZipCode") == false || paras["receiverZipCode"].Length != 6) { throw new Exception("邮政编码不为6位,当前值:" + paras["receiverZipCode"]); } if (paras.ContainsKey("receiverDetail") == false || paras["receiverDetail"].Length < 4) { throw new Exception("详细地址必须大于等于4个字,当前值:" + paras["receiverDetail"]); } paras["mailNo"] = deliveryNumber; paras["companyCode"] = deliveryCompany; //生成数据,该页面使用GBK编码 List <string> ss = paras.Select(obj => obj.Key + "=" + MsHttpRestful.UrlEncode(obj.Value, Encoding.GetEncoding("GBK"))).ToList(); string urlEncodeData = string.Join("&", ss); string ret = MsHttpRestful.SendTbData(System.Net.Http.HttpMethod.Post, uri, null, cookies, urlEncodeData); if (ret.Contains("恭喜您,操作成功")) { return; } if (ret.Contains("运单号不符合规则或已经被使用")) { throw new Exception("运单号不符合规则或已经被使用"); } throw new Exception("返回页面数据无法识别,请查看相应结果"); }