Προς το περιεχόμενο

Πρόγραμμα που θα συμπληρώνει WEB forms αυτόματα


lanista

Προτεινόμενες αναρτήσεις

Δημοσ.

Είνια δυνατόν κάποιος να φιτάξει ένα πρόγραμμα σε C++ ( ή σε κάποια άλλη γλώσσα ) που θα μπορεί να κάνει αυτόματα submit forms που είναι γραμμένες σε Javascript ??

 

Είναι εύκολο να κατεβάσει και να αλλάξει κάποιος μία σελίδα σε Javascript να αλλάξει κάποια πεδία (radio buttons κλτ ) αλλά μετά πως θα την ποσταρει στο διαδίκτυο δηλαδή πως θα στείλει ην εντολή "submit form " που ένας χρήστης την στέλνει πατώντας ένα κουμπάκι ???

 

Αν κάποιος μπορεί να μου απαντήσει αν γίνεται γιατί δεν το θέλω για κάποιο άλλο λόγο αλλά για την διπλωματική μου ...

Δημοσ.

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.

Δημοσ.

Ναι γίνεται, το εχω κάνει σε Delphi...

Δεν είναι ευκολο, αλλά ούτε και δύσκολο, αν θες μπορώ να postαρω τον κώδικα και μία μικρή περιγραφή του...

Δημοσ.

Η παρακάτω συνάρτηση διαβάζει μία σελίδα. Βασίζετε σε μία βιβλιοθήκη των 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;

 

Για απορίες και ερώτησεις, απλά κάντε ένα ποστ εδώ

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...