using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace Api.Framework.Cps { /// /// 大淘客api /// public class DtkApi { private static DtkApi DTKApi = new DtkApi(); private DtkApi() { } public static DtkApi GetDtkApi() { return DTKApi; } //老道的大淘客appkey private string _appKey = "61a59957d79af"; private string _appSecret = "dce4f8ea16af4a920e4f07015cc62ecd"; public string SendDtk(string apiUrl, ApiParameters parameters, string version = "v1.0.0") { string result3; try { string url = this.BuildUrl(apiUrl, version, parameters); using (HttpClient client = new HttpClient()) { HttpResponseMessage response = client.GetAsync(url).Result; if (response.IsSuccessStatusCode) { Stream result2 = response.Content.ReadAsStreamAsync().Result; StreamReader streamReader = new StreamReader(result2, Encoding.GetEncoding("utf-8")); string result = streamReader.ReadToEnd(); streamReader.Close(); result2.Close(); result3 = result; } else { result3 = response.StatusCode.ToString(); } } } catch (Exception ex) { result3 = ex.Message; } return result3; } private string BuildUrl(string apiUrl, string version, ApiParameters parameters) { int nonce; string timer; string sign = this.MakeSign(out nonce, out timer); if (sign == "") { return ""; } string url = string.Concat(new string[] { apiUrl.Trim(), "?appKey=", this._appKey.Trim(), "&nonce=", nonce.ToString(), "&signRan=", sign, "&version=", version.Trim(), "&timer=", timer }); if (parameters.Value.Count <= 0) { return url; } for (int i = 0; i <= parameters.Value.Count - 1; i++) { url += string.Format("&{0}={1}", parameters.Value[i].Key, parameters.Value[i].Value); } return url; } private string MakeSign(out int nonce, out string timer) { Random rd = new Random(); nonce = rd.Next(100000, 1000000); timer = GetTimeStamp(); string result; try { result = Md5(string.Format("appKey={0}&timer={1}&nonce={2}&key={3}", new object[] { this._appKey, timer, nonce, this._appSecret })).ToUpper(); } catch (Exception) { result = ""; } return result; } private static string GetTimeStamp() { return Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds).ToString(); } private static string Md5(string value) { string result = string.Empty; if (string.IsNullOrEmpty(value)) { return result; } using (MD5 md5 = MD5.Create()) { result = GetMd5Hash(md5, value); } return result; } private static string GetMd5Hash(MD5 md5Hash, string input) { byte[] array = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); StringBuilder sBuilder = new StringBuilder(); foreach (byte t in array) { sBuilder.Append(t.ToString("x2")); } return sBuilder.ToString(); } } public class ApiParameters { private List> parameters = new List>(); public List> Value { get { return this.parameters; } } public void Add(string key, string value) { this.parameters.Add(new KeyValuePair(key, value)); } public bool Delete(string key) { bool result; try { int find = this.parameters.FindIndex((KeyValuePair a) => a.Key == key); if (find >= 0) { this.parameters.RemoveAt(find); } result = true; } catch { result = false; } return result; } public bool EditOrAdd(string key, string value) { bool result; try { int find = this.parameters.FindIndex((KeyValuePair a) => a.Key == key); if (find >= 0) { this.parameters.RemoveAt(find); } this.Add(key, value); result = true; } catch { result = false; } return result; } public bool Edit(string key, string value) { bool result; try { int find = this.parameters.FindIndex((KeyValuePair a) => a.Key == key); if (find >= 0) { this.parameters.RemoveAt(find); this.Add(key, value); } result = true; } catch { result = false; } return result; } public void Clear() { this.parameters.Clear(); } } }