102 lines
3.6 KiB
C#
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;
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|