2

所以我得到了这个

public class VirusTotal
{
    public string APIKey;
    string scan = "https://www.virustotal.com/api/scan_file.json";
    string results = "https://www.virustotal.com/api/get_file_report.json";

    public VirusTotal(string apiKey)
    {
        ServicePointManager.Expect100Continue = false;
        APIKey = apiKey;
    }

    public string Scan(string file)
    {
        var v = new NameValueCollection();
        v.Add("key", APIKey);
        var c = new WebClient() { QueryString = v };
        c.Headers.Add("Content-type", "binary/octet-stream");
        byte[] b = c.UploadFile(scan, "POST", file);
        var r = ParseJSON(Encoding.Default.GetString(b));
        if (r.ContainsKey("scan_id"))
        {
            return r["scan_id"];
        }
        throw new Exception(r["result"]);
    }

    public string GetResults(string id)
    {
        Clipboard.SetText(id);
        var data = string.Format("resource={0}&key={1}", id, APIKey);
        var c = new WebClient();
        string s = c.UploadString(results, "POST", data);
        var r = ParseJSON(s);
        foreach (string str in r.Values)
        {
            MessageBox.Show(str);
        }
        if (r["result"] != "1")
        {
            throw new Exception(r["result"]);
        }
        return s;
    }

    private Dictionary<string, string> ParseJSON(string json)
    {
        var d = new Dictionary<string, string>();
        json = json.Replace("\"", null).Replace("[", null).Replace("]", null);
        var r = json.Substring(1, json.Length - 2).Split(',');
        foreach (string s in r)
        {
            d.Add(s.Split(':')[0], s.Split(':')[1]);
        }
        return d;
    }
}

但是如果我输入了 URL 我会认为它是扫描的,但是我如何检索扫描回来并开始扫描过程

抱歉,我是 api 新手,我并没有真正得到 webclient thx 的帮助

4

1 回答 1

3

您实际上不需要在此处指定任何 URL。

当您上传文件进行扫描时,您会返回由 VirusTotal 生成的唯一请求 ID。该 ID 是Scan函数的返回值。如果您将此值存储在变量中,然后在调用中指定它,GetResults那么您应该得到结果。

代码将如下所示:

VirusTotal vtObject = new VirusTotal("%Your_API_key_here%");
string resultID = vtObject.Scan("%your_file_name_here%");
string results = vtObject.GetResults(resultID);

另请注意,文件扫描需要一些时间,因此您很可能会在results. 您可能希望GetResults在一段时间后随后调用,以便在 VT 处理您的文件后获取实际扫描数据。

于 2012-09-12T08:03:57.023 回答