繁体   English   中英

C#从URL下载文件-不起作用

[英]c# Download File from URL - not working

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

我设置了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的浏览器

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

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

谢谢

编辑:这是chrome开发工具显示的

<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#中使用它?

请按照以下代码进行处理:

在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.');
    }
}

在Web方法背后的代码中:

[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";
        }

希望这对你有用...!

通过快速的Google搜索,我发现您要下载的文件托管在免费主机上,例如Byethost。 因此,与仅使用HTTP客户端相比,您将需要更多的精力来下载此资源。
通常,免费主机会在此类网页上插入JavaScript,以防止漫游器下载文件。
WebClient只是实现HTTP规范的客户端,仅此而已。

您有两种选择:

  1. 切换到具有适当文件托管支持的(收费)主机。
    带宽不是免费的。 您可以免费试用GitHub,而不必担心文件是公共的。 (当然,您可以使用神秘名称并将其隐藏在搜索引擎中)
  2. 使用无头浏览器进行下载。
    无头浏览器基本上是没有UI的浏览器,但将支持在DOM上加载HTML和运行JavaScript。
  3. 对他们的算法进行逆向工程。
    由于您喜欢隐藏细节,因此我无济于事。 但是调试工具中的html文件具有一个脚本,该脚本使用slowAES库来解密对该文件的访问密钥。
    slowAES.decrypt(c, 2, a, b)正在使用function(cipherIn,mode,key,iv) ,因此
    c是ciperIn,即要解密的字节,
    2是modeOfOperation参数,在这种情况下为CBC,
    a是关键,并且
    b是iv,也就是初始化向量。
    您可以使用正则表达式或仅使用String.IndexOf(string, int)来获取变量abc String.IndexOf(string, int)以获取字符串的索引("仅出现3次(在分配变量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上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM