文章出處
文章列表
易盾是網易推出的反垃圾云服務,最近準備試用一下,但發現api文檔中只提供了Java, Python, PHP的示例代碼,卻沒有C#的示例代碼,于是參照Java示例代碼用C#實現了一下。
Java中用HashMap構建公共參數與私有參數,C#中則可以用Dictionary:
var parameters = new Dictionary<string, string>(); //公共參數 parameters.Add("secretId", "{secretId}"); parameters.Add("businessId", "{businessId}"); parameters.Add("version", "v2"); parameters.Add("timestamp", CurrentTimeMillis().ToString()); parameters.Add("nonce", new Random().Next().ToString()); //私有參數 parameters.Add("dataId", Guid.NewGuid().ToString()); parameters.Add("content", content); parameters.Add("dataOpType", "1"); parameters.Add("ip", ip);
Java中用 System.currentTimeMillis() 生成 timestamp,C#中沒有直接的對應實現,只能另外實現一個(來自C# 實現 Java 的 System.currentTimeMillis() 值):
private long CurrentTimeMillis() { return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; }
對于生成簽名的操作,Java中稍顯復雜,C#中用Lambda一氣呵成:
private string GenerateSignature(Dictionary<string, string> parameters, string secretKey) { var signatueString = string.Join(string.Empty, parameters.OrderBy(p => p.Key).Select(p => p.Key + p.Value)) + secretKey; return string.Join(string.Empty, MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(signatueString)).Select(s => s.ToString("x2"))); }
對于http請求操作,Java中有HttpClient,C#中也有:
var response = await _httpClient.PostAsync("/v2/text/check", new FormUrlEncodedContent(parameters));
對于響應結果解析,Java中有JsonParser,C#中有Json.NET:
var responseText = await response.Content.ReadAsStringAsync(); var jObject = JObject.Parse(responseText); var statusCode = jObject["code"].Value<int>(); if (statusCode == 200) { var action = jObject["result"]["action"].Value<int>(); return action == 1; } else { return false; }
完整實現代碼如下:
public class YiDunCheckSpam : ICheckSpam { private const string BASE_ADDRESS = "https://api.aq.163.com/"; private readonly HttpClient _httpClient; public YiDunCheckSpam() { _httpClient = new HttpClient(); _httpClient.BaseAddress = new Uri(BASE_ADDRESS); } public async Task<bool> IsSpamPost(string title, string content, string author, string ip) { var parameters = new Dictionary<string, string>(); //公共參數 parameters.Add("secretId", "{secretId}"); parameters.Add("businessId", "{businessId}"); parameters.Add("version", "v2"); parameters.Add("timestamp", CurrentTimeMillis().ToString()); parameters.Add("nonce", new Random().Next().ToString()); //私有參數 parameters.Add("dataId", Guid.NewGuid().ToString()); parameters.Add("content", content); parameters.Add("dataOpType", "1"); parameters.Add("ip", ip); parameters.Add("title", title); parameters.Add("nickname", author); var secretKey = "{secretKey}"; var signature = GenerateSignature(parameters, secretKey); parameters.Add("signature", signature); var response = await _httpClient.PostAsync("/v2/text/check", new FormUrlEncodedContent(parameters)); var responseText = await response.Content.ReadAsStringAsync(); var jObject = JObject.Parse(responseText); var statusCode = jObject["code"].Value<int>(); if (statusCode == 200) { var action = jObject["result"]["action"].Value<int>(); return action > 1; } else { return false; } } private string GenerateSignature(Dictionary<string, string> parameters, string secretKey) { var signatueString = string.Join(string.Empty, parameters.OrderBy(p => p.Key).Select(p => p.Key + p.Value)) + secretKey; return string.Join(string.Empty, MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(signatueString)).Select(s => s.ToString("x2"))); } private long CurrentTimeMillis() { return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; } }
文章列表
全站熱搜