warum keine NetWorkConnection ?

Anfängerfragen zum Programmieren mit PureBasic.
time2die81
Beiträge: 11
Registriert: 08.02.2009 20:56

Beitrag von time2die81 »

Hallo,

willst du als freeuser von rapid laden ?dann ist es mit einem request nicht getan.
hier mal mein rapidsharforlinux source (nur ein teil - nicht lauffähig)
da kannst du sehn was so alles gesendet werden muss, ich denke der ist ut selbsterklärend.

Code: Alles auswählen

;#RSFL RapidshareForLinux V 0.08

;# Init
IncludeFile "/home/bert/Source/Http/HttpLinux.pb"
IncludeFile "/home/bert/Source/Tools.pb"
Global Sparameter.s,sparameterstart.s,sRapidsharelink.s,sRapidshareresponse.s
Global  qConid.q,qWaitime.q
Global sRSSESSION.s,Sfilename.s,surlpath.s

InitNetwork()
;# Main
OpenConsole()
sparameterstart = ProgramParameter()
sparameter        = LCase(Left(sparameterstart,2))

PrintN("RapidshareForLinux V 0.08 Copyrigth by Time2idie81 2009")
PrintN("")

    Select Sparameter
        Case "-l"
        sRapidsharelink = RemoveString(sparameterstart,"-l",#PB_String_NoCase)
        
    EndSelect

PrintN("Loading :"+sRapidsharelink)
PrintN("Connecting Rapidshare...")
    qconid = OpenNetworkConnection("rapidshare.com",80)
    If qconid
      PrintN("Connected to Rapidshare.")
    Else
        PrintN("Can't connect!")
        End
    EndIf
PrintN("Send Request.")

    ;# Request 1. erstellen
    HTTPCreateHeader(*Headerbuffer,sRapidsharelink,#HTTP_METHOD_GET)
    HTTPSendHeader(*Headerbuffer,qconid)
    HTTPGetHeader(qconid)
    Debug HTTP.ResponseHeader(0)\ResponseCode 
  If HTTP.ResponseHeader(0)\ResponseCode  = "200 OK"
  Else
  PrintN("Response Error")
  Input()
  End
  EndIf
  sRapidshareresponse = ReadnetworkString(qconid,0)

sRapidsharelink = Midstring(sRapidshareresponse,"<form id="+Chr(34)+"ff"+Chr(34)+" action="+Chr(34),Chr(34)+" method="+Chr(34)+"post"+Chr(34)+">")
PrintN("Request Free Download.")
PrintN(sRapidsharelink)
sfilename = GetFilePart(GetURLPart(sRapidsharelink,#PB_URL_Path))
surlpath = GetPathPart(sRapidsharelink)
qconid = OpenNetworkConnection(GetURLPart(sRapidsharelink,#PB_URL_Site),80)
HTTPCreateHeader(*Headerbuffer,sRapidsharelink,#HTTP_METHOD_POST,"dl.start=Free","","http://rapidshare.com/files/115327692/SpeedportReconnect.tar.gz")
HTTPSendHeader(*headerbuffer,qconid)
HTTPGetHeader(qconid)
  If HTTP.ResponseHeader(0)\ResponseCode  = "200 OK"
  Else
  PrintN("Response Error")
  Input()
  End
  EndIf
  sRapidshareresponse = ReadnetworkString(qconid,0)

sRSSESSION = midstring(sRapidshareresponse,GetPathPart(GetURLPart(sRapidsharelink,#PB_URL_Path)),"/"+GetFilePart(sRapidsharelink))





  qWaitime = Val(midstring(sRapidshareresponse,"var c=",";"))
  Print("Wating for " + Str(qWaitime) + " seconds.")
  timer = CreateThread(@mytimer(),qWaitime)
While IsThread(timer)
Print("."):Delay(100)
Wend
PrintN("")
PrintN("Request Download of " + GetFilePart(GetURLPart(sRapidsharelink,#PB_URL_Path)))
sRapidsharelink = "http://rs644dt.rapidshare.com/"+GetURLPart(sRapidsharelink,#PB_URL_Path)
qconid = OpenNetworkConnection("rs644dt.rapidshare.com",80)
sRapidsharelink = "http://rs644dt.rapidshare.com/"+RemoveString(surlpath +sRSSESSION+"/"+sfilename,"http://rapidshare.com")
PrintN(sRapidsharelink)


 ; ab hier baustelle - fehlt parsen des passenden endlinks HTTPCreateHeader(*Headerbuffer,sRapidsharelink,#HTTP_METHOD_POST,"mirror=on&x=35&y=47","","http://rs644.rapidshare.com/files/213909812/xxxxxxxxxxxxxxxxx") 
HTTPSendHeader(*headerbuffer,qconid)
HTTPGetHeader(qconid)
HTTPFileDownload(qconid,"/home/bert/Source/",Sfilename,1000)
Input()
und mit premium account must du dich erst einloggen.weis ich aber nicht wie weil ich keinen account besitz (wenn mir jemand einen überläßt gibts zum wochende ne lauffähige source :wink:

mfg[/quote]

edit:ups grad gesehn da habe ich noch ned ganz fertig. der server rs644 muss natürlich passend zum file ausm quelltext geparst werden.
Zuletzt geändert von time2die81 am 08.09.2009 18:09, insgesamt 1-mal geändert.
Justin
Beiträge: 167
Registriert: 09.09.2008 16:46

Beitrag von Justin »

wie komme ich dann jetzt an die ganzen Daten rann? Per ReceiveHTTPFile() funktionierts übrigens...

@time2die81
hatte dein Beitrag nicht gesehen... da habe ich grad meinen geschrieben :)
Ja, soweit ist das klar mit dem parsen, dass Problem lieg liegt darin, dass ich erst gar nicht zum parsen komme, weil die Daten nicht vollständig sind dich ich bekomme nachdem ich die Site (Auswahl zwischen Free und Premium) abfrage - und die brauche ich ja für den Link...

PS: 'Schade das die in ihrer API nicht für den Down-/Upload vorgesehen haben - wenn man mal von getnextuploadserver absieht...
PB 5.11 x64 / Kubuntu 12.10 x64 | Windows 7 x64
time2die81
Beiträge: 11
Registriert: 08.02.2009 20:56

Beitrag von time2die81 »

also im quelltext der ersten seite steht ja der link für den download :
<form id="ff" action="http://rs118.rapidshare.com/files/27511 ... sample.avi" method="post">
den kopier ich mittels dieser kleinen procedure :

Code: Alles auswählen

Procedure.s MidString(string.s,FirstStringToFind.s,LastStringToFind.s)

Protected MainString.s,StringLength.q,FirstPos.q,LastPos.q
Shared Midresult.s
MainString = string
StringLength = Len(FirstStringToFind)
FirstPos = FindString(Mainstring,FirstStringToFind,0)
LastPos = FindString(Mainstring,LastStringToFind,firstpos)
midresult = Mid(MainString,firstpos+StringLength,LastPos-FirstPos-StringLength)
ProcedureReturn midresult
EndProcedure
(hatt ich mal mit PB 4.00 geschrieben weiß nicht ob es da inzwischen was in PB4.40 gibt.

jo und dann halt nen POST request senden it dem link und den parameter "dl.start=Free"

Code: Alles auswählen

HTTPCreateHeader(*Headerbuffer,sRapidsharelink,#HTTP_METHOD_POST,"dl.start=Free","","http://rapidshare.com/files/115327692/SpeedportReconnect.tar.gz")
HTTPSendHeader(*headerbuffer,qconid)
HTTPGetHeader(qconid)
ich stell dir mal die Procedure HTTPCreateHeader() mit ,ist aber standalone nicht lauffähig nur damit du weißt wie der Header aufgebaut wird/werden kann.ist denke ich sehr simpel

Code: Alles auswählen

Procedure HTTPCreateHeader(*Buffer,surl.s,qmethod.Q,sPostvariable.s = "",scookie.s = "",sreferee.s = "")

Protected sPath.s , sHost.s , sParameters.s,SHeader.s
Protected qheaderbufferlength.Q

 sHost = PartUrl(surl,#HTTP_HOST)
 sPath = PartUrl(surl,#HTTP_FULLPATH)
 sParameters = GetURLPart(surl,#PB_URL_Parameters)
 HTTP.ResponseHeader(0)\Host = sHost 

 
 Select qmethod
 
    Case #HTTP_METHOD_GET
      SHeader = "GET "+sPath+" HTTP/1.0" + #CRLF$
    
    Case #HTTP_METHOD_POST
      SHeader = "POST "+sPath+" HTTP/1.0" + #CRLF$
    Case #HTTP_METHOD_PUT
      Debug "NOT COMPLETE"
    Case #HTTP_METHOD_TRACE
      Debug "NOT COMPLETE"
    Case #HTTP_METHOD_OPTION
      Debug "NOT COMPLETE"
 EndSelect
 
 SHeader + "Host: "+sHost +#CRLF$
 SHeader + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10" +#CRLF$
 SHeader + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" +#CRLF$
 SHeader + "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" +#CRLF$
 SHeader + "Accept-Encoding: deflate" +#CRLF$
 SHeader + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" +#CRLF$
 If Len (sreferee.s)
 SHeader + "Referer: " +sreferee +#CRLF$
 EndIf
 SHeader + "Keep-Alive: 300" + #CRLF$
 SHeader + "Connection: keep-alive" +#CRLF$
 If Len(scookie)
 SHeader + "Cookie: " +scookie + #CRLF$
 EndIf
Select qmethod
 
    Case #HTTP_METHOD_GET
      SHeader + #CRLF$
    
    Case #HTTP_METHOD_POST
      SHeader + "Content-Type: application/x-www-form-urlencoded" + #CRLF$
      SHeader + "Content-Length: " + Str(Len(sPostvariable)) +#CRLF$
      SHeader + #CRLF$
      SHeader + sPostvariable + #CRLF$ +#CRLF$
 
 EndSelect
qHeadersize =  PokeS(*Buffer,SHeader)
Debug qHeadersize
ProcedureReturn 1
EndProcedure
so den kommt die Seite mit der Wartezeit da wird es kniffliler.. da müßt ich ehrlich gesagt meinen eigenen source mal durch stöbern und kucken was ich da so gemacht habe ... (doofe verschachtelungen:-)

aber im groben must du glaub 3 variablen suchen : Wartezeit ,RSSsessinon(diese wechseltende nummer im endlink),server für den download

und großer tip benutz aufjedenfall http 1.0 is einfacher ich habs mit http 1.1 damals nicht hinbekommen.

mfg


p.s. dinge wie checken ob überhaupt ein download möglich ist etc. sollte dan klar sein ,rapidshare ibt auch manchmal keinen slot an free user
Justin
Beiträge: 167
Registriert: 09.09.2008 16:46

Beitrag von Justin »

ne, ich komme an den Downloadlink nicht ran. Mit folgeder Abfrage

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Fehler","Das Netzwerk konnte nicht initialisiert werden")
  End
EndIf

NetID = OpenNetworkConnection("rapidshare.com", 80) 
If NetID = 0  
  MessageRequester("Fehler","Verbindung konnte nicht hergestellt werden")
  End
EndIf

Header.s = "GET /files/275488183/MP_VP.rar HTTP/1.1" + #CRLF$
Header   + "Host: rapidshare.com" + #CRLF$
Header   + #CRLF$

SendNetworkString(NetID, Header)
Repeat: Until NetworkClientEvent(NetID) = #PB_NetworkEvent_Data

*buffer = AllocateMemory(83290)
ReceiveNetworkData(NetId, *buffer, MemorySize(*buffer))

If CreateFile(0, "c:\a.txt")
  WriteData(0, *buffer, MemorySize(*buffer))
  CloseFile(0)
Else
  MessageRequester("Fehler","Datei konnte nicht geschrieben werden")
EndIf
bekomme ich folgendes zurück:

HTTP/1.1 200 OK
P3P: CP="ALL DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa TELa OUR STP UNI NAV STA PRE"
Date: Tue, 08 Sep 2009 19:01:52 GMT
Connection: close
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Type: text/html; charset=UTF-8
Content-Length: 13290

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
if (top != self) top.location = self.location;
if (document.URL.substr(7,7) == "intern.")
document.write('<base href="http://rapidshare.com">');
</script>
<title>RapidShare: 1-CLICK Web hosting - Easy Filehosting</title>
<link rel="icon" href="/img2/favicon.ico" type="image/ico" />
<link rel="SHORTCUT ICON" href="/img2/favicon.ico" />
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<meta name="author" content="Saso Nikolov" />
<meta name="keywords" content="File Hosting, File Distributor, File Sharing, upload several files" />
<meta name="description" content="1-Click web hosting, upload several files, Easy File Distribution, Easy, Fast and Secure" />
<link rel="stylesheet" type="text/css" href="/img2/styles.css" />
</head>

<body>
<center>
<div class="hauptmenue">
<table><tr><td>
<ul class="dropdown">
<li><a href="http://rapidshare.com/index.html">Home</a></li>
<li><a href="h

Und da steht der Link noch nicht drinn...
PB 5.11 x64 / Kubuntu 12.10 x64 | Windows 7 x64
time2die81
Beiträge: 11
Registriert: 08.02.2009 20:56

Beitrag von time2die81 »

habe nen guten tag .
auslesen von html seiten ist ziemlich oft im forum drin..das hier .
Repeat: Until NetworkClientEvent(NetID) = #PB_NetworkEvent_Data

*buffer = AllocateMemory(83290)
ReceiveNetworkData(NetId, *buffer, MemorySize(*buffer))

If CreateFile(0, "c:\a.txt")
WriteData(0, *buffer, MemorySize(*buffer))
CloseFile(0)
ist falsch .

es gibt irgendwo im codearchiv ne readnetworkstrin funktion. ich habe diese um einen parameter erweitert. damit funzt das ganz gut :

Code: Alles auswählen

 Procedure.s ReadnetworkString(Connectionid.Q,Length.Q)
  
  ;Lie?t string vom Server, entwerder alles was gesendet wird oder eine bestimmte Zeichenanzahl (length)
  Protected DataLength.Q,i.Q,o.Q
  Shared string.s
  string = ""
  DataLength = 0 
  i = 0
  o = 0
  If Length = 0
    Repeat ;Wait for it to start sending data
      Delay(2);No need to use 100% CPU while waiting
      i + 1 
    Until NetworkClientEvent(Connectionid) = #PB_NetworkEvent_Data  Or i = 1300
    
    Repeat ;Put all recieved data in a sring
      DataLength = ReceiveNetworkData(Connectionid,*readnetworkbuffer,100)
      Delay(2)
      string + PeekS(*readnetworkbuffer,DataLength)
    
    Until DataLength = 0 
  ElseIf Length > 0
    Repeat ;Wait for it to start sending data
      Delay(2);No need to use 100% CPU while waiting
      i + 1 
    Until NetworkClientEvent(Connectionid) <> #PB_NetworkEvent_Data 
    ;Or i = 300
    
    Repeat ;Put all recieved data in a sring
      DataLength = ReceiveNetworkData(Connectionid,*readnetworkbuffer,1)
      Delay(2)
      string + PeekS(*readnetworkbuffer,DataLength)
      o.Q + 1
    Until o = Length
  EndIf
 ; FreeMemory(*readnetworkbuffer)    
  ProcedureReturn string
EndProcedure  

dazu deinen source bischen abgeändert :

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Fehler","Das Netzwerk konnte nicht initialisiert werden")
  End
EndIf

NetID = OpenNetworkConnection("rapidshare.com", 80)
If NetID = 0 
  MessageRequester("Fehler","Verbindung konnte nicht hergestellt werden")
  End
EndIf

Header.s = "GET /files/275488183/MP_VP.rar HTTP/1.0" + #CRLF$
Header   + "Host: www.rapidshare.com" + #CRLF$
Header   + #CRLF$

SendNetworkString(NetID, Header)
Repeat: Until NetworkClientEvent(NetID) 


If CreateFile(0, "c:\a.txt")
  WriteString(0,ReadnetworkString(NetID,0))
  CloseFile(0)
Else
  MessageRequester("Fehler","Datei konnte nicht geschrieben werden")
EndIf 
so sollte es gehn :allright:
time2die81
Beiträge: 11
Registriert: 08.02.2009 20:56

Beitrag von time2die81 »

habe nen guten tag .
auslesen von html seiten ist ziemlich oft im forum drin..das hier .
Repeat: Until NetworkClientEvent(NetID) = #PB_NetworkEvent_Data

*buffer = AllocateMemory(83290)
ReceiveNetworkData(NetId, *buffer, MemorySize(*buffer))

If CreateFile(0, "c:\a.txt")
WriteData(0, *buffer, MemorySize(*buffer))
CloseFile(0)
ist falsch .

es gibt irgendwo im codearchiv ne readnetworkstrin funktion. ich habe diese um einen parameter erweitert. damit funzt das ganz gut :

Code: Alles auswählen

 Procedure.s ReadnetworkString(Connectionid.Q,Length.Q)
  
  ;Lie?t string vom Server, entwerder alles was gesendet wird oder eine bestimmte Zeichenanzahl (length)
  Protected DataLength.Q,i.Q,o.Q,*readnetworkbuffer = allocateMemory(100)
  Shared string.s
  string = ""
  DataLength = 0 
  i = 0
  o = 0
  If Length = 0
    Repeat ;Wait for it to start sending data
      Delay(2);No need to use 100% CPU while waiting
      i + 1 
    Until NetworkClientEvent(Connectionid) = #PB_NetworkEvent_Data  Or i = 1300
    
    Repeat ;Put all recieved data in a sring
      DataLength = ReceiveNetworkData(Connectionid,*readnetworkbuffer,100)
      Delay(2)
      string + PeekS(*readnetworkbuffer,DataLength)
    
    Until DataLength = 0 
  ElseIf Length > 0
    Repeat ;Wait for it to start sending data
      Delay(2);No need to use 100% CPU while waiting
      i + 1 
    Until NetworkClientEvent(Connectionid) <> #PB_NetworkEvent_Data 
    ;Or i = 300
    
    Repeat ;Put all recieved data in a sring
      DataLength = ReceiveNetworkData(Connectionid,*readnetworkbuffer,1)
      Delay(2)
      string + PeekS(*readnetworkbuffer,DataLength)
      o.Q + 1
    Until o = Length
  EndIf
 ; FreeMemory(*readnetworkbuffer)    
  ProcedureReturn string
EndProcedure  

dazu deinen source bischen abgeändert :

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Fehler","Das Netzwerk konnte nicht initialisiert werden")
  End
EndIf

NetID = OpenNetworkConnection("rapidshare.com", 80)
If NetID = 0 
  MessageRequester("Fehler","Verbindung konnte nicht hergestellt werden")
  End
EndIf

Header.s = "GET /files/275488183/MP_VP.rar HTTP/1.0" + #CRLF$
Header   + "Host: www.rapidshare.com" + #CRLF$
Header   + #CRLF$

SendNetworkString(NetID, Header)
Repeat: Until NetworkClientEvent(NetID) 


If CreateFile(0, "c:\a.txt")
  WriteString(0,ReadnetworkString(NetID,0))
  CloseFile(0)
Else
  MessageRequester("Fehler","Datei konnte nicht geschrieben werden")
EndIf 
so sollte es gehn :allright:
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Mal davon abgesehen, dass ich plötzlich doppelt sehe... was hast du eigentlich immer mit diesen Quads?
Wieviele Bytes willst du denn um Himmels Willen empfangen?
time2die81
Beiträge: 11
Registriert: 08.02.2009 20:56

Beitrag von time2die81 »

Jetzt wo du es sagst... viele :-) ne ich weiß is irgendwie ne ganz bekloppte macke :?

aber wenn du sagst du siehst doppelt, naja einmal fals length = 0 für alles lesen was kommt und einmal mit Length = x für x zeichen lesen egal wieviel kommt.

geht bestimmt eleganter das ist noch einer meiner ersten codes /:-> und dazu viel copy past..... :oops:
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Eigentlich meinte ich, ich sehe deinen Beitrag da oben doppelt... :mrgreen:
Justin
Beiträge: 167
Registriert: 09.09.2008 16:46

Beitrag von Justin »

@time2die81

jou, verstehe, vielen Dank.
Im Abschnitt für das bytegenaue Empfangen hast aber nen Wurm drinn:

Code: Alles auswählen

Until NetworkClientEvent(Connectionid) <> #PB_NetworkEvent_Data 
Würde bedeuten, dass wenn Daten kommen die auf Daten wartende Repeat nicht verlassen würde...

Ach ja, und bei mir im Source brauch ich ja dan auch nicht auf Datenankunft repeaten...
PB 5.11 x64 / Kubuntu 12.10 x64 | Windows 7 x64
Antworten