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
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();
|
|
|
|
}
|
|
}
|
|
}
|
|
|