【问题标题】:c# Download File from URL - not workingc#从URL下载文件 - 不工作
【发布时间】:2016-08-15 22:41:47
【问题描述】:

我试图让我的 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 开发工具显示的内容

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

【问题讨论】:

  • 嗯,那个 url 没有指向你认为它应该指向的文件。“我在这里做错了吗?” --- 你大概请求了错误的 url。
  • 不,我确定这是正确的链接。就像我说的,将 url 输入 chrome 可以工作。事实上,在 Visual Studios 中按 Ctrl+单击链接会在 Visual Studio 中打开一个选项卡,其中包含正确的数据????
  • 检查 chrome 开发者工具(按 f12),网络选项卡,当你这样做的时候。它可能是在下载一个 js 文件,然后下载实际的文本文件。
  • 我不确定如何使用 chrome 开发工具?能不能大致指导一下。如果这就是他们所要求的,是否可以将 Javascript 嵌入到 c# 程序中?
  • 尝试在 Chrome 开发工具打开的情况下导航到该 URL。查看任何网络活动,您可能会看到服务器可能会在您请求“文件”时使用 JavaScript 提供一些 HTML(包含您看到的文本)。然后,该 JS 会将您重定向到您尝试下载的文件。

标签: c# url download webclient


【解决方案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.');
    }
}

在我们背后的代码中的 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";
        }

希望它对你有用...!

【讨论】:

    【解决方案2】:

    通过快速的谷歌搜索,我发现您尝试下载的文件托管在像 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) 获取字符串(" 的索引,仅出现3 次(在分配变量a 期间, b,c) 和后面的 32 个字符,即 String.Substring(index,32) 对于所有 3 次出现。然后您可能可以使用十六进制到字节转换器并将它们传递给RijndaelManaged 的函数来解密密钥,然后将返回的字节转换回十六进制并在 HTTP Cookie 标头中传递适当的 cookie(对于每个使用document.cookie 函数的时间),最后在您第二次发送请求时获得该文件的有效链接,并在原始 URL 后附加 ?ckattempt=1
      我还没有研究过testcookie nginx 模块(被 Byet Host 用来缓解机器人)是如何工作的,所以我不知道我的方法是否会在第二次使用智能脚本生成器的情况下起作用。
      我现在没有伪代码。稍后我可能会使用伪代码编辑答案,但我想这可能会违反您与 Byet Host 的 ToS 协议。所以将它托管在 GitHub 上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多