Results 1 to 7 of 7

Thread: Indy IdHTTP.Post uitvoeren vanuit Delphi

  1. #1
    TDigitalTrain user Hans Brenkman's Avatar
    Join Date
    Mar 2002
    Location
    Weert
    Posts
    1,861

    Indy IdHTTP.Post uitvoeren vanuit Delphi

    T.b.v. ons intranet gebouwd in Wordpress probeer ik geautomatiseerd afbeeldingen (grafieken) toe te voegen. Dat lukt aardig door van de originele afbeeldingen een kopie naar de webserver te maken, andere formaten van de afbeelding te maken zoals deze door Wordpress gebruikt worden en de nodige records in te voegen en bestaande aan te passen. Ik zie dan in het intranet voor de beheerder met voldoende rechten de nieuwe afbeelding verschijnen, als was deze handmatig toegevoegd, maar deze wordt nog niet "gepublished". Hiervoor moet ik in Wordpress handmatig op de knop "Update" klikken. Deze knop is t.b.v. alle pagina's wat je ook maar bewerkt dus niet specifiek van de gebruikte plugin voor de afbeeldingen. Het "klikken" op die knop willen we ook automatiseren dus willen we de code die daar achter zit aanroepen vanuit de Delphi applicatie. Dit lijkt het algemene php-script /wp-admin/post.php te zijn dus ik heb geprobeerd met Indy (IdHTTP) dit script aan te roepen.

    Delphi Code:
    1. var
    2.   Parameters: TStringList;
    3.   Response: TStringStream;
    4. begin
    5.   // Geef het applicatie-path door aan de functie die de SSL-lib moet gaan openen.
    6.   IdOpenSSLSetLibPath(ExtractFilePath(Application.ExeName));
    7.  
    8.   Parameters := TStringList.Create;
    9.   Response   := TStringStream.Create;
    10.   try
    11.     IdHTTP.Request.BasicAuthentication := True;
    12.     IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
    13.     IdHTTP.Request.Charset     := 'utf-8';
    14.     IdHTTP.Request.Username    := 'adminwp';              
    15.     IdHTTP.Request.Password    := 'adminwp';            
    16.     IdHTTP.Request.Host        :=  BASE_URL;
    17.  
    18.     Parameters.Add('username=adminwp');
    19.     Parameters.Add('password=adminwp');
    20.     Parameters.Add('post=12926');    // het ID van de gallery
    21.     Parameters.Add('action=post');   // de opdracht (action) in het php-script post.php.
    22.  
    23.     try
    24.       IdHTTP.Post(BASE_URL + '/wp-admin/post.php', Parameters, Response);
    25.      
    26.       RzMemo.Lines.Add(Format('Response Code: %d', [IdHTTP.ResponseCode]));
    27.       RzMemo.Lines.Add(Format('Response Text: %s', [IdHTTP.ResponseText]));
    28.     except
    29.       on E:EIdHTTPProtocolException do
    30.         ShowMessage(E.Message + CRLF + E.ErrorMessage);
    31.     end;
    32.   finally
    33.     Parameters.Free;
    34.     Response.Free;
    35.   end;
    36. end;

    Welke username en/of password ik ook gebruik, de respons is altijd

    Delphi Code:
    1. Response Code: 200
    2. Response Text: HTTP/1.1 200 OK

    Behalve als ik een andere URL gebruik die niet bestaat krijg ik een foutmelding.

    Maar na een refresh van de intranet-pagina is de toegevoegde afbeelding nog steeds niet gepublished en dus voor een ander niet zichtbaar.

    Ik heb vervolgens een TIdLogFile aan IdHTTP gekoppeld (naast het gebruik van TIdSSLIOHandlerSocketOpenSSL) en die geeft dit resultaat (de verdere details achter iedere regel heb ik eruit geknipt) :

    Delphi Code:
    1. Stat Connected.
    2. Sent 12-05-2017 16:18:41: POST /wp-admin/post.php HTTP/1.0<EOL>
    3. Sent 12-05-2017 16:18:41: user=adminwp&password=adminwp&post=12926&action=post
    4. Recv 12-05-2017 16:18:44: HTTP/1.1 302 Moved Temporarily<EOL>
    5. Sent 12-05-2017 16:18:44: POST /wp-login.php?redirect_to=http%3A%2F%2Fxxxx.xxxxxx.nl%2Fwp-admin%2Fpost.php&reauth=1 HTTP/1.0<EOL>
    6. Sent 12-05-2017 16:18:44: user=adminwp&password=adminwp&post=12926&action=post
    7. Recv 12-05-2017 16:18:46: HTTP/1.1 302 Moved Temporarily<EOL>
    8. Sent 12-05-2017 16:18:46: POST /login/?login=empty HTTP/1.0<EOL>
    9. Sent 12-05-2017 16:18:46: user=adminwp&password=adminwp&post=12926&action=post
    10. Recv 12-05-2017 16:18:48: HTTP/1.1 200 OK<EOL>

    Ik heb het idee dat ik wel bij de webserver geraak, maar niet dat er iets uitgevoerd wordt. Het is ook nog maar de vraag of mijn analyse dat post.php achter die knop aangeroepen wordt juist is. N.a.v. andere threads heb ik ook al naar Fiddler gekeken maar wordt er niet veel wijzer van. Ik zie dezelfde teksten terug die ik ook gelogd heb m.b.v. TIdLogFile.

    Wie kan me een aanwijzing geven wat er fout gaat ?
    Testen kan niet de afwezigheid van fouten aantonen, slechts de aanwezigheid van gevonden fouten.

    Het is verdacht als een nieuw ontwikkeld programma direct lijkt te werken: waarschijnlijk neutraliseren twee ontwerpfouten elkaar.

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Doorgaans doe je tegenwoordig een POST niet URL-encoded, maar als multipart/form-data.
    Of dit bij WordPress ook zo is weet ik niet, maar kun je makkelijk zien door naar de gegenereerde
    HTML te kijken.

    Als daar bij <form> staat "application/x-www-form-urlencoded", dan moet je inderdaad via de URL-
    aanroep je parameters opgeven.
    Staat er daarentegen "multipart/form-data", dan moet je de data als datastream posten.

    Bij Indy kan dat door middel van een TIdMultiPartFormDataStream, welke je eerst aanmaakt, vult en
    dan als parameter van het IdHTTP.Post-method meegeeft.


    De statusmeldingen die je van een server terugkrijgt geven alleen weer of een pagina "Geserveerd"
    kan worden; dit kan dus in principe ook een pagina met een foutmelding zijn (gegenereerd door de
    server, dus statuscode = 200).
    TMemoryLeak.Create(Nil);

  3. #3
    Volgens mij gaat dat zo niet werken wat je doet...

    Je wilt direct een /wp-admin/post.php aanroepen met een gebruikersnaam en wachtwoord. Wordpress accepteert dat niet en redirect je naar de login pagina. Even afgezien of op dat moment de post-data netjes meegaat heb je het probleem als je weer terug geredirect wordt, dat je login-cookie weer verloren gaat. Want Wordpress werkt met cookies om de login te onthouden.

    Eigenlijk behoor je (netjes) eerst in te loggen en de cookies te bewaren. Daarna ben je vrij om een post te doen op elke andere pagina, zolang je die login-cookies maar netjes meegeeft.

    Misschien dat dit kan helpen:
    http://stackoverflow.com/questions/2...ordpress-login

    edit: Of zou de indy-aanroep intern alle cookies goed bijhouden met een redirect?

  4. #4
    Quote Originally Posted by Hans Brenkman View Post
    ... en de nodige records in te voegen en bestaande aan te passen. Ik zie dan in het intranet voor de beheerder met voldoende rechten de nieuwe afbeelding verschijnen, als was deze handmatig toegevoegd, maar deze wordt nog niet "gepublished".
    Hoe voeg je overigens die afbeeldingen e.d. toe?
    Doe je dat direct in de Wordpress database?
    Zo ja... waarom die je dan daar ook niet automatisch een publish in?

  5. #5
    TDigitalTrain user Hans Brenkman's Avatar
    Join Date
    Mar 2002
    Location
    Weert
    Posts
    1,861
    De afbeeldingen worden in een sub-map achter /wp-content/ geplaatst en dus niet in de database. In de database staan alleen de verwijzingen naar de afbeeldingen en de settings per gallery. Hiervoor worden 2 standaard tabellen van Wordpress voor gebruikt en dus geen eigen tabellen van de gallery-plugin. De eigenlijke tabeldefinitie van die gallery wordt als een giga-string in één veld gestopt dus een crime. De code van een gallery met één afbeelding:

    Delphi Code:
    1. a:3:{s:2:"id";i:12016;s:6:"config";a:70:{s:4:"type";s:7:"default";s:7:"columns";s:1:"0";s:13:"
    2. gallery_theme";s:4:"base";s:23:"justified_gallery_theme";s:6:"normal";s:17:"justified_margins";i:1;s:18:"justified_last_row";s:9:"nojustify";s:6:"gutter";i:10;s:6:"margin";i:10;s:10:"image_size";
    3. s:7:"default";s:10:"crop_width";i:640;s:11:"crop_height";i:480;s:4:"crop";i:0;s:21:"additional_copy_title";i:0;s:23:"additional_copy_caption";i:0;s:31:"additional_copy_automatic_title";i:1;
    4. s:33:"additional_copy_automatic_caption";i:1;s:20:"justified_row_height";i:150;s:20:"description_position";s:1:"0";s:11:"description";s:0:"";s:6:"random";s:1:"0";s:17:"sorting_direction";s:3:"ASC";
    5. s:18:"image_sizes_random";a:0:{}s:10:"dimensions";i:0;s:7:"isotope";i:1;s:14:"css_animations";i:1;s:11:"css_opacity";i:100;s:16:"lightbox_enabled";i:1;s:14:"lightbox_theme";s:9:"base_dark";s:19:"lightbox_image_size";s:7:"default";
    6. s:13:"title_display";s:5:"float";s:22:"lightbox_title_caption";s:5:"title";s:6:"arrows";i:1;s:15:"arrows_position";s:6:"inside";s:8:"keyboard";i:1;s:10:"mousewheel";i:1;s:6:"aspect";i:1;s:7:"toolbar";i:1;
    7. s:13:"toolbar_title";i:0;s:16:"toolbar_position";s:3:"top";s:4:"loop";i:1;s:26:"lightbox_open_close_effect";s:4:"fade";s:6:"effect";s:4:"fade";s:5:"html5";i:0;s:9:"supersize";i:0;s:10:"thumbnails";i:1;
    8. s:16:"thumbnails_width";i:75;s:17:"thumbnails_height";i:50;s:19:"thumbnails_position";s:6:"bottom";s:6:"mobile";i:1;s:12:"mobile_width";i:320;s:13:"mobile_height";i:240;s:15:"mobile_lightbox";i:1;
    9. s:16:"mobile_touchwipe";i:1;s:22:"mobile_touchwipe_close";i:0;s:13:"mobile_arrows";i:1;s:14:"mobile_toolbar";i:1;s:17:"mobile_thumbnails";i:1;s:23:"mobile_thumbnails_width";i:75;
    10. s:24:"mobile_thumbnails_height";i:50;s:27:"mobile_justified_row_height";i:80;s:19:"standalone_template";s:0:"";s:7:"classes";a:1:{i:0;s:0:"";}s:3:"rtl";i:0;s:5:"title";
    11. s:19:"0001 xyz";s:4:"slug";s:17:"0001-xyz";s:10:"fullscreen";i:0;s:5:"print";i:0;s:14:"print_position";s:8:"top-left";s:14:"print_lightbox";i:0;s:23:"print_lightbox_position";s:8:"top-left";}s:7:"gallery";a:1:{i:13290;a:8:{s:6:"status";s:6:"active";s:3:"src";
    12. s:113:"http://xyz.nl/wp-content/uploads/envira/0001-32E7BE96B6ECE3DC3E3F15819BC0CFB1/0001_20170113_BPO_IMG.jpg";s:5:"title";s:21:"0001_20170113_BPO_IMG";s:4:"link";
    13. s:113:"http://xyz.nl/wp-content/uploads/envira/0001-32E7BE96B6ECE3DC3E3F15819BC0CFB1/0001_20170113_BPO_IMG.jpg";s:3:"alt";s:0:"";s:7:"caption";s:0:"";s:5:"thumb";
    14. s:123:"http://xyz.nl/wp-content/uploads/envira/0001-32E7BE96B6ECE3DC3E3F15819BC0CFB1/0001_20170113_BPO_IMG-150x100_c.jpg";s:12:"mobile_thumb";
    15. s:123:"http://xyz.nl/wp-content/uploads/envira/0001-32E7BE96B6ECE3DC3E3F15819BC0CFB1/0001_20170113_BPO_IMG-150x100_c.jpg";}}}


    Volgens Wordpress zijn de afbeeldingen published (ik heb dit kort-gesloten met de leverancier van de plugin) maar worden zonder op de "Update"-button (pagina opslaan) te klikken niet getoond aan de desbetreffende gebruiker.

    Ik had al zo'n vermoeden dat er iets met een login moest gebeuren gezien de response van het request. Dus daar ga ik mee aan de gang. Wordt vervolgd ...
    Testen kan niet de afwezigheid van fouten aantonen, slechts de aanwezigheid van gevonden fouten.

    Het is verdacht als een nieuw ontwikkeld programma direct lijkt te werken: waarschijnlijk neutraliseren twee ontwerpfouten elkaar.

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Als je mijn post volgt en ook nog een TIdCookieManaget koppelt aan je TIdHTTP, dan zou het login/cookie-probleem ook ondervangen moeten zijn.
    TMemoryLeak.Create(Nil);

  7. #7
    TDigitalTrain user Hans Brenkman's Avatar
    Join Date
    Mar 2002
    Location
    Weert
    Posts
    1,861
    Het (b)lijkt niet zo eenvoudig te zijn. Er is en REST API voor Wordpress (http://v2.wp-api.org/) die het eenvoudiger zou moeten maken. Ik heb inmiddels Postman gebruikt om e.e.a. te testen. Daar zit voor veel programmeertalen voorbeeldcode bij op basis van echte requests e.d., behalve voor Delphi ...
    Dit is wat er gebouwd moet worden :
    Click image for larger version. 

Name:	diagram.png 
Views:	165 
Size:	39.4 KB 
ID:	7566
    Ik heb inmiddels het "request token" bijna voor elkaar, maar krijg een melding "OAuth signature does not match" terug. W.s. een probleempje a.) de bouw van de signature en b.) met de encryptie van de signature m.b.t. UTF8.

    Echter, ik heb nu een ander klusje met meer prioriteit, dus dit gaat even in de ijskast, maar wordt zeker vervolgd.
    Testen kan niet de afwezigheid van fouten aantonen, slechts de aanwezigheid van gevonden fouten.

    Het is verdacht als een nieuw ontwikkeld programma direct lijkt te werken: waarschijnlijk neutraliseren twee ontwerpfouten elkaar.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •