lanista Δημοσ. 9 Νοεμβρίου 2003 Δημοσ. 9 Νοεμβρίου 2003 Είνια δυνατόν κάποιος να φιτάξει ένα πρόγραμμα σε C++ ( ή σε κάποια άλλη γλώσσα ) που θα μπορεί να κάνει αυτόματα submit forms που είναι γραμμένες σε Javascript ?? Είναι εύκολο να κατεβάσει και να αλλάξει κάποιος μία σελίδα σε Javascript να αλλάξει κάποια πεδία (radio buttons κλτ ) αλλά μετά πως θα την ποσταρει στο διαδίκτυο δηλαδή πως θα στείλει ην εντολή "submit form " που ένας χρήστης την στέλνει πατώντας ένα κουμπάκι ??? Αν κάποιος μπορεί να μου απαντήσει αν γίνεται γιατί δεν το θέλω για κάποιο άλλο λόγο αλλά για την διπλωματική μου ...
vtsib Δημοσ. 10 Νοεμβρίου 2003 Δημοσ. 10 Νοεμβρίου 2003 den einai kai toso diskolo... me "ligh" C mporeis na to kaneis. prepei epishs na diavaseis to rfc tou HTTP protocol kai na vreis pws stelnet mia methodos POST. h diadikasia einai h ekshs: syndesh sto port 80 tou server mesw socket. send me POST method. response tou server. disconnect. mporw na to kanw egw alla tha parei arketoutsiko xrono giati afto to kairo psilotrexw.
drm Δημοσ. 10 Νοεμβρίου 2003 Δημοσ. 10 Νοεμβρίου 2003 Ναι γίνεται, το εχω κάνει σε Delphi... Δεν είναι ευκολο, αλλά ούτε και δύσκολο, αν θες μπορώ να postαρω τον κώδικα και μία μικρή περιγραφή του...
drm Δημοσ. 10 Νοεμβρίου 2003 Δημοσ. 10 Νοεμβρίου 2003 Η παρακάτω συνάρτηση διαβάζει μία σελίδα. Βασίζετε σε μία βιβλιοθήκη των Windows την WinInet. Επιστρέφει τα περιεχόμενα της σελίδας σαν String. ΔΕΝ διαβάζει τις εικόνες. Επίσης δέχετε μόνο URL παραμέτρους (GET και όχι post) αλλά μία μπορεί να δεχτεί και POST αν περαστούν οι Headers στην συνάρτηση InternetOpenUrl εκεί που έχει nil, καθώς και το μέγεθός τους στο επόμενο 0. Προφάνως θέλει λίγο δουλεία για να δουλέψει για τον καθένα. Επίσης μπορεί να θέλει να αλλάξει η δομή της ώστε όλα τα InternetOpenUrl να γίνονται μέσα στην InternetOpen για να μένει το session ID ίδιο, αλλά αυτό ΔΕΝ το ξέρω. Πληροφορίες για την InternetOpenUrl θα βρείτε στον MSDN. > function ReadUrl(const url : String) : String; const AgentName = 'Microsoft Internet Explorer'; var hINet, hFile : HINTERNET; tmp : String; Readed : DWORD; AnsiURL : AnsiString; Buffer : Array[0..1023] of Char; begin hINet := InternetOpen(AgentName, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0); try if hINet = nil then Raise Exception.Create('Fail to Execute Internet Open'); AnsiURL := url; hFile := InternetOpenURL(hINet, PAnsiChar(AnsiURL), nil, 0, 0, 0); try if hFile = nil then Raise Exception.Create('Fail to Execute Internet Open URL:' + URL); Result := ''; repeat InternetReadFile(hFile, @Buffer[0], 1024, Readed); SetString(tmp, Buffer, Readed); Result := result + tmp; until Readed < 1024; finally InternetCloseHandle(hFile); end; finally InternetCloseHandle(hINet); end; end; Το παρακάτω λειτουργεί και για POST αλλά είναι αρκετά πιο περίπλοκο και σε λίγο πιο χαμηλό επίπεδο. > function CopyRmFile(const method,rmDir,rmFile,postData: string; exHeaders,headers,Contents : TStrings) : integer; {$IFDEF USE_WNET} var lpvBuffer : array[0..255] of Char; hReq : HINTERNET; url : string; buf : array[0..1023] of char; fs : TStream; readed : cardinal; dwStatus, reserved, dwStatusSize : dword; tmp : string; exHeadTmp : string; {$ENDIF} begin {$IFDEF USE_WNET} result := -1; hreq := httpOpenRequest( hCon, pchar(method), pchar(rmDir+httpEncodeX(rmFile)), nil, nil, nil, INTERNET_FLAG_NO_CACHE_WRITE, 0 ); exHeadTmp := ''; if assigned(exHeaders) then exHeadTmp := exHeaders.Text; if ansiSameText(method,'POST') then begin if exHeadTmp<>'' then exHeadTmp := exHeadTmp+#13#10; exHeadTmp := exHeadTmp + 'Content-Type: application/x-www-form-urlencoded'; end; if hreq=nil then RaiseLastWin32Error; try if not httpSendRequest( hreq, PChar(exHeadTmp), Length(exHeadTmp), pchar(PostData), length(postData) ) then raiseLastWin32Error; dwStatusSize := SizeOf(dwStatus); reserved := 0; if not httpQueryInfo( hreq, HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE, @dwStatus, dwStatusSize, reserved ) then RaiseLastWin32Error; if dwSTATUS<>200 then Raise Exception.CreateFmt('error get file %d',[dwStatus]); dwStatusSize := sizeof(lpvBuffer); FillChar(lpvBuffer,sizeof(lpvBuffer),0); if not httpQueryInfo( hreq, HTTP_QUERY_RAW_HEADERS_CRLF, @lpvBuffer, dwStatusSize, reserved ) then RaiseLastWin32Error; Headers.Text := String(lpvBuffer); if Assigned(Contents) then begin fs := TMemoryStream.Create; readed := 0; try repeat if not InternetReadFile(hreq,@buf,SizeOf(buf),readed) then Raise Exception.CreateFmt('can not read from url: %s',[url]); fs.Write(buf,readed); until readed=0; fs.Position := 0; SetLength(tmp,fs.Size); fs.Read(Pointer(tmp)^,fs.Size); Contents.Text := tmp; finally fs.Free; end; end; Result := dwStatus; finally InternetCloseHandle(hReq) end; {$ENDIF} end; Για απορίες και ερώτησεις, απλά κάντε ένα ποστ εδώ
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.