文章出處

易盾是網易推出的反垃圾云服務,最近準備試用一下,但發現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;
    }
}

 


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()