File Coverage

blib/lib/WWW/Shorten/Safe.pm
Criterion Covered Total %
statement 12 12 100.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 16 16 100.0


line stmt bran cond sub pod time code
1             # $Id: Safe.pm 106 2009-05-27 21:06:26Z jsobrier $
2             # $Author: jsobrier $
3             # $Date: 2009-05-27 02:36:26 +0530 (Wed, 27 My 2009) $
4             # Author: Julien Sobrier
5             ################################################################################################################################
6             package WWW::Shorten::Safe;
7              
8 1     1   21235 use warnings;
  1         2  
  1         35  
9 1     1   6 use strict;
  1         2  
  1         39  
10 1     1   6 use Carp;
  1         8  
  1         91  
11              
12 1     1   7 use base qw( WWW::Shorten::generic Exporter );
  1         2  
  1         1012  
13              
14             use XML::Simple;
15              
16             require Exporter;
17              
18             our %EXPORT_TAGS = ( 'all' => [ qw() ] );
19             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
20             our @EXPORT = qw(new version);
21              
22             my @ISA = qw(Exporter);
23              
24             use vars qw( @ISA @EXPORT );
25              
26              
27             =head1 NAME
28              
29             WWW::Shorten::Safe - Interface to shortening URLs using http://safe.mn/, http://clic.gs/, http://go2.gs/ or http://cliks.fr/.
30              
31             =head1 VERSION
32              
33             1.22
34              
35             =cut
36              
37             our $VERSION = '1.22';
38              
39             # ------------------------------------------------------------
40              
41              
42             =head1 SYNOPSIS
43              
44             WWW::Shorten::Safe provides an easy interface for shortening URLs using L, L, L or L.
45              
46              
47             use WWW::Shorten::Safe;
48              
49             my $url = "http://www.example.com/";
50              
51             my $short = makeashorterlink($url);
52             my $long = makealongerlink($short); # "http://www.example.com/"
53              
54             or
55              
56             use WWW::Shorten::Safe;
57              
58             my $url = "http://www.example.com";
59             my $safe = WWW::Shorten::Safe->new();
60              
61             $safe->shorten(URL => $url);
62             print "shortened URL is $safe->{safeurl}\n";
63              
64             $safe->expand(URL => $safe->{safeurl});
65             print "expanded/original URL is $safe->{longurl}\n";
66              
67             my $info = $safe->info(URL => $safe->{safeurl});
68             print "number of clicks: ", $info->{clicks}, "\n";
69              
70              
71             =head1 FUNCTIONS
72              
73             =head2 new
74              
75             Create a new safe.mn object.
76              
77             my $safe = WWW::Shorten::Safe->new();
78              
79              
80             =head3 Arguments
81              
82             =head4 source
83              
84             Optional. User-Agent value.
85              
86             my $safe = WWW::Shorten::Safe->new(source => 'MyLibrary');
87              
88             default: perlteknatussafe
89              
90              
91             =head4 domain
92              
93             Optional. Domain of the short URL. Choose between safe.mn, clic.gs, go2.gs or cliks.fr.
94              
95             my $safe = WWW::Shorten::Safe->new(domain => 'clic.gs');
96              
97              
98             default: safe.mn
99              
100             =cut
101             sub new {
102             my ($class, %args) = @_;
103             $args{source} ||= "perlteknatussafe";
104             $args{domain} ||= 'safe.mn';
105              
106             # print $args{domain}, "\n";
107              
108             my $safe = {
109             browser => LWP::UserAgent->new(agent => $args{source}),
110             domain => $args{domain},
111             };
112              
113             bless $safe, $class;
114             # return $class;
115             }
116              
117              
118             =head2 makeashorterlink(url[, domain])
119              
120             The function C will call the safe.mn API site passing it
121             your long URL and will return the shorter safe.mn version.
122              
123             =head3 Arguments
124              
125             =head4 url
126              
127             B. Long URL to shorten
128              
129             my $short = makeashorterlink("http://www.example.com/"); # http://safe.mn/25
130              
131             =head4 domain
132              
133             Optional. Domain of the short URL. Choose between safe.mn, clic.gs, go2.gs or cliks.fr.
134              
135             my $short = makeashorterlink("http://www.example.com/", "clic.gs"); # http://clic.gs/25
136              
137             safe.mn by default
138              
139             =cut
140             sub makeashorterlink #($;%)
141             {
142             my $url = shift or croak('No URL passed to makeashorterlink');
143             my $domain = shift || 'safe.mn';
144              
145             my $ua = __PACKAGE__->ua();
146              
147              
148             my $safe;
149             my $safeurl = "http://$domain/api/?format=text&url=$url";
150             $safe->{response} = $ua->get($safeurl);
151             $safe->{safeurl} = $safe->{response}->{_content};
152             $safe->{safeurl} =~ s/\s//mg;
153             return unless $safe->{response}->is_success;
154             return $safe->{safeurl};
155             }
156              
157             =head2 makealongerlink(url)
158              
159             The function C does the reverse. C
160             will accept as an argument the full safe.mn/clic.gs/go2.gs/cliks.fr URL.
161              
162             If anything goes wrong, then the function will return C.
163              
164             =head3 Arguments
165              
166             =head4 url
167              
168             B. Short URL to shorten
169              
170             my $long = makealongerlink("http://clic.gs/25"); # "http://www.example.com/"
171              
172             =cut
173             sub makealongerlink #($,%)
174             {
175             my $url = shift or croak('No shortened safe.mn URL passed to makealongerlink');
176              
177             my $ua = __PACKAGE__->ua();
178              
179             my $safe;
180              
181             my $safeurl = URI->new("http://safe.mn/api/?format=text&short_url=$url");
182              
183             $safe->{response} = $ua->get($safeurl);
184             $safe->{longurl} = $safe->{response}->{_content};
185             $safe->{longurl} =~ s/\s//mg;
186              
187             return undef unless $safe->{response}->is_success;
188             return $safe->{longurl};
189             }
190              
191             =head2 shorten
192              
193             Shorten a URL using http://safe.mn/, http://clic.gs/, http://go2.gs/ or http://cliks.fr/.
194             Calling the shorten method will return the shortened URL but will also store it in safe.mn object until the next call is made.
195              
196             my $url = "http://www.example.com/";
197             my $shortstuff = $safe->shorten(URL => $url);
198              
199             print "safeurl is " . $safe->{safeurl} . "\n";
200             or
201             print "safeurl is $shortstuff\n";
202              
203              
204             =head3 Arguments
205              
206             =head4 URL
207              
208             B. Long URL to shorten
209              
210             my $short = $safe->shorten(URL => "http://www.example.com/"); # http://safe.mn/25
211              
212             =head4 DOMAIN
213              
214             Optional. Domain of the short URL. Choose between safe.mn, clic.gs, go2.gs or cliks.fr.
215              
216             my $short = $safe->shorten(URL => "http://www.example.com/", DOMAIN => "clic.gs"); # http://clic.gs/25
217              
218             safe.mn by default
219              
220             =cut
221             sub shorten {
222             my ($self, %args) = @_;
223             my $url = $args{URL} || croak("URL is required.\n");
224             my $domain = $args{DOMAIN} || $self->{domain} || 'safe.mn';
225              
226             my $api = "http://$domain/api/?format=text&url=$url";
227             # print $api, "\n";
228              
229             $self->{response} = $self->{browser}->get($api);
230             return undef unless $self->{response}->is_success;;
231              
232             $self->{safeurl} = $self->{response}->{_content};
233             $self->{safeurl} =~ s/\s//mg;
234              
235             return $self->{safeurl};
236             }
237              
238              
239             =head2 expand
240              
241             Expands a shortened safe.mn URL to the original long URL.
242              
243             =head3 Arguments
244              
245             =head4 URL
246              
247             B. Long URL to shorten
248              
249             my $long = $safe->expand(URL => "http://safe.mn/25"); # http://www.example.com/
250              
251             =cut
252             sub expand {
253             my ($self, %args) = @_;
254             my $url = $args{URL} || croak("URL is required.\n");
255              
256              
257             my $api = "http://safe.mn/api/?format=text&short_url=$url";
258             $self->{response} = $self->{browser}->get($api);
259              
260             return undef unless $self->{response}->is_success;
261             $self->{longurl} = $self->{response}->content;
262             $self->{longurl} =~ s/\s//mg;
263              
264             return $self->{longurl};
265             }
266              
267             =head2 info
268              
269             Get information bout a short link.
270              
271             =head3 Arguments
272              
273             =head4 URL
274              
275             B. Short URL to track
276              
277             my $info = $safe->info(URL => "http://safe.mn/25");
278             print "number of clicks: ", $info->{clicks}, "\n";
279              
280             See http://safe.mn/api-doc/protocol#track-response for the list of fields returned: clicks, referers, countries, filetype, etc.
281              
282             =cut
283             sub info {
284             my ($self, %args) = @_;
285             my $url = $args{URL} || croak "URL is required.\n";
286              
287              
288             my $api = "http://safe.mn/api/info?format=xml&url=$url";
289             $self->{response} = $self->{browser}->get($api);
290              
291             return { } unless $self->{response}->is_success;
292              
293             my $xml = XMLin($self->{response}->content, ForceArray => [qw/referers countries/]);
294             return $xml;
295             }
296              
297              
298              
299             =head2 version
300              
301             Gets the module version number
302              
303             =cut
304             sub version {
305             my ($self, $version) = @_;
306              
307             warn "Version $version is later then $WWW::Shorten::Safe::VERSION. It may not be supported" if (defined ($version) && ($version > $WWW::Shorten::Safe::VERSION));
308             return $WWW::Shorten::Safe::VERSION;
309             }#version
310              
311             sub ua {
312             my ($self) = @_;
313              
314             return LWP::UserAgent->new();
315             }
316              
317              
318             =head1 AUTHOR
319              
320             Julien Sobrier, C<< >>
321              
322             =head1 BUGS
323              
324             Please report any bugs or feature requests to C.
325              
326              
327             =head1 SUPPORT
328              
329             You can find documentation for this module with the perldoc command.
330              
331             perldoc WWW::Shorten::Safe
332              
333              
334             You can also look for information at:
335              
336             =over 4
337              
338             =item * RT: CPAN's request tracker
339              
340             L
341              
342             =item * AnnoCPAN: Annotated CPAN documentation
343              
344             L
345              
346             =item * CPAN Ratings
347              
348             L
349              
350             =item * Search CPAN
351              
352             L
353              
354             =back
355              
356              
357             =head1 ACKNOWLEDGMENTS
358              
359             =over
360              
361             =item Dave Cross for WWW::Shorten.
362             .
363              
364             =back
365              
366             =head1 COPYRIGHT & LICENSE
367              
368             =over
369              
370             =item Copyright (c) 2009 Julien Sobrier, All Rights Reserved L.
371              
372              
373             =back
374              
375             This program is free software; you can redistribute it and/or modify it
376             under the same terms as Perl itself.
377              
378             =head1 DISCLAIMER OF WARRANTY
379              
380             BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
381             FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
382             OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
383             PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
384             EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
385             WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
386             ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
387             YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
388             NECESSARY SERVICING, REPAIR, OR CORRECTION.
389              
390             IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
391             WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
392             REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENSE, BE
393             LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
394             OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
395             THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
396             RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
397             FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
398             SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
399             SUCH DAMAGES.
400              
401             =head1 SEE ALSO
402              
403             L, L, L.
404              
405             =cut
406              
407             1; # End of WWW::Shorten::Safe