Download einer Datei aus dem WEB

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Download einer Datei aus dem WEB

Beitrag von NicknameFJ »

Hallo zusammen,

ich habe folgendes vor.

Von dieser Seite:
https://www.cortalconsors.de/Ueber-Uns/ ... visenkurse

möchte ich die Datei Kurstabelle.xls, die auf dieser Seite verlinkt ist, mit PB herunterladen und lokal auf dem Rechner speichern.

Leider habe ich von Netzwerken und Internetzugriffen überhaupt keinen Plan. Ich habe die Suchfunktion benutzt und auch Google bemüht jedoch konnte ich mangels meiner Fachkentnisse mit den gefunden Info´s nicht anfangen.

In einem anderen Thread hat Stargate geschrieben:
Wenn du willst schreib ich dir n exe was das für dich erledigt :lol:
Sodass du noch noch ein Klick machen musst und er:
- einloggen bei purebasic.com
- runterladen
- deinstallieren
- installieren
für dich übernimmt.
Zu Stargate **schiel** und schön bitte **sag**

Könntest Du, oder auch jeder ander hier im Forum, mir bitte mit einem Code-snip auf die Sprünge helfen, wie ich den Download (mit PureBasic) bewerkstelligen kann.

Vielen, vielen Dank.

Grüße NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Download einer Datei aus dem WEB

Beitrag von STARGÅTE »

PB bietet eine direkte möglichkeit:

Code: Alles auswählen

Ergebnis = ReceiveHTTPFile(URL$, Dateiname$)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Download einer Datei aus dem WEB

Beitrag von Kiffi »

normalerweise gibt es für HTTP-Downloads ReceiveHTTPFile().

aber das wird IMO bei HTTPS nicht funktionieren. Destawegen
würde ich Dir dieses Include an's Herz legen:

http://www.purebasic.fr/german/viewtopi ... 17#p231017

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Download einer Datei aus dem WEB

Beitrag von NicknameFJ »

Danke Euch beiden

Die Prozeduren und die DLL muß ich mir dann mal in Ruhe zu Gemüde führen.

Grüße

NickNameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Download einer Datei aus dem WEB

Beitrag von PureLust »

Da es auf der Webseite von CortalConsors keinen direkten Downloadlink zu dieser Datei gibt, sondern der Download scheinbar über ein Servlet eingeleitet wird hilft Dir da ein "normales" Starten eines HTTP-Downloads auch wenig.

Ich hab mich mal hingesetzt und eine kleine Lösung "niedergeschmiert" die Dir die Datei per WebGadget sowie automatischer Requesterbeantwortung herunter lädt (konnte das gerade selber gut gebrauchen ;) ).

Ist natürlich eine extrem heikle und instabile Angelegenheit wenn auf dem ausführenden Rechner auch noch Usereingaben stattfinden.
Auch muss diese Variante auf die genauen Fenster-Titel Deines Browsers bzw. OS angepasst sein (siehe Variablen: Erstes/Zweites/DrittesFenster.s).

Für einen Hintergrundprozess auf einem Server (auf dem also ansonsten keine weiteren Usereingaben statt finden) ist so eine "automatische Bedienung" von Requestern allerding recht brauchbar (wir automatisieren auf diese Art seit Jahren einige Vorgänge - allerdings nicht genau in dieser Form und auch nicht über PureBasic).
Um ganz sicher zu gehen könntest Du evtl. noch die ProzessID mit einbeziehen und noch einige weitere mögliche Exceptions abfangen. Für einen Server, bei dem sich allerdings nicht viel ändert und für den es einmalig angepasst ist, ist es eigentlich schon fast ok.

Hier mal der Source dazu - vielleicht kannst Du ihn ja gebrauchen.

Code: Alles auswählen

Procedure SendKeys(handle,window$,keys$) 
If window$<>"" : handle=FindWindow_(0,window$) : EndIf ; Use window$ instead of handle. 
   If IsWindow_(handle)=0 ; Does the target window actually exist? 
      ProcedureReturn 0 ; Nope, so report 0 for failure to type. 
   Else 
   ; This block gives the target window the focus before typing. 
   thread1=GetWindowThreadProcessId_(GetForegroundWindow_(),0) 
   thread2=GetWindowThreadProcessId_(handle,0) 
   If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf 
      SetForegroundWindow_(handle) ; Target window now has the focus for typing. 
      Delay(125) ; 1/8 second pause before typing, to prevent fast CPU problems. 
      ; Now the actual typing starts. 
      For r=1 To Len(keys$) 
          vk$=Mid(keys$,r,1) 
          If vk$="{" ; Special key found. 
             s=FindString(keys$,"}",r+1)-(r+1) ; Get length of special key. 
             s$=Mid(keys$,r+1,s) ; Get special key name. 
             Select s$ ; Get virtual key code of special key. 
                Case "ALTDOWN" : keybd_event_(#VK_MENU,0,0,0) ; Hold ALT down. 
                Case "ALTUP" : keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT. 
                Case "BACKSPACE" : vk=#VK_BACK 
                Case "CONTROLDOWN" : keybd_event_(#VK_CONTROL,0,0,0) ; Hold CONTROL down. 
                Case "CONTROLUP" : keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL. 
                Case "DELETE" : vk=#VK_DELETE 
                Case "DOWN" : vk=#VK_DOWN 
                Case "END" : vk=#VK_END 
                Case "ENTER" : vk=#VK_RETURN 
                Case "F1" : vk=#VK_F1 
                Case "F2" : vk=#VK_F2 
                Case "F3" : vk=#VK_F3 
                Case "F4" : vk=#VK_F4 
                Case "F5" : vk=#VK_F5 
                Case "F6" : vk=#VK_F6 
                Case "F7" : vk=#VK_F7 
                Case "F8" : vk=#VK_F8 
                Case "F9" : vk=#VK_F9 
                Case "F10" : vk=#VK_F10 
                Case "F11" : vk=#VK_F11 
                Case "F12" : vk=#VK_F12 
                Case "ESCAPE" : vk=#VK_ESCAPE 
                Case "HOME" : vk=#VK_HOME 
                Case "INSERT" : vk=#VK_INSERT 
                Case "LEFT" : vk=#VK_LEFT 
                Case "PAGEDOWN" : vk=#VK_NEXT 
                Case "PAGEUP" : vk=#VK_PRIOR 
                Case "PRINTSCREEN" : vk=#VK_SNAPSHOT 
                Case "RETURN" : vk=#VK_RETURN 
                Case "RIGHT" : vk=#VK_RIGHT 
                Case "SHIFTDOWN" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down. 
                Case "SHIFTUP" : shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT. 
                Case "TAB" : vk=#VK_TAB 
                Case "UP" : vk=#VK_UP 
             EndSelect 
             If Left(s$,3)<>"ALT" And Left(s$,7)<>"CONTROL" And Left(s$,5)<>"SHIFT" 
                keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the special key. 
             EndIf 
             r=r+s+1 ; Continue getting the keystrokes that follow the special key. 
          Else 
             vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found. 
             If vk>304 And shifted=0 : keybd_event_(#VK_SHIFT,0,0,0) : EndIf ; Due to shifted character. 
             keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key. 
             If vk>304 And shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) : EndIf ; Due to shifted character. 
          EndIf 
      Next 
      If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf ; Finished typing to target window! 
      keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key if user forgot. 
      keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key if user forgot. 
      keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key if user forgot. 
      ProcedureReturn 1 ; Report successful typing! :) 
   EndIf 
EndProcedure 

Global TargetWindowName.s
Global TargetWindowKeys.s

Procedure SendKeysToModalWindow(*Dummy)
	While Not FindWindow_(0,TargetWindowName) : Delay(10) : Wend
	Delay(500)
	SendKeys(0,TargetWindowName,TargetWindowKeys)
EndProcedure

; Es wird ein unsichtbares Fenster mit einem WebGadget geöffnet.
; über die URL des WebGadgets wird der Download der gewünschten Datei gestartet.
; anschließend werden 2 Fenster automatisch mit (Alt)+S "beantwortet", womit die Datei in das
; vorgegebene Downloadverzeichnis herunter geladen wird.

ErstesFenster.s = "Dateidownload"
ZweitesFenster.s = "Speichern unter"
DrittesFenster.s = "Download beendet"

OpenWindow(0,0,0,600,400,"CortalConsors", #PB_Window_Invisible)
WebGadget(0,0,0,600,400,"https://www.cortalconsors.de/euroWebDe/servlets/embeddedSourcesServlet?contentType=xls&contentExtId=denps38171034")

; da das erste Fenster (der Dateidownloadrequester) ein modales Fenster ist und den Hauptthread anhält, muss dieses in einem seperaten Thread abgefragt werden
TargetWindowName = ErstesFenster
TargetWindowKeys = "{ALTDOWN}s{ALTUP}"

ThreadID = CreateThread(@SendKeysToModalWindow(),0)
While IsThread(ThreadID) : WaitWindowEvent(10) : Wend

; warten auf zweites Fenster zur Eingabe des Dateinamens unter dem gespeichert werden soll
While Not FindWindow_(0,ZweitesFenster) : WaitWindowEvent(10) : Wend
Delay(200)
GetWindowRect_(handle, FirstRequester.RECT)
SendKeys(0,ZweitesFenster,"{ALTDOWN}s{ALTUP}")

TimeOut = ElapsedMilliseconds() + 5000
Repeat
	
	; Falls die Datei bereits existiert, wird ein weiteres Fenster mit dem Titel "Speichern unter" geöffnet, jedoch mit anderen Koordinaten.
	; Also wird nach einem Fenster gesucht, welches genauso heisst wie das Zweite, jedoch andere Koordinaten aufweisst.
	handle=FindWindow_(0,ZweitesFenster)
	If handle
		GetWindowRect_(handle, SecondRequester.RECT)
		If FirstRequester\right <> SecondRequester\right
			Delay(200)
			SendKeys(handle,"","{ALTDOWN}j{ALTUP}")
		EndIf
	EndIf
	WaitWindowEvent(10)
	
	; Sobals das dritte Fenster ("Download beendet") erscheint wird das Programm beendet.
	; Falls der User ein Häckchen bei "Dialog nach Beenden des Downloads schließen" gemacht hat, kann es vorkommen
	; dass das dritte Fenster nie gefunden wird.
	; Für diesen Fall ist ein TimeOut von 5 Sekunden eingebaut. Dieser sollte u.U. je nach Geschwindigkeit der Internet-Verbindung angepasset werden.
	
Until FindWindow_(0,DrittesFenster) Or ElapsedMilliseconds() > TimeOut
Grüße, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: Download einer Datei aus dem WEB

Beitrag von rolaf »

Kiffi hat geschrieben:normalerweise gibt es für HTTP-Downloads ReceiveHTTPFile().

aber das wird IMO bei HTTPS nicht funktionieren.
Also bei mir wuppt ReceiveHTTPFile() mit folgender https Adresse seit PB 4.41 problemlos:
https://www.lotto-berlin.de/pfe/static/ ... _lotto.zip
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Download einer Datei aus dem WEB

Beitrag von NicknameFJ »

Danke PureLust,

habe Deinen Code probiert, funktioniert gut.

Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Antworten