c#从URL下载文件 - 无法正常工作

时间:2016-08-15 22:41:48

标签: c# url downloading webclient-download

我试图让我的C#程序从地址(http://example.com/test.txt下载文件,obvs这不是真正的地址)

我设置了Webclient并使用DownloadFile(),如下所示:

WebClient client = new WebClient();
string filename =  @"C:\test_dwl.txt";
client.DownloadFile("http://example.com/test.txt", filename);

我知道test.txt文件应该包含什么。但是,在运行我的c#代码,然后打开C:\ test_dwl.txt后,它不包含预期的数据。

它只是说:

此网站需要使用Javascript,请在​​您的浏览器中启用Javascript或使用支持Javascript的浏览器

让我感到困惑的是为什么提到Javascript?我确定该文件可以直接下载。如果我直接将地址输入chrome(http://example.com/test.txt) - 它会下载正确的文件。

我在这里做错了吗?或者我是否需要在C#中使用其他方法来下载这些文件。

由于

编辑:这是chrome dev工具展示

<html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("e99c963ef2ec3e7d2f9e25eb2b02827b");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; document.cookie="referrer="+escape(document.referrer); location.href="http://example.com/test.txt?ckattempt=1";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>

我如何在c#??

中使用它

2 个答案:

答案 0 :(得分:1)

请按照以下代码处理:

在Js文件中:

var file_name = response.value[0]["name"];
var downloadurl = response.value[0]"@microsoft.graph.downloadUrl"];

// --------------------------------------------- -------------------------- //

function HandleIT(downloadurl,file_name) {
    PageMethods.ProcessIT(downloadurl,file_name, onSucess, onError);
    function onSucess(result) {
        alert(result);       
    }
    function onError(result) {
        alert('Something wrong.');
    }
}

在我们的代码中,Webmethod:

[WebMethod]
        public static string ProcessIT(string downloadURL, string file_name)
        {            
            // Create a new WebClient instance.
            WebClient myWebClient = new WebClient();
            string  path = @"c:\";
            string path_n_name = path + file_name; 
            // Download the Web resource and save it into the current filesystem folder.
            myWebClient.DownloadFile(downloadURL, path_n_name);
            return "SUCCESS";
        }

希望它适合你......!

答案 1 :(得分:0)

通过快速谷歌搜索,我发现您尝试下载的文件托管在像Byethost这样的免费主机上。因此,与简单地使用HTTP客户端相比,您需要更多的努力来下载此资源 通常,免费主机会将JavaScript插入此类页面,以防止机器人下载文件 WebClient只是一个实现HTTP规范的客户端,而不是其他任何东西。

您有两种选择:

  1. 切换到具有适当文件托管支持的(付费)主机 带宽不是免费的。你可以免费试用GitHub你不介意该文件是公开的。 (当然,您可以使用神秘的名称并将其隐藏在搜索引擎中)
  2. 使用无头浏览器进行下载 无头浏览器基本上是一个没有UI的浏览器,但支持加载HTML并在DOM上运行JavaScript。
  3. 逆向工程他们的算法 由于你更喜欢隐藏细节,我无能为力。但是调试工具中的html文件有一个脚本,该脚本使用slowAES库来解密文件的访问密钥。
    slowAES.decrypt(c, 2, a, b)正在使用function(cipherIn,mode,key,iv),所以
    c是ciperIn,即要解密的字节,
    2是modeOfOperation参数,在这种情况下是CBC,
    a是关键,而且 b是iv,也就是初始化向量 您可以使用正则表达式获取变量abc,或者仅使用String.IndexOf(string, int)获取字符串("的索引出现(在变量a,b,c的赋值期间)和接下来的32个字符,即所有3次出现的String.Substring(index,32)。然后你可以使用一个十六进制到字节的转换器并将它们传递给RijndaelManaged的函数来解密密钥,然后将返回的字节转换回十六进制并传递HTTP Cookie头中的相应cookie(每次使用document.cookie函数时,最后在第二次发送请求时获取文件的有效链接,并附加原始URL?ckattempt = 1
    我没有探讨testcookie nginx模块(由Byet Host用来缓解机器人)的工作方式,所以我不知道我的方法是否会在第二次使用智能脚本生成器时才能工作。登记/> 我现在没有伪代码。我可能稍后使用伪代码编辑答案,但我想这可能会违反与Byet Host的ToS协议。所以在GitHub上托管它。