rlopes has asked for the wisdom of the Perl Monks concerning the following question:

Venerable Monks,
I’m new to Perl and I’ve just learned about the wonders of WWW::Mechanize, so I tried to write an example code.

I tried posting a comment on my blog:
http://www.attorneycar.com/what-to-do-in-a-car-accident/

Firstly I read the form fieds with mech-dump:

$ mech-dump “http://www.attorneycar.com/what-to-do-in-a-car-accident/”

GET http://www.attorneycar.com/index.php

s=search this site… (text)

POST http://www.attorneycar.com/wp-comments-post.php

author= (text) email= (text) url= (text) comment= (textarea) submit=Submit Comment (submit) comment_post_ID=37 (hidden readonly)

Then I wrote the following code:

#!/usr/bin/perl
use WWW::Mechanize;

my $url;
my $m = WWW::Mechanize->new(autocheck => 1);
my $response;

use WWW::Mechanize;
$url = ‘http://www.attorneycar.com/what-to-do-in-a-car-accident/’;
$m->get($url);
$m->field(‘author’, ‘test’);
$m->field(‘email’, ‘test@hotmail.com’);
$m->field(‘url’, ‘sasdsadadasd’);
$m->field(‘comment’, ‘sasdsadadasd’);
$response = $m->submit();
print $response->content();

But when I try to run it I get:

$ perl wpress.pl
No such field ‘author’ at /usr/share/perl5/WWW/Mechanize.pm line 1247

Any ideas?

Replies are listed 'Best First'.
Re: WWW::Mechanize can't see the fields
by marto (Cardinal) on Oct 23, 2009 at 13:37 UTC

    You have more than one form on that page, the $mech->field() method defaults to the first form on the page, you need to either specify a form_name or form_number. Double check the WWW::Mechanize documentation. Also you don't have:

    use strict; use warnings;

    in your code, and you have use WWW::Mechanize; twice.

    Martin

Re: WWW::Mechanize can't see the fields
by Corion (Patriarch) on Oct 23, 2009 at 13:35 UTC

    Most likely the form you're trying to fill out is not the form that's active. WWW::Mechanize has the concept of a current form and it looks like the page on "your" blog has at least two forms.

Re: WWW::Mechanize can't see the fields
by Anonymous Monk on Oct 23, 2009 at 21:34 UTC
    I tried this code but still getting some problems.
    #!/usr/bin/perl use warnings; use strict; use WWW::Mechanize; my $url; my $m = WWW::Mechanize->new(autocheck => 1); my $response; $url = 'http://www.attorneycar.com/what-to-do-in-a-car-accident/'; $m->post($url); $m->form_number(2); $m->field('author', 'test'); $m->field('email', 'test@hotmail.com'); $m->field('url', 'sasdsadadasd'); $m->field('comment', 'sasdsadadasd'); $m->field('comment_post_ID', '37' ); $response = $m->submit_form(); print $m->response(); print $response->content();
    I'm getting this output. I used post because I noticed that it is using the POST method.
    Error POSTing http://www.attorneycar.com/wp-comments-post.php: Interna +l Server Error at 124.pl line 21

      You will need to look at your webserver error log. The error:

      Internal Server Error

      means that your CGI program had an internal problem. It's easy for you to look into your webserver error log and to find the cause for the error there.

      Alternatively, read the WWW::Mechanize documentation about the autocheck parameter, to switch off the automatic checking of success.

        Thanks for the replies people.

        Marto--
        You have more than one form on that page, the $mech->field() method defaults to the first form on the page, you need to either specify a form_name or form_number.
        This is exactly the error, all I needed to do was specify the form id or number.

        Anonymous Monk--
        I'm getting this output. I used post because I noticed that it is using the POST method. Error POSTing http://www.attorneycar.com/wp-comments-post.php: Interna +l Server Error at 124.pl line 21
        This is happening because Wordpress will make sure to return server errors in case it sees the same post being sent twice (spam control I guess). Try modifying the "comment" field and it should work.