using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System.Net.Http; namespace wwsync { internal class apicaller { private static Dictionary cache_token = new Dictionary(); private static HashSet stopcorp = new HashSet(); private static DateTime forbid_visit = DateTime.MinValue; public apicaller() { } private static async Task new_access_token(HttpClient _client, string corpid, string secret) { if(stopcorp.Contains(corpid)) return; if (DateTime.Now < forbid_visit) return; string url = string.Format(appsetteings.URL_access_token, corpid, secret); var r = await _client.GetStringAsync(url); var obj= JObject.Parse(r.ToString()); switch(Int32.Parse(obj["errcode"].ToString())) { case 0: cache_token[secret] = obj["access_token"].ToString(); break; case 40013: stopcorp.Add(corpid); LogHelper.Error("40013 corpid limit."); return; case 45009: forbid_visit = DateTime.Now.AddMinutes(30); LogHelper.Error("45009 forbid visit."); return; } } private static async Task requestview(HttpClient _client, string url, string secret, string corpid, string methon="get", object? data=null) { JObject error = JObject.Parse("{\"errcode\": -1, \"errmsg\": \"requestview network error.\"}"); try { if (!cache_token.ContainsKey(secret)) await new_access_token(_client, corpid, secret); if (!cache_token.ContainsKey(secret)) return error; url = url.Replace("@access_token@", cache_token[secret]); if (methon == "post") { string json = JsonConvert.SerializeObject(data); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await _client.PostAsync(url, content).ConfigureAwait(false); string result = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) return error; return JObject.Parse(result); } else { var r = await _client.GetStringAsync(url); return JObject.Parse(r.ToString()); } } catch(Exception ex) { LogHelper.Error(ex.ToString()); } return error; } public static async Task wwapiwithtoken(string url, string corpid, string secret, string methon = "get", object? data = null) { HttpClient _client = new(); var obj = await requestview(_client, url, secret, corpid, methon, data); string errcode = obj["errcode"].ToString(); if (errcode == "42001" || errcode == "40014") { if(cache_token.ContainsKey(secret)) cache_token.Remove(secret); obj = await requestview(_client, url, secret, corpid, methon, data); } return obj; } } }