Cey P Ответов: 1

Как отключить диалоговое окно сохранения с помощью веб-браузера window form.


Я застрял, я искал ответ уже несколько дней и не могу найти ни одного ответа, который соответствовал бы моим требованиям. Я не знаю, как это сделать. У меня пока нет никакого кода, так как я не знаю, возможно ли это.

У меня есть доступ пользователя на веб-сайте, а затем есть кнопка, которая, как только я нажму файл, он загрузится, и диалоговое окно сохранения отобразит запрос местоположения папки. В файле нет ссылки или адреса. Я думаю, что он создается в бэкэнде после нажатия кнопки excel.

Теперь мой вопрос заключается в том, как я могу загрузить файл excel после нажатия кнопки excel без отображения диалогового окна сохранения с помощью веб-браузера windows form? Или если это невозможно. Как я могу автоматически нажать кнопку Сохранить в диалоговом окне Сохранить, а затем автоматизировать расположение папки.

Что я уже пробовал:

Я пробовал исследовать и до сих пор не могу найти правильный код для своего настольного приложения

F-ES Sitecore

Вы автоматизируете управление веб - браузером в своем настольном приложении? Единственный способ, которым вы, вероятно, получите эту работу, - это если вы вообще не используете элемент управления веб-браузером, а вместо этого запросите файл самостоятельно, используя что-то вроде WebClient

https://msdn.microsoft.com/en-us/library/ez801hhe(v=против 110).aspx

Очевидно, что если это возможно, то полностью зависит от сайта, который вы автоматизируете, *если* вы автоматизируете веб-сайт, и миллион других важных вещей, которые вы не упомянули.

Cey P

Я автоматизирую загрузку файла excel. Каждый раз, когда я нажимаю кнопку excel, появляется диалоговое окно. Как я могу отключить его? Если веб-браузер невозможен, то где я должен это сделать, чтобы диалоговое окно сохранения не отображалось, но все равно сохраняло файл на моем локальном диске. Кстати, в excel нет ссылки.

F-ES Sitecore

Насколько это просто, зависит от страницы, которую вы автоматизируете, вы не можете принудительно загрузить из браузера, это никогда не сработает. Вместо этого ваш код должен будет действовать как браузер и отправлять одни и те же запросы на один и тот же сайт и обрабатывать ответ так, как вы хотите (то есть сохранять прямо на диск, а не то, что хочет сделать браузер). Я бы начал с использования чего-то вроде Fiddler или инструментов разработки браузера, чтобы точно увидеть, какой запрос отправляется, когда вы нажимаете кнопку и с какими данными POST, и эмулировать это с помощью HttpRequest или WebClient.

Cey P

Когда я щелкаю правой кнопкой мыши или проверяю элемент кнопки, он отображает изображение значка кнопки excel. Он не показывает путь или что-то еще, это просто изображения значка excel. Я могу загрузить файл с помощью webbrowser.document.getelememtid(“имя идентификатора кнопки”), а затем использовать webbrowser1.invokemember(“щелчок”), но появилось диалоговое окно сохранения. Что же мне делать? Так как excel не имеет url-адреса. Мне нужно автоматизировать загрузку файла excel.

F-ES Sitecore

Вам нужно эмулировать то, что делает браузер. Когда вы нажимаете кнопку, браузер делает запрос к серверу, который дает ответ, который является файлом для загрузки. Что вам нужно сделать, так это выяснить, как выглядит этот запрос (с помощью Fiddler, google it, это бесплатное приложение), и отправить тот же запрос с помощью кода (через WebClient и т. д.), Чтобы получить тот же ответ обратно. Забудьте об управлении webbrowser, вы никогда не получите то, что хотите, используя его.

Cey P

Большое спасибо, что ответили. Я попробую сделать это сейчас и вернусь к вам с результатом. Большое вам спасибо, что пришли.

Cey P

Я не уверен, что нашел его, так как я новичок в fiddler. Я нашел содержание-диспозицию: привязанность;filename=FileStats.xlsx-да. Этот файл-это то, что я ищу. Хотя я не уверен, как им пользоваться и действительно ли это то, что мне нужно. 😅

F-ES Sitecore

Вот и ответ, что вам нужно сделать, это посмотреть на запрос, то есть какой url был запрошен, какой глагол (вероятно, POST), Какие данные были отправлены в теле запроса, и какие заголовки запроса тоже были. Если вы сами отправляете одни и те же данные на один и тот же url-адрес с одинаковыми заголовками, вы должны получить один и тот же ответ, то есть двоичный файл для файла в виде потока, который затем можно сохранить.

Cey P

Как бы я узнал, используя скрипача, которого искал? Что если я его увижу, то уже буду знать?

F-ES Sitecore

Если вы уже не можете сказать, то методом проб и ошибок. Попробуйте отправить точно такие же данные для начала и идти оттуда. Если они попытались каким-то образом защитить загрузку с помощью сеансовых ключей или других трюков, то это может быть еще сложнее, так как вам может понадобиться отправить им что-то, что они вставляют в форму загрузки. Там нет единого ответа на все вопросы, все зависит от конкретного сайта, с которого вы пытаетесь загрузить.

Cey P

Я не знаю, верен ли мой url-запрос.

Я попробовал использовать приведенный ниже код, но получил следующую ошибку: "удаленный сервер вернул ошибку: (401) Unauthorized."

строка url = "https://abc.domainsite.com/Claims/EDI/EDIClaimsDashboard.aspx";

Сведения namevaluecollection, который = новый namevaluecollection, который();
// данных.Добавить("__eventtarget из", ""); // можно добавить любой пост необходимые данные.
data.Add("ctl00$PortalMasterContents$Img_Excel_Lst", "скачать"); // имитирует нажатие кнопки

использование (WebClient client = новый WebClient())
{
byte[] result = клиент.UploadValues(url, data); // UploadValues запускает сообщение
Файл.WriteAllBytes(@"C:\test\FileStats.xlsx", result); // сохранить ответ во временную папку

Cey P

Вот скрипач HexView
Почта https://abc.domainsite.com/Claims/EDI/EDIClaimsDashboard.aspx HTTP/1.1
Ведущий: abc.domainsite.com
Связь: держите-живой
Содержание-Длина: 18034
Cache-Control: max-age=0
Происхождение: https://abc.domainsite.com
Обновления Безопасности-Запросов: 1
Content-Type: application/x-www-form-urlencoded
Агент пользователя: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/64.0.3282.186 Safari/537.36
Принимаем: текст/HTML,применение/с xhtml+xml,в приложение/XML;Q в=0.9,изображений/файлов WebP,изображения/ранп,*/*;Q в=0.8
Реферер: https://abc.domainsite.com/Claims/EDI/EDIClaimsDashboard.aspx
Accept-кодировка: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: FedAuth=77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U2VjdXJpdHlDb250ZXh0VG9rZW4gcDE6SWQ9Il84YmM0N2U4Yy1lOWI1LTRkM2ItODc2OS0zYjQzZWRkYmFkMTMtNjk3RDhBM0FFMjY5QTk3RkU3NTM5MDcwQUM2NTg4NTYiIHhtbG5zOnAxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxucz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3Mtc3gvd3Mtc2VjdXJlY29udmVyc2F0aW9uLzIwMDUxMiI+PElkZW50aWZpZXI+dXJuOnV1aWQ6NjEzMWY1NTMtYTUyOS00NjgwLWE1NzEtZTRkYjBjN2RlZmYyPC9JZGVudGlmaWVyPjxJbnN0YW5jZT51cm46dXVpZDpmYzE0NjRlZC02ODA3LTRhN2YtYjVlNS02ZmQwMWM2ZjJjODg8L0luc3RhbmNlPjxDb29raWUgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwNi8wNS9zZWN1cml0eSI+QVFBQUFOQ01uZDhCRmRFUmpIb0F3RS9DbCtzQkFBQUFwR3ErNzF6MTcwQ3Q4UVdCRTFvMkxnQUFBQUFDQUFBQUFBQURaZ0FBd0FBQUFCQUFBQUQ0YUlSeGtiSHBoa1VQeDVOaEpTSGpBQUFBQUFTQUFBQ2dBQUFBRUFBQUFBWi9jdXJxaTJJMzdrV1liT21VZXZKZ0FnQUFSNi9jSHdqaTZUWkdJRzdwUjBoSWE0aUlPSlZ1dWZyelhzRmtjY3E2dTl4dEx6YVpWS2Ywb2dBYk5BNW9KZkdMM2pPYnZETUFScGdtMmwvQUJjZ0xUKzV3UjNUK3IrYW9vN0xsRDFINGlTcWlyaUxqNE1rRVZTRVRtR3lGRHRJL1JHeDNEbklEM0hKWkUvcElPQUYycVJnL3VrNFkweWZ0cERvMEUwQnd0M1VRb0ZnZjRIRU1Rc0tuTU5VdG1OVk1mbUtGY0tLOEVYNVRrUmdPeHNKdjRkN0N1NStTU2h5SDlmbkNOTExqejE5RE9zd1FDL05kS2hNUkRkNGMxRDdJMDVYUjNROWNQZ29EbXFLemRCRjRiL1Z5TWVBcnhQQnhMZDE0ZDlUQTRjYUNWM0dtNmJ0QVBGWkRLQ2lCOWtNelB1MmxWN3JMdFZ3ZXV5dzhXWmpBQ1ZVaHlXUk9UVlN6VnBHblZWdlB0L1NYbXBoV3dzTXIvK1hUZW9HNTJRV01FMXp4ZUNhclBFUFdXUHJTakk2SzBzNERmdm1LWFkyKzM0R2ZxZnFEYnd5UXVicWxUSjQrb0NzZnE5L3FGM1pERUJIVFFNYTdRZm5RL2szblNUc010a1JjanFtaUd6bm84bEN5ZUM1QXFzajdKT2FhL3Z3RlVtQml0ajNFVVJ2MVQ4VG1RZEdsUTM5cVgzQ1JlUjRyOTBKakIxMmZidzNNZGlDcnRLNEgrQ0t6VjhxT3RScndWa2pKbVVZa0hoaXh5UGR6V011bnUwWkxjcUtBaW8yRlQ2N0NJcjVOV0czTW1LUDM1SllLMUpTT2Jic0NIcGRmTmtJMFBTTjViSitKNUdLcjJualQxUDhEb3YrUFAzemdYMU5yQnFDMmhNUkZrTEthQU8zajA5aE5KR3c5WUNEQVo0U0QzQlBpMmtjNWdrY2UwNy82QzZoaTZNeEtpbWU2Z2ZvZm4xWDNLcld1TEw0MUZOeHFCTFVyUEdGa0wvN2lyQlY2b3NSVmdCQlR0NDVOdmhmQndZKzdUcitwUXhTYXhMRVd6NzZmY0k2SndCL1dHT3N5WnprVUFBQUF5MThycHdneG9tcWFXUk1ESGZrZFNQQXpy; FedAuth1=eDQ9PC9Db29raWU+PC9TZWN1cml0eUNvbnRleHRUb2tlbj4=; .ASPXANONYMOUS=-G3EhOHo0wEkAAAAZjNhNjU1MTAtMzI1Yy00OGMzLTg4ODUtNDc2Nzk2OGRiMDIz3kqcsFUfa_040NrqkfPuwPDU2G01; BIGipServerabc_domainsite_pool=3396209162.47873.0000; ASP.NET_SessionId=zkwrpqgvsbbwlmtkwwdcky4h; UserToken=UserName=myusername; TimeoutWarningLastAccessTime=1520477970195

__EVENTTARGET=&__EVENTARGUMENT=&ctl00%24hdnPageTracker=&ctl00%24hdnCallLogData=&ctl00%24jsVer=5.5.282&ctl00%24menuSel=2968&ctl00%24defaultPage=&ctl00%24TreeViewSelectNodesCount=&ctl00%24HdnTreeViewSelection=&ctl00%24HdnPwdExpiry=Your+password+will+expire+in+*+days.&ctl00%24HdnSSOEnable=&ctl00%24HdnSSOURL=&ctl00%24HdnCallCenterMenu=BENEFITS%2CCONTRACTS%2CPROVIDERS%2CMEMBERS%2CCLAIMS%2CAUTHORIZATIONS%2CADMINISTRATION&ctl00%24HdnAboutToTimeout=2&ctl00%24HdnTimeoutCheckInterval=60&ctl00%24HdnPathName=2&ctl00%24HdnTimeout=60&ctl00%24UCHeader1%24HdnSSOEnable=&ctl00%24UCHeader1%24HdnSSOURL=&ctl00%24PortalMasterContents%24HdnClientName=ABC&ctl00%24PortalMasterContents%24HdnSeriesCount=1&ctl00%24PortalMasterContents%24HdnChartType=Pie&ctl00%24PortalMasterContents%24Hdn_Lst_Grd_Rowindx=&ctl00%24PortalMasterContents%24HdnFlType_Rtrnd=W&ctl00%24PortalM

Cey P

Вот представление синтаксиса скрипача:
__EVENTTARGET=&__EVENTARGUMENT=&ctl00%24hdnPageTracker=&ctl00%24hdnCallLogData=&ctl00%24jsVer=5.5.282&ctl00%24menuSel=2968&ctl00%24defaultPage=&ctl00%24TreeViewSelectNodesCount=&ctl00%24HdnTreeViewSelection=&ctl00%24HdnPwdExpiry=Your+password+will+expire+in+*+days.&ctl00%24HdnSSOEnable=&ctl00%24HdnSSOURL=&ctl00%24HdnCallCenterMenu=BENEFITS%2CCONTRACTS%2CPROVIDERS%2CMEMBERS%2CCLAIMS%2CAUTHORIZATIONS%2CADMINISTRATION&ctl00%24HdnAboutToTimeout=2&ctl00%24HdnTimeoutCheckInterval=60&ctl00%24HdnPathName=2&ctl00%24HdnTimeout=60&ctl00%24UCHeader1%24HdnSSOEnable=&ctl00%24UCHeader1%24HdnSSOURL=&ctl00%24PortalMasterContents%24HdnClientName=ABC&ctl00%24PortalMasterContents%24HdnSeriesCount=1&ctl00%24PortalMasterContents%24HdnChartType=Pie&ctl00%24PortalMasterContents%24Hdn_Lst_Grd_Rowindx=&ctl00%24PortalMasterContents%24HdnFlType_Rtrnd=W&ctl00%24PortalMasterContents%24HdnFlType_Strnd=W&ctl00%24PortalMasterContents%24HdnSrchDt=0&ctl00%24PortalMasterContents%24HdnSrchFl=0&ctl00%24PortalMasterContents%24HdnSrchCl=0&ctl00%24PortalMasterContents%24HdnRowIndex=0&ctl00%24PortalMasterContents%24HdnSrchFileStatIdx=&ctl00%24PortalMasterContents%24HdnSrchEdiDatidx=-1&ctl00%24PortalMasterContents%24HdnSrchClHtmlData=0&ctl00%24PortalMasterContents%24Rbl_Lst=0&ctl00%24PortalMasterContents%24Img_Excel_Lst.x=11&ctl00%24PortalMasterContents%24Img_Excel_Lst.y=13&__VIEWSTATEGENERATOR=E87709A2&__VIEWSTATEENCRYPTED=&__EVENTVALIDATION=MYL9PQ%2FPSdNoeXcJC1wMghsQcdmBL85cnGqrzgePsUaCTWdfm5zFM94FZLtOqNhmiYmDkQuBHQSZr11cKZTITq1EUmJLS6G36cieBEQIGQSdbnEgrcXSizl8zEDndZPHcTQ2PLgtTWV5cJX4ha4go%2BtHgBFH54gd2c7vnFW5fH369oUocq1Qem14MrB9nRe8IdWtecTV9m072vPom2Kx1kE%2F8nDipwFb10cxCELnPGBQIEzXF92vd02pMZer5Lth7BdfFd3x3MNS8R0N4KCkyGG%2BI9T%2BY86oOZom%2FsDIc08QEXRZpZHQvXYv1V3ocIGYBpFQ9yXwxpWLRS37KNZc6LAWI7%2F7st%2FqCSltnxxnRciTxYoBDLqHC%2F4ygWxA5w78Y9tXnsTrAxE6BJdTh4t129LuFv3EOvs%2BYYfzdqpfRIMsLyIrDtkxerm1FkGT6rOdovL3yLHnulRCCmKndAnqeNI%2FBBGQRQp9mA3aIZo2GNJLzixtfbmZ5phWOV3QBpnMv2celXp11uzuyV3pDqEqFach46syMGuIITWq4lf5HiWAtUu%2BZrEfeKXJzz87P13tAdsxqDNQ6HR6%2FX6gwVCwKO%2BytJPCdmmfQKjMn4N1ZL77E3YAr5X2C4OS7BcE3CCj0ADFnAOITxL6alUgmKsm6SAzfmVimb9VVcBL1ajmta9u6H%2FA0al0cR75jQJ81cwyw5jhim5QqXLJlHCQQgt1nD1Tvbjv96dRrcAf%2B7ooum7h92mUepWQRtS4kN1l%2FldQSp3ZZZfBKCXeZUnjMxDlywg%2BNK5SnvBowX3T9wqBTjiQOKxKlO5y5HUbKG76EvYowWS3Og8Y3IRZlhjKRt2ueS8xBsrTd1LWpf5xroK2rxNsvrSt4SldIfC7qg0rmNNxDoVYKAjBWSpuHHx%2BD1MVvjfVC%2FfG%2Bxod2iWHw045U188b%2FQsROqsBsOTLhWvI%2BNqqfAJ9trybx1Y%2FfalCTiQ6Yi0di5W0FkjIDWVb%2BpOCL3JI5PlxjdwcVnBWbJWvAMXUxAsW2%2FtZA%2BO6dzMlZdeSgzCfUJJqVlZK5%2FONNETlwPXM6GDg8CEpNYyZAtrhK4bWvaif9MpTuClmklJkITdIrNWoxPlLlfsHOoC5W%2BcXHGs5nM1%2B%2FbzWV3lgtje7ZVBiRZ0EDNXEv%2BSSpjnu7Mf4lxDaLDC30sWI74v0MXnYwd%2B3NuumQ%2BdBvB%2Bev1o5epHvak4JbLAN1t6o1tzVjpfpvPbYRNeBVf1meq5%2F94cQNNCWhFGV3oAXDUbBFgVD3cbVaHi4Raqnx0vZD1UJnssjdFeYaH3FhWVi8A9h0xHoQtqZup2jizcGxrYb5RXKBI47l89S1nEl2k3DRq1HPltxyd%2Bz2GLq8WyxeuhCBggCxWfGJxkiWiGlARCLHMtj3tz7AdFAo8EzK7GstNIAKpe3g4ztGHvD0DKUokE2FJz8vsoKDcW97Av%2BdpJNUOlFd5lrYnrHRIvHFLsmKC9uk%2FMO5WENHsCfVhKUDztsKhknS1x75Ergbk%2BhI7QakYcaXflsEoZeeSYMSDao0NegzZc6ObUVkKhc0UJuylQV%2FPauKY1bp8Wn3cPxiVHPsbavPr%2FrEyK74FF2eIh6BGjGCyVOG0tc9Py9GiPYDAynV0SR7AloETAZgvL0lqlvbcisdDYW1NT6o1oyYRglDRPen7D4QYhb3mQiIDBHe%2B%2BszV0vrjf0OM6meYeTwr5C7PtVGTVKqAp644kzl0A7cKnCYfE2geHCyaBqMSkjS2UgqUKIs37tHrEYD1zDjcbRBPc1NaYeeBlhYNVrD%2FdAUkYQTez4faRyRgDrm00dQA0WI%2BrXKeyljIDpNi8dOdxwKI1JhuIgLi2%2BUXeWX%2B5%2FYUGUVCXj95P27a6ECteyrxY1kYrMXK2jFfN0zNy5HCxDjAU4tFFSE7JhchwiC6FGzheI%2FbXYDBDFppjIhUCYHvyv%2B7FTU4oHdlHWIQ0uYFhYAfbss516lUzBxwVcdf%2FPbvfPJZ1fYxXVHMOSYTPne2znLCXxdQOpWs%2B5todoqnQDf8V20eD%2FQnNkh%2BMN3aVRRFgTVy9BYJP9mrLJZJep9fPCn405XIugHqBQxVyEuISF7ZqbIvlfNW8lS7wy3uAx7avnsYMIF3YucDuP185mCmiRJxtjKlPY2BwL4iKq5n2wyKkHHZpXROVG7agV7zFc2ZAPrdUJrJadD6HGVJWbBHOVZbMEVaUuhjA&__VIEWSTATE=HOrFut2JKiM0JDPxZXeDgd9h7xsJkDn05owgP38uGwt

Cey P

Ф-Эс, у меня есть сообщение о несанкционированной ошибке 401. Могу ли я все еще использовать приведенный ниже код, даже если у меня нет доступа к серверу? Только просмотр доступа?

F-ES Sitecore

If you're getting a 401 you're going to have to work out exactly what headers or cookies you need to send that are going to make the site consider you a valid user. That will depends on what security mechanisms they have in place. It's going to involve actually understanding the mechanism they use so you know what to send them to consider you valid. I'd start by sending the "Cookie" header that contains the FedAuth data and see if that works. Worse case scenario you might have to programatically "log-in" to the site too to be given an updated FedAuth token to send if you can't just re-use the one you have (it might have an expiry attached to it for example, it might be tied to an IP address, again I don't know, it all depends on what the target site is doing to handle auth, there is no one-size-fits-all solution)

1 Ответов

Рейтинг:
1

F-ES Sitecore

Если моя страница загрузки выглядит так;

<asp:Button ID="btnDownload" runat="server" Text="Download" OnClick="btnDownload_Click" />


с фоновым кодом

protected void btnDownload_Click(object sender, EventArgs e)
{
    string path = "~/files/pic.png";
    Response.Clear();
    Response.Buffer = true;
    Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", Path.GetFileName(path)));
    Response.ContentType = "application/octet-stream";
    Response.BinaryWrite(File.ReadAllBytes(Server.MapPath(path)));
    Response.Flush();
    Response.End();
}


Таким образом, нажатие кнопки загрузки приводит к тому, что код записывает файл files/pic.png в клиент и запускает загрузку в браузере. Если я смотрю на запрос в Fiddler то это к этому url

http://localhost:50725/Default.aspx


а данные post выглядят примерно так;

__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=D2GscibKx2pwUA ...


Это значения формы на странице. Важный бит данных post - это бит, который говорит asp.net то, что кнопка загрузки была нажата, вот это

ctl00%24MainContent%24btnDownload=Download


Если я просматриваю источник своей страницы, то вижу, что моя кнопка загрузки называется "ctl00$MainContent$btnDownload" (она использует master pages ergo странное имя). Поэтому я хочу опубликовать этот url-адрес с этим в данных post, и это сделает asp.net думаю, что запрос пришел из браузера, нажав на кнопку загрузки, поэтому я просто хватаю ответ и сохраняю его в файл;

string url = "http://localhost:50725/Default.aspx";

NameValueCollection data = new NameValueCollection();
// data.Add("__EVENTTARGET", ""); // you can add any post data as needed
data.Add("ctl00$MainContent$btnDownload", "Download"); // this simulates the button click

using (WebClient client = new WebClient())
{
    byte[] result = client.UploadValues(url, data); // UploadValues triggers a POST
    File.WriteAllBytes(@"c:\temp\download.png", result); // save the response to the temp folder
}


Я использую png-файл, но не имеет значения, что это за файл, он будет работать для файлов Excel, EXE-файлов, любых двоичных данных.