In the "put up or shut up" department, I needed some procrastination time, was looking for an excuse to do something with
LWP::UserAgent and
XML::Simple, and thought that I might test my
assertion that the published API would make it possible to accomplish your task.
This works for logging in and requesting an upload ticket, and you will need to enter your particulars (email address and password, api key, and secret key). You will also need to develop the upload form and deal with the site's redirection scheme for a complete solution.
I welcome any and all suggestions for improvements!
#!/usr/bin/perl
use warnings;
use strict;
use LWP::UserAgent;
use XML::Simple qw(:strict);
use Digest::MD5 qw (md5_hex);
my $api_key = '';
my $secret = '';
my $email = '';
my $password = '';
my $api_url = 'http://www.divshare.com/api/';
my $user_agent = LWP::UserAgent->new;
$user_agent ->timeout(10);
## Login to Divshare and get an API Session key
my $api_session_key = login($user_agent, $api_key, $email, $password);
## Using the API Session Key compute the API Signature using the "secr
+et" key
my $api_sig = gen_api_sig($secret, $api_session_key);
## Request an upload ticket
my $upload_ticket = get_upload_ticket($user_agent, $api_key, $api_ses
+sion_key, $api_sig);
print "Your upload ticket is $upload_ticket\n";
## Logout
my $logout = logout($user_agent, $api_key, $api_session_key, $api_sig)
+;
sub login {
my ($user_agent,$api_key,$email,$password)=@_;
my $login_response = $user_agent->post($api_url,
{
'method' => "login",
'api_key' => "$api_key",
'user_email' => "$email",
'user_password'=> "$password"
});
my $api_session_xml= $login_response -> content;
my $api_session_key= XMLin($api_session_xml, forcearray=>1, keyatt
+r=>[] )->{api_session_key};
return $api_session_key->[0];
}
sub gen_api_sig {
my ($secret,$api_session_key) = @_;
my $build_string = $secret.$api_session_key;
my $api_sig = md5_hex($build_string);
return $api_sig;
}
sub get_upload_ticket {
my ($user_agent, $api_key, $api_session_key, $api_sig) = @_;
my $upload_ticket_response = $user_agent->post($api_url,
{
'method' => "get_upload_ticke
+t",
'api_key' => "$api_key",
'api_session_key' => "$api_sess
+ion_key",
'api_sig' => "$api_sig"
});
my $upload_ticket_xml = $upload_ticket_response -> content;
my $upload_ticket_result = XMLin($upload_ticket_xml, forcearray=>1
+, keyattr=>[] ) ->{upload_ticket};
return $upload_ticket_result->[0];
}
sub logout {
my ($user_agent, $api_key, $api_session_key, $api_sig) = @_;
my $logout_response = $user_agent->post($api_url,
{
'method' => "logout",
'api_key' => "$api_key",
'api_session_key' => "$api_session_key",
'api_sig' => "$api_sig"
});
my $logout_xml = $logout_response -> content;
my $logout_result = XMLin($logout_xml, forcearray=>1, keyattr=>[]
+) ->{logged_out};
return $logout_result->[0];
}