京东慧眼
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

209 lines
8.3 KiB

using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Windows;
namespace .Helpers
{
public class JdApiHelper
{
string boundary = "";
private string HttpPostData(string url, string cookie, byte[] files, string fileKeyName="file")
{
string responseContent;
var memStream = new MemoryStream();
var webRequest = (HttpWebRequest)WebRequest.Create(url);
// 边界符
var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");
// 边界符
var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
// 最后的结束符
var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");
// 设置属性
webRequest.Method = "POST";
webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
// 写入文件
const string filePartHeader =
"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
"Content-Type: image/jpeg\r\n\r\n";
var header = string.Format(filePartHeader, fileKeyName, "aaa.jpg");
var headerbytes = Encoding.UTF8.GetBytes(header);
memStream.Write(beginBoundary, 0, beginBoundary.Length);
memStream.Write(headerbytes, 0, headerbytes.Length);
memStream.Write(files);
//// 写入字符串的Key
//var stringKeyHeader = "\r\n--" + boundary +
// "\r\nContent-Disposition: form-data; name=\"{0}\"" +
// "\r\n\r\n{1}\r\n";
//foreach (byte[] formitembytes in from string key in stringDict.Keys
// select string.Format(stringKeyHeader, key, stringDict[key])
// into formitem
// select Encoding.UTF8.GetBytes(formitem))
//{
// memStream.Write(formitembytes, 0, formitembytes.Length);
//}
// 写入最后的结束边界符
memStream.Write(endBoundary, 0, endBoundary.Length);
webRequest.ContentLength = memStream.Length;
var requestStream = webRequest.GetRequestStream();
memStream.Position = 0;
var tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer, 0, tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer, 0, tempBuffer.Length);
requestStream.Close();
webRequest.Headers.Add("cookie", cookie);
webRequest.Headers.Add("origin", "https://www.jd.com");
webRequest.Headers.Add("referer", "https://www.jd.com");
webRequest.Headers.Add("sec-fetch-dest", "iframe");
webRequest.Headers.Add("sec-fetch-mode", "navigate");
webRequest.Headers.Add("sec-fetch-site", "same-site");
webRequest.Headers.Add("sec-fetch-user", "?1");
webRequest.Headers.Add("upgrade-insecure-requests", "1");
webRequest.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
webRequest.Headers.Add("accept-encoding", " deflate, br");
webRequest.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
webRequest.Headers.Add("cache-control", "no-cache");
var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(),
Encoding.GetEncoding("utf-8")))
{
responseContent = httpStreamReader.ReadToEnd();
}
httpWebResponse.Close();
webRequest.Abort();
return responseContent;
}
public string UploadFile(byte[] file, string cookie)
{
// 边界符
var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");
var b = GetFileData("upload.jpg", new MemoryStream(file), boundary: boundary);
// return HttpPostData("https://search.jd.com/image?op=upload", cookie, file);
//return "";
using (System.Net.WebClient webClient = new System.Net.WebClient())
{
try
{
webClient.Headers.Add("cookie", cookie);
webClient.Headers.Add("origin", "https://www.jd.com");
webClient.Headers.Add("referer", "https://www.jd.com");
webClient.Headers.Add("sec-fetch-dest", "iframe");
webClient.Headers.Add("sec-fetch-mode", "navigate");
webClient.Headers.Add("sec-fetch-site", "same-site");
webClient.Headers.Add("sec-fetch-user", "?1");
webClient.Headers.Add("upgrade-insecure-requests", "1");
webClient.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
webClient.Headers.Add("accept-encoding", " deflate, br");
webClient.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
webClient.Headers.Add("cache-control", "no-cache");
webClient.Headers.Add("content-type", $"multipart/form-data; boundary={boundary}");
var result = webClient.UploadData("https://search.jd.com/image?op=upload", b.ToArray());
string json = Encoding.Default.GetString(result);
return json;
}
catch(WebException ex)
{
string responseText;
using (var reader = new StreamReader(ex.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
}
MessageBox.Show(responseText);
WpfNoticeMsg.NoticeMessage.Show("请退出重新登录京东后重试!");
}
}
return string.Empty;
}
public static MemoryStream GetFileData(string fileName, MemoryStream file, string fileKeyName = "file", string boundary = "")
{
MemoryStream memStream = new MemoryStream();
// 边界符
var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
// 最后的结束符
var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");
//// 写入字符串的Key
//var stringKeyHeader = "--" + boundary +
// "\r\nContent-Disposition: form-data; name=\"{0}\"" +
// "\r\n\r\n{1}\r\n";
// 写入文件
const string filePartHeader =
"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
"Content-Type: image/jpeg\r\n\r\n";
var header = string.Format(filePartHeader, fileKeyName, fileName);
var headerbytes = Encoding.UTF8.GetBytes(header);
memStream.Write(beginBoundary, 0, beginBoundary.Length);
memStream.Write(headerbytes, 0, headerbytes.Length);
var buffer = new byte[1024];
int bytesRead; // =0
file.Seek(0, SeekOrigin.Begin);
while ((bytesRead = file.Read(buffer, 0, buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}
// 写入换行
var contentLine = Encoding.ASCII.GetBytes("\r\n");
memStream.Write(contentLine, 0, contentLine.Length);
// 写入最后的结束边界符
memStream.Write(endBoundary, 0, endBoundary.Length);
memStream.Position = 0;
return memStream;
//memStream.Close();
//requestStream.Close();
}
}
}