wwservice/wwsync/apicaller.cs

102 lines
3.6 KiB
C#

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<string, string> cache_token = new Dictionary<string, string>();
private static HashSet<string> stopcorp = new HashSet<string>();
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<JObject> 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<JObject> 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;
}
}
}