Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Comment on

( #3333=superdoc: print w/ replies, xml ) Need Help??
#!/usr/local/bin/perl -w # # This script was written for [Ovid] to update his homenode with the # latest statistics from SETI@Home. It is easily adapted to other # tasks where a user wants to automate updating information on their # homenode. # # To use, first BACKUP YOUR HOMENODE (mark'n'copy, then save it in a # text file, in case something happens). Insert a pair of tags where + # you want the text to be inserted in your homenode. The tag pair is # <!--StartTag--><!--EndTag-->. When the script runs, it searchs for # this tag pair, and replaces anything between them with the new text +. # # If the tags don't exist, it will create them at the top of the page +, # and (hopefully) not wreck any existing text. # # To run the script, it's: setiupdate -u username -p password [-s] [- +v] # # -s tells the script to set the significant update check box. (Note # that for some reason, either the PM HTML, or the HTML::Form module, # a warning is generated. It won't go away. If you fix it, let me # know). # # -v says be a little more verbose, and tell me what each stage of th +e # process is. Not recommended for cron jobs. # # To use this for non-SETI@Home stuff, just cut out the SETI related # code, and insert your own. As world-class Perl programmers who spe +nd # 1/2 their life at www.perlmonks.org, this should be trivial. # # As usual, any bugs(!) should be report to me, please. Any complain +ts # to /dev/null, or /msg merlyn, and he'll re-write this thing in 10 # lines, point out the security holes, then write it up in the Web # Techniques column (just kidding, dude!) # use strict; use Carp; use LWP::UserAgent; use LWP::Simple; use HTTP::Cookies; use URI::Escape; use Getopt::Std; use HTML::Form; use vars qw($def_username $def_password $def_supdate $def_verbose); use vars qw($pmsite $setisite); use vars qw($globalCookieJar $globalUserAgent); $def_username = ''; $def_password = ''; $def_supdate = 0; $def_verbose = 0; $pmsite = 'http://www.perlmonks.org/index.pl'; $setisite = 'http://setiathome.ssl.berkeley.edu/cgi-bin/cgi?cmd=te +am_show&id=86606'; # # # { my %args = (); getopts ('?hu:p:Psv', \%args); if ($args{'?'} || $args{h} || !scalar keys %args) { usage (); exit; } if ($args {P}) { local $| = 1; print "Password: "; $args {p} = <STDIN>; chomp ($args{p}); } my $username = $args {u} || $def_username; my $password = $args {p} || $def_password; my $supdate = $args {s} || $def_supdate; my $verbose = $args {v} || $def_verbose; $username or die "No username. Program terminated.\n"; $password or die "No password. Program terminated.\n"; # # Need these globally, so instantiate one of each # $globalCookieJar = HTTP::Cookies->new; $globalUserAgent = LWP::UserAgent->new; print "\n", scalar localtime, " - Retrieving SETI statistics...\n" +if $verbose; my $setistats = do_get_seti_stats () || die "Eeek! Can't get the SE +TI stats page\n"; print scalar localtime, " - Logging into www.perlmonks.org...\n" if + $verbose; login ($username, $password) or die "Eeek! Can't login into perlmon +ks? Wrong username or password?\n"; print scalar localtime, " - Loading update homenode page...\n" if $ +verbose; my $uri = common_HTTP_request ("displaytype=edit&node=$username&typ +e=user"); print scalar localtime, " - Updating homenode page...\n" if $verbos +e; do_update_homenode ($setistats, $supdate, $uri); print scalar localtime, " - Update complete...\n\n" if $verbose; } # # # sub do_get_seti_stats { @_ == 0 or croak "Incorrect number of parameters"; $LWP::Simple::FULL_LWP = 1; my $page = get ($setisite); return unless ($page); $page =~ s/.*?(<table )/$1/s; return $page; } # # # sub do_update_homenode { @_ == 3 or croak "Incorrect number of parameters"; my ($newtext, $significantupdate, $uri) = @_; my $content = $uri->content; my @forms = HTML::Form->parse ($content, $uri->base); foreach my $form (@forms) { if ($form->find_input ('displaytype', 'hidden')) { my $currentPage = $form->value ('user_doctext'); if ($currentPage !~ /(<!--StartTag-->)(?:.*?)(<!--EndTag-->)/ +si) { $currentPage = "<!--StartTag-->\n$newtext\n<!--EndTag-->\n +$currentPage"; } else { $currentPage =~ s/(<!--StartTag-->)(?:.*?)(<!--EndTag-->)/ +$1\n$newtext\n$2/si; } $form->value ('user_doctext', $currentPage); $form->value ('significantupdate', 'on') if $significantupdat +e; my $res = $globalUserAgent->request ($form->click); die sprintf ("Eeek! Request failed (%s)\n", $res->status_line +) unless ($res->is_success); return; } } die "Eeek! Can't find the form (is this the right page?)\n"; } # # Log the user in, and extract his cookies. # sub login { @_ == 2 or croak "Incorrect number of parameters"; my ($username, $password) = @_; my $req = HTTP::Request->new (POST => $pmsite); $req->content_type ('application/x-www-form-urlencoded'); $req->content ("user=$username&passwd=$password&op=login"); my $res = $globalUserAgent->request ($req); die sprintf ("Eeek! Request failed (%s)\n", $res->status_line) if ! +$res->is_success; $globalCookieJar->extract_cookies ($res); $globalUserAgent->cookie_jar ($globalCookieJar); return (($globalCookieJar->as_string () =~ m/userpass/i ? $res : un +def)); } # # # sub common_HTTP_request { @_ == 1 or croak "Incorrect number of parameters"; my $contentdata = shift; my $req = HTTP::Request->new (POST => $pmsite); $req->content_type ('application/x-www-form-urlencoded'); $req->content ($contentdata); $globalCookieJar->add_cookie_header ($req); my $res = $globalUserAgent->request ($req); return $res if ($res->is_success); die sprintf ("Eeek! Request failed (%s)\n", $res->status_line); } # # # sub usage { print <<'ENDOFHELP'; usage: setiupdate.pl [-h | -?] [-u username] [-p password] [-P] [-s] [ +-v] Update a tagged space in a homenode with SETI@Home statistics -? this help list -h this help list -u username user name on Perlmonks.org -p password password for user -P forces interactive prompt for password. -s sets significant update checkbox -v be verbose about what's going on -P overrides -p or script defaults. The script can be edited to set defaults for username and password. ENDOFHELP }

In reply to Homenode Updater by jcwren

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others pondering the Monastery: (7)
    As of 2015-07-29 02:18 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?

      The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









      Results (260 votes), past polls