[VB.NET] PDF downloaden van website

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Beste allemaal,

Ik ben in de situatie dat ik graag (wekelijks) een PDF wil downloaden van een bepaalde website (deze PDF is dus gewoon "gratis" en openbaar te downloaden zonder inloggegevens of certificaten nodig te hebben). Normaliter lukt me dat heel goed via PHP (i.c.m een CronJob) of een executable gemaakt in VB.NET (aangeroepen voor Taakbeheer).

Deze keer lukt het me echter niet. Ik kom maar niet aan de PDF. Ik zou denken dat 't via een WebRequest (GET/POST) toch wel moet lukken, maar wat ik ook probeer:

- allerlei soorten/combinaties van headers
- cookies (container)
- meerdere WRequests achter elkaar
- rechtstreeks via "File.Download" (iets in die trend)
- etc... geen idee wat ik nog allemaal heb liggen klooien, maar ik ben al enkele dagen bezig

Als ik via "Live Headers" (in Firefox) kijk, dan zie ik diverse GET en POST commando's achter elkaar verschijnen, en ik denk dat ik die allemaal moet "nabootsen" in mijn programma. Ik weet alleen niet hoe ik dat moet doen. Of zijn er misschien tooltjes op de markt die je kunt "leren" wat er moet gebeuren, en dit dan "onderwater" uitvoeren? In feite zou een muiscursor-beweeg-en-klik simulator ook tot hetzelfde resultaat lijden, maarja je snapt dat dát niet echt handig zou zijn :P

Ik hoor graag hoe jullie dit (zouden) oplossen?

Alvast thanks voor 't meedenken _/-\o_

Beste antwoord (via Atmoz op 25-02-2016 12:39)


  • Dracoo
  • Registratie: April 2006
  • Laatst online: 09-10 16:43
Ik ben een beetje met c# aan het klooien geweest en heb inmiddels een proof-of-concept versie. Ben nu aan het kijken of ik deze versie nog verder op kan schonen en er wat configuratie aan toe kan voegen.

Ze werken in ieder geval met een form-post, waarbij enkele formulier velden overeen moeten komen met een cookie die ze eerder gezet hebben. Gelukkig is dit eenvoudig te spoofen ;) De code ziet er momenteel als volgt uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var request = WebRequest.CreateHttp("...");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Uri("..."), new Cookie("smpbss", "-921t5odi2zq1"));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
var nvc = System.Web.HttpUtility.ParseQueryString(String.Empty);
nvc.Add("generateReport", "");
nvc.Add("smpbss", "-921t5odi2zq1");
nvc.Add("exchangeCode", "NDEX");
nvc.Add("exchangeCodeAndContract", "NDEX|DPB");
nvc.Add("selectedDate", "02/24/2016");
nvc.Add("submit", "Download");
using (var stream = request.GetRequestStream())
{
    using (var sw = new StreamWriter(stream))
    {
        sw.Write(nvc.ToString());
        sw.Flush();
    }
}
var response = (HttpWebResponse)request.GetResponse();
using (var rs = response.GetResponseStream())
{
    var tempfile = Path.GetTempFileName();
    using (var file = File.Create(tempfile))
    {
        rs.CopyTo(file);
        file.Flush();
    }
    Console.WriteLine("saved to: {0}", tempfile);
}

Alle reacties


Acties:
  • 0 Henk 'm!

  • Joran
  • Registratie: December 2005
  • Laatst online: 10-10 12:02

Joran

<3 natalee

Je zou via wireshark even kunnen kijken wat er fout gaat.

Ik vermoed dat je een redirect tegenkomt die VB niet wil volgen, maar dat gok ik maar.

Send me your gameboys


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 12:20

Damic

Tijd voor Jasmijn thee

Joran schreef op woensdag 24 februari 2016 @ 14:58:
Je zou via wireshark even kunnen kijken wat er fout gaat.

Ik vermoed dat je een redirect tegenkomt die VB niet wil volgen, maar dat gok ik maar.
of via Fildler

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Joran schreef op woensdag 24 februari 2016 @ 14:58:
Je zou via wireshark even kunnen kijken wat er fout gaat.

Ik vermoed dat je een redirect tegenkomt die VB niet wil volgen, maar dat gok ik maar.
Ok, maar ik ben dus nog niet zo ver dat ik al kan kijken wat er fout gaat. Ik heb op 't moment (weer) vrij weinig 8)7 Alle "probeersels" heb ik tijdens het maken van het volgende probeersel weer verwijderd...

[edit]
Ja, maar dat soort programma's zijn toch (net zoals ik al gebruik: Live HTTP Headers) om te kijken WAT er gebeurt ALS er iets gebeurt? :) Nu moet ik eerst zelf iets maken wat iets doet alvorens ik kan "debuggen" via dat soort tools. Of snap ik 't niet goed?

[ Voor 32% gewijzigd door Atmoz op 24-02-2016 15:13 ]


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14:10
Kijk eerst eens met Fiddler wat er gebeurt als je dat bestand in een browser download. Wellicht dat er inderdaad iets van een redirect gedaan wordt. Verder kunnen er nog referrer checks in zitten, cookies, whatever.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
sig69 schreef op woensdag 24 februari 2016 @ 15:34:
Kijk eerst eens met Fiddler wat er gebeurt als je dat bestand in een browser download. Wellicht dat er inderdaad iets van een redirect gedaan wordt. Verder kunnen er nog referrer checks in zitten, cookies, whatever.
Ja zoiets ben ik inderdaad bang voor. Er gebeurt in ieder geval vanalles :P

Is er een reden waarom men dit op deze manier doet? Is dat inderdaad om mensen als mij >:) tegen te gaan? Dus dat je VERPLICHT wordt die files te downloaden via hun website? Of zijn dat de "neveneffecten" van iets totaal anders?

Ik krijg van een web-programmeur zojuist deze reactie:
Ik heb snel gecheckt en zover ik kan inschatten kun je, zoals het nu gemaakt is, dit niet 'scrapen'. Ze gebruiken de localStorage van de browser om je selectie en dergelijk op te slaan met javascript en dit kun je niet gaan faken, hetzelfde geldt ook voor bv. cookies, die zijn gekoppeld aan het domein. De uiteindelijk url voor de pdf te downloaden is voor iedere situatie hetzelfde en die serveert dan op basis van de variabelen in je localstorage de juiste pdf.
Ziet er niet echt hoopvol uit dus :-(

Toch vind ik het vreemd: ik zou zeggen dat ALLES wat je met een browser kunt (klik, klik, muisbeweeg, klik *download*) OOK met een zelfgemaakt programmaatje "onderwater" kunt doen?!

Acties:
  • 0 Henk 'm!

Verwijderd

Welk URL / document praten we over?
Zou je die kunnen / willen delen?

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Verwijderd schreef op woensdag 24 februari 2016 @ 16:07:
Welk URL / document praten we over?
Zou je die kunnen / willen delen?
Dat is een lastige zaak inderdaad.
Dus liever niet, hoe vervelend ook, dat begrijp ik.
En dat het komen tot een oplossing daardoor nog lastiger wordt begrijp ik ook...

Ik zou hem je kunnen PM'en, maar dat zou alleen nut hebben als je ook serieus een poging wilt wagen :)
(en als je een serieuze Tweaker bent die een beetje te vertrouwen is O-))

Acties:
  • 0 Henk 'm!

  • Dracoo
  • Registratie: April 2006
  • Laatst online: 09-10 16:43
Het feit dat je het URL niet wil delen doet me vermoeden dat dit toch niet helemaal 'legaal' is, of dat je in ieder geval bang bent dat de PDF bij meer bekendheid alsnog offline gehaald / achter een slot gezet wordt.

Overigens zou het gebruik van localstorage/javascript wat mij betreft niet direct betekenen dat het geautomatiseerd downloaden van dit bestand ook daadwerkelijk onmogelijk is. Betekent alleen dat je iets verder moet zoeken naar wat men daar precies doet en welk URL (en met welke parameters) uiteindelijk wordt aangeroepen om de PDF te downloaden.

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Dracoo schreef op woensdag 24 februari 2016 @ 16:21:
Het feit dat je het URL niet wil delen doet me vermoeden dat dit toch niet helemaal 'legaal' is, of dat je in ieder
geval bang bent dat de PDF bij meer bekendheid alsnog offline gehaald / achter een slot gezet wordt.
Ik weet niet hoe ik kan controleren of ik illegaal bezig ben, maar zodra een PDF bestand gewoon online (zonder in te loggen of whatever) staat, zou ik denken dat ik die gewoon mag ophalen. Tenzij daar natuurlijk bij staat dat dát niet mag, maar dat is dus niet zo. Wel ben ik bang dat hij inderdaad weggehaald gaat worden omdat we er met z'n allen naartoe gaan... (op dit moment wordt die file denk ik maar door hooguit 50 gebruikers in heel NL geraadpleegd).
Overigens zou het gebruik van localstorage/javascript wat mij betreft niet direct betekenen dat het geautomatiseerd downloaden van dit bestand ook daadwerkelijk onmogelijk is. Betekent alleen dat je iets verder moet zoeken naar wat men daar precies doet en welk URL (en met welke parameters) uiteindelijk wordt aangeroepen om de PDF te downloaden.
Hmz ok, thanks!
Het heeft dus nog nut om verder te proberen :)

Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Kijk anders of het met curl of wget wel lukt als je follow+verbose+cookies enz. aan zet. Als die dan een lijst met de variabelen en redirects laat zien tijdens het verwerken weet je dat je in principe genoeg hebt aan simpelweg de headers en redirects volgen.

Acties:
  • 0 Henk 'm!

  • Dracoo
  • Registratie: April 2006
  • Laatst online: 09-10 16:43
atmoz schreef op woensdag 24 februari 2016 @ 16:36:
Ik weet niet hoe ik kan controleren of ik illegaal bezig ben, maar zodra een PDF bestand gewoon online (zonder in te loggen of whatever) staat, zou ik denken dat ik die gewoon mag ophalen.
In dat geval wil ik het wel eens proberen. PM me die link maar, heb wel zin om te puzzelen :)

  • Sandertjuhh
  • Registratie: November 2006
  • Laatst online: 15-09 13:01
Wellicht niet helemaal in de context van je vraag, maar is een oplossing in C# ook een optie? Mijn VB.NET skills zijn namelijk bedroevend slecht namelijk. Eventueel zou je natuurlijk een codeconverter kunnen gebruiken om de sources om te zetten naar VB.NET

Ik vind dit soort 'hobby'-projectjes altijd een erg leuke uitdaging, dus als je de URL ook met mij zou willen delen (via PM) wil ik ook zeker een poging wagen (in C# dan weliswaar ;-))

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
johnkeates schreef op woensdag 24 februari 2016 @ 16:42:
Kijk anders of het met curl of wget wel lukt als je follow+verbose+cookies enz. aan zet. Als die dan een lijst met de variabelen en redirects laat zien tijdens het verwerken weet je dat je in principe genoeg hebt aan simpelweg de headers en redirects volgen.
Dank!
Ik had gisteren al even gezocht naar dat WGET, maar kwam volgens mij alleen maar Linux-achtige files tegen. Misschien van het weekend eens met cURL proberen :)
Dracoo schreef op woensdag 24 februari 2016 @ 17:05:

In dat geval wil ik het wel eens proberen. PM me die link maar, heb wel zin om te puzzelen :)
_/-\o_ Done :D
Sandertjuhh schreef op donderdag 25 februari 2016 @ 08:20:
Wellicht niet helemaal in de context van je vraag, maar is een oplossing in C# ook een optie? Mijn VB.NET skills zijn namelijk bedroevend slecht namelijk. Eventueel zou je natuurlijk een codeconverter kunnen gebruiken om de sources om te zetten naar VB.NET
Daar had ik zelf inderdaad ook al aan gedacht. Misschien dat ik iemand kan vinden die 't in C# wilt maken, en dat ik die executable maar hoef aan te roepen om de file te kunnen downloaden :) Sjiek als dat zou werken hoor! 8)
Ik vind dit soort 'hobby'-projectjes altijd een erg leuke uitdaging, dus als je de URL ook met mij zou willen delen (via PM) wil ik ook zeker een poging wagen (in C# dan weliswaar ;-))
Volgens mij kan ik je geen bericht sturen, klopt dat? Heb overal gekeken, maar kan nergens die optie vinden :'(

  • mufana
  • Registratie: Mei 2009
  • Laatst online: 05-06-2023
Ik doe dergelijke dingen via PowerShell. Ongeveer zoiets:

$URL = 'http://LinknaarPDF
$LocalFileName = "pdf-filename.pdf"

#Dowload pdf
(New-Object System.Net.WebClient).DownloadFile($url, $localFileName)

Je kunt dit vrij eenvoudig omzetten naar C#/

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
mufana schreef op donderdag 25 februari 2016 @ 10:14:
Ik doe dergelijke dingen via PowerShell. Ongeveer zoiets:

$URL = 'http://LinknaarPDF
$LocalFileName = "pdf-filename.pdf"

#Dowload pdf
(New-Object System.Net.WebClient).DownloadFile($url, $localFileName)

Je kunt dit vrij eenvoudig omzetten naar C#/
Dat ziet er eerlijk gezegd uit alsof het niet gaat werken :|
Je mist op deze manier _alle_ "beveiliging" of in ieder geval benodigde "wegen" naar de PDF file toe.
Zoals je het namelijk beschrijft zou ik een URL beschikbaar hebben die rechtstreeks naar de file verwijst, en dat is zéker niet het geval.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 12:38

mulder

ik spuug op het trottoir

Je moet wel zorgen dat de PDF het enige is dat in je Response teruggegeven wordt. Als je al andere HTML oid naar de Response hebt gestuurd en dan een DownloadFile gaat doen kunnen er problemen ontstaan. Gebruik dus bv een HttpHandler (https://support.microsoft.com/en-us/kb/307997)

Edit: Volgens mij heb ik alleen een klok horen luiden

[ Voor 9% gewijzigd door mulder op 25-02-2016 11:15 ]

oogjes open, snaveltjes dicht


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Dracoo
  • Registratie: April 2006
  • Laatst online: 09-10 16:43
Ik ben een beetje met c# aan het klooien geweest en heb inmiddels een proof-of-concept versie. Ben nu aan het kijken of ik deze versie nog verder op kan schonen en er wat configuratie aan toe kan voegen.

Ze werken in ieder geval met een form-post, waarbij enkele formulier velden overeen moeten komen met een cookie die ze eerder gezet hebben. Gelukkig is dit eenvoudig te spoofen ;) De code ziet er momenteel als volgt uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var request = WebRequest.CreateHttp("...");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Uri("..."), new Cookie("smpbss", "-921t5odi2zq1"));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
var nvc = System.Web.HttpUtility.ParseQueryString(String.Empty);
nvc.Add("generateReport", "");
nvc.Add("smpbss", "-921t5odi2zq1");
nvc.Add("exchangeCode", "NDEX");
nvc.Add("exchangeCodeAndContract", "NDEX|DPB");
nvc.Add("selectedDate", "02/24/2016");
nvc.Add("submit", "Download");
using (var stream = request.GetRequestStream())
{
    using (var sw = new StreamWriter(stream))
    {
        sw.Write(nvc.ToString());
        sw.Flush();
    }
}
var response = (HttpWebResponse)request.GetResponse();
using (var rs = response.GetResponseStream())
{
    var tempfile = Path.GetTempFileName();
    using (var file = File.Create(tempfile))
    {
        rs.CopyTo(file);
        file.Flush();
    }
    Console.WriteLine("saved to: {0}", tempfile);
}

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
mulder schreef op donderdag 25 februari 2016 @ 10:43:
Je moet wel zorgen dat de PDF het enige is dat in je Response teruggegeven wordt. Als je al andere HTML oid naar de Response hebt gestuurd en dan een DownloadFile gaat doen kunnen er problemen ontstaan. Gebruik dus bv een HttpHandler (https://support.microsoft.com/en-us/kb/307997)

Edit: Volgens mij heb ik alleen een klok horen luiden
:D :+
Dracoo schreef op donderdag 25 februari 2016 @ 10:51:
Ik ben een beetje met c# aan het klooien geweest en heb inmiddels een proof-of-concept versie. Ben nu aan het kijken of ik deze versie nog verder op kan schonen en er wat configuratie aan toe kan voegen.

Ze werken in ieder geval met een form-post, waarbij enkele formulier velden overeen moeten komen met een cookie die ze eerder gezet hebben. Gelukkig is dit eenvoudig te spoofen ;) De code ziet er momenteel als volgt uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var request = WebRequest.CreateHttp("...");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Uri("..."), new Cookie("smpbss", "-921t5odi2zq1"));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
var nvc = System.Web.HttpUtility.ParseQueryString(String.Empty);
nvc.Add("generateReport", "");
nvc.Add("smpbss", "-921t5odi2zq1");
nvc.Add("exchangeCode", "NDEX");
nvc.Add("exchangeCodeAndContract", "NDEX|DPB");
nvc.Add("selectedDate", "02/24/2016");
nvc.Add("submit", "Download");
using (var stream = request.GetRequestStream())
{
    using (var sw = new StreamWriter(stream))
    {
        sw.Write(nvc.ToString());
        sw.Flush();
    }
}
var response = (HttpWebResponse)request.GetResponse();
using (var rs = response.GetResponseStream())
{
    var tempfile = Path.GetTempFileName();
    using (var file = File.Create(tempfile))
    {
        rs.CopyTo(file);
        file.Flush();
    }
    Console.WriteLine("saved to: {0}", tempfile);
}
Wow man 8) niet normaal sjiek gemaakt!!!

Ik kreeg het stukje code van hierboven niet helemaal werkend, maar het is uiteindelijk dus toch gelukt dankzij jou hulp!!! Beetje jammer/vervelend dat je niet alles hier in het topic kan zetten om anderen die hiernaar opzoek zijn mee te helpen :o Maar ik ben hier in ieder geval zéér goed mee geholpen. Thanks _/-\o_

Acties:
  • +1 Henk 'm!

  • Sandertjuhh
  • Registratie: November 2006
  • Laatst online: 15-09 13:01
atmoz schreef op donderdag 25 februari 2016 @ 09:47:
[...]


Dank!
Ik had gisteren al even gezocht naar dat WGET, maar kwam volgens mij alleen maar Linux-achtige files tegen. Misschien van het weekend eens met cURL proberen :)


[...]


_/-\o_ Done :D


[...]


Daar had ik zelf inderdaad ook al aan gedacht. Misschien dat ik iemand kan vinden die 't in C# wilt maken, en dat ik die executable maar hoef aan te roepen om de file te kunnen downloaden :) Sjiek als dat zou werken hoor! 8)


[...]


Volgens mij kan ik je geen bericht sturen, klopt dat? Heb overal gekeken, maar kan nergens die optie vinden :'(
Blijkbaar had ik berichten uit staan :X :? Staat nu wel aan volgens mij, maar uit je laatste post maak ik op dat het al gelukt is als ik het goed begrijp? Voel je vrij om nog een PM te sturen als ik m'n creativiteit er nog even op moet loslaten..
Pagina: 1