#!/usr/bin/env perl # Download all FetLife pictures from a profile. # # Usage instructions: # * Fill in the constants. # * Make a folder named "images". # * Run the script. use strict; use warnings; use WWW::Mechanize; use constant { USERNAME => 'username', PASSWORD => 'password', USERID => 'fetlife-userid' }; my $mech = WWW::Mechanize->new(); main($mech); sub login { my $mech = shift; $mech->get('https://fetlife.com/login'); $mech->submit_form( with_fields => { 'nickname_or_email' => USERAME, 'password' => PASSWORD } ); } sub getPicturesOf { my $mech = shift; my $uid = shift; $mech->get("https://fetlife.com/users/$uid/pictures"); my $next = $mech->find_link(text_regex => qr/Next /); while (defined($next)) { $next = $next->url; downloadPictures($mech, $uid); $mech->get("https://fetlife.com/$next"); $next = $mech->find_link(text_regex => qr/Next /); } downloadPictures($mech, $uid); } sub downloadPictures { my $mech = shift; my $uid = shift; my @images = $mech->find_all_images(url_regex => qr{https://flpics\d.a.ssl.fastly.net/\d+/$uid/}); map { my $imgurl = $_->url; $imgurl =~ s/\d+\.jpg$/720.jpg/; if ($imgurl =~ m{/([^/]+)$}) { print "Downloading $1\n"; $mech->get($imgurl, ":content_file" => "images/$1"); } else { print "No go.\n"; } } @images; } sub main { my $mech = shift; login($mech); getPicturesOf($mech, USERID); }