С# Загрузить файл с URL-адреса - не работает

Я пытаюсь заставить свою программу C# загрузить файл с адреса (http://example.com/test.txt, судя по всему, это не настоящий адрес)

Я устанавливаю веб-клиент и использую DownloadFile(), как показано ниже:

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

Я знаю, что должен содержать файл test.txt. Однако после того, как я запустил свой код С#, а затем открыл файл C:\test_dwl.txt, он не содержит ожидаемых данных.

Он просто говорит:

Для работы этого сайта требуется Javascript. Включите Javascript в своем браузере или используйте браузер с поддержкой Javascript

Что меня смущает, так это то, почему упоминается Javascript ?? Я уверен, что файл можно скачать напрямую. Если я ввожу адрес прямо в хром (http://example.com/test.txt) - он загружает правильный файл.

Я делаю что-то не так здесь? Или мне нужно использовать другой метод в С# для загрузки этих файлов.

Спасибо

РЕДАКТИРОВАТЬ: это то, что показывают инструменты 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>

Как я могу использовать это в С#??


person Zeller33    schedule 15.08.2016    source источник
comment
Что ж, этот URL не указывает на файл, который, по вашему мнению, должен быть. Я делаю что-то не так? --- предположительно вы запрашиваете неправильный URL.   -  person zerkms    schedule 16.08.2016
comment
Нет, я уверен, что это правильная ссылка. Как я уже сказал, ввод URL-адреса в chrome работает. На самом деле Ctrl+Click ссылки в Visual Studios открывает вкладку в Visual Studio с нужными данными????   -  person Zeller33    schedule 16.08.2016
comment
Проверьте инструменты разработчика Chrome (нажмите F12), вкладку сети, когда вы это сделаете. Вероятно, это загрузка файла js, который делает некоторые вещи, а затем загружает фактический текстовый файл.   -  person Blorgbeard    schedule 16.08.2016
comment
Я не уверен, как использовать инструменты разработчика Chrome? Не могли бы вы примерно направить меня. Также возможно ли встроить Javascript в программу С#, если это то, о чем они просят?   -  person Zeller33    schedule 16.08.2016
comment
Попробуйте перейти по этому URL-адресу с открытыми инструментами разработчика Chrome. Взгляните на любую сетевую активность, и вы, вероятно, увидите, что сервер, вероятно, обслуживает некоторый HTML (содержащий текст, который вы видите) с JavaScript, когда вы запрашиваете файл. Затем этот JS перенаправляет вас к файлу, который вы пытаетесь загрузить.   -  person João Lourenço    schedule 16.08.2016


Ответы (2)


Следуйте приведенному ниже коду и обработайте:

В 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]
        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";
        }

Надеюсь, это сработает для вас ...!

person Sanjeev Sangral    schedule 10.09.2016

Из быстрого поиска в Google я вижу, что файл, который вы пытаетесь загрузить, размещен на бесплатном хосте, таком как Byethost. Поэтому вам потребуется больше усилий, чтобы загрузить этот ресурс, чем просто использовать HTTP-клиент..
Обычно бесплатные хосты вставляют JavaScript на страницы, подобные этой, чтобы предотвратить загрузку файлов ботами.
WebClient — это просто клиент, который реализует спецификацию HTTP и ничего больше.

У вас есть два варианта:

  1. Переключитесь на (платный) хостинг с надлежащей поддержкой файлового хостинга.
    Пропускная способность не предоставляется бесплатно. Вы можете попробовать GitHub бесплатно, вы не возражаете против того, чтобы файл был общедоступным. (Конечно, вы можете использовать загадочные имена и скрыть их от поисковых систем)
  2. Используйте автономный браузер для загрузки.
    Автономный браузер — это, по сути, браузер без пользовательского интерфейса, но он поддерживает загрузку HTML и запуск JavaScript в модели DOM.
  3. Перепроектируйте их алгоритм.
    Поскольку вы предпочитаете скрывать подробности, я мало чем могу вам помочь. Но в html-файле из инструментов отладки есть скрипт, который использует библиотеку slowAES для расшифровки доступа. ключ к файлу.
    slowAES.decrypt(c, 2, a, b) использует function(cipherIn,mode,key,iv), поэтому
    c – это ciperIn, т. е. байты для расшифровки,
    2 – это параметр modeOfOperation, в данном случае CBC,
    a – это ключ, а
    b — это iv, он же вектор инициализации.
    Вы можете получить переменные a, b и c с помощью регулярных выражений или просто с помощью String.IndexOf(string, int), чтобы получить индекс строки (" только для трех вхождений. (которые находятся во время назначения переменных a, b, c) и следующие 32 символа после них, т.е. String.Substring(index,32) для всех 3 вхождений. И затем вы, вероятно, можете использовать преобразователь шестнадцатеричных значений в байты и передать их функциям RijndaelManaged для расшифровки ключа, затем преобразовать байты, возвращенные обратно в шестнадцатеричный формат, и передать соответствующие файлы cookie в заголовке HTTP Cookie (каждый раз, когда функция document.cookie используется) и, наконец, получить действительную ссылку на файл, когда вы отправляете запрос во второй раз с добавлением исходного URL-адреса с помощью ?ckattempt=1
    Я не исследовал, как testcookie Модуль nginx (используемый Byet Host для борьбы с ботами) работает, поэтому я не знаю, сработает ли мой метод для второго время на случай, если он использует интеллектуальный генератор сценариев.
    На данный момент у меня нет псевдокода. Я мог бы отредактировать ответ позже с помощью псевдокода, но я предполагаю, что это может потенциально нарушить ваше соглашение ToS с Byet Host. Так что разместите его на GitHub.
person prajaybasu    schedule 10.09.2016