Advertisement
Guest User

Untitled

a guest
Jul 7th, 2013
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.93 KB | None | 0 0
  1. ##### Voice/Voice.pm
  2.  
  3. package Google::Voice;
  4.  
  5. use strict;
  6. use warnings;
  7.  
  8. use Mojo::UserAgent;
  9. use Mojo::JSON;
  10. use IO::Socket::SSL 1.37;
  11.  
  12. use Google::Voice::Feed;
  13. use Google::Voice::Call;
  14.  
  15. use Mojo::Base -base;
  16.  
  17. our $VERSION = 0.05;                                                                                                        
  18.                                                                                                                              
  19. __PACKAGE__->attr([qw/ ua rnr_se /]);
  20.  
  21. sub new {
  22.     my $self = bless {}, shift;
  23.  
  24.     $self->ua(Mojo::UserAgent->new);
  25.  
  26.     return $self;
  27. }
  28.  
  29. sub login {
  30.     my $self = shift;
  31.     my ($user, $pass) = @_;
  32.     my $c = $self->ua;
  33.  
  34.     $c->max_redirects(6);    # Google seems to like redirects everywhere
  35.  
  36.     # GALX value
  37.     my $el =
  38.       $c->get('https://accounts.google.com/ServiceLogin')
  39.       ->res->dom->at('input[name="GALX"]');
  40.  
  41.     my $galx = $el->attrs->{value} if $el;
  42.  
  43. #    $c->post_form(
  44. #        'https://accounts.google.com/ServiceLogin',
  45. #        {   Email  => $user,
  46. #            Passwd => $pass,
  47. #            GALX   => $galx,
  48. #        }
  49. #    );
  50.     $c->post(
  51.         'https://accounts.google.com/ServiceLogin' => form =>
  52.         {   Email  => $user,
  53.             Passwd => $pass,
  54.             GALX   => $galx,
  55.         }
  56.     );
  57.  
  58.     # rnr_se required for subsequent requests
  59.     $el =
  60.       $c->get('https://www.google.com/voice#inbox')
  61.       ->res->dom->at('input[name="_rnr_se"]');
  62.  
  63.     # Login not accepted
  64.     return unless $el;
  65.  
  66.     $self->rnr_se($el->attrs->{value});
  67.  
  68.     return $self;
  69. }
  70.  
  71. sub send_sms {
  72.     my $self = shift;
  73.     my $c    = $self->ua;
  74.     my ($phone, $content) = @_;
  75.  
  76. #    my $json = $c->post_form(
  77. #        'https://www.google.com/voice/b/0/sms/send',
  78. #        {   id          => undef,
  79. #            phoneNumber => $phone,
  80. #            text        => $content || '',
  81. #            _rnr_se     => $self->rnr_se
  82. #        }
  83. #    )->res->json;
  84.     my $json = $c->post(
  85.         'https://www.google.com/voice/b/0/sms/send' => form =>
  86.         {   id          => undef,
  87.             phoneNumber => $phone,
  88.             text        => $content || '',
  89.             _rnr_se     => $self->rnr_se
  90.         }
  91.     )->res->json;
  92.  
  93.     $@ = $json->{data}->{code} and return unless $json->{ok};
  94.  
  95.     return $json->{ok};
  96. }
  97.  
  98. for my $feed (
  99.     qw/ all starred spam trash voicemail
  100.     sms recorded placed received missed /
  101.   )
  102. {
  103.  
  104.     no strict 'refs';
  105.     *{"Google::Voice::${feed}"} = sub {
  106.         shift->feed('https://www.google.com/voice/inbox/recent/' . $feed);
  107.     };
  108. }
  109.  
  110. sub feed {
  111.     my $self = shift;
  112.     my $url  = shift;
  113.  
  114.     my $c = $self->ua;
  115.  
  116.     # Multiple conversations
  117.     my $inbox = $c->get($url)->res->dom;
  118.  
  119.     # metadata
  120.     my $meta = Mojo::JSON->new->decode($inbox->at('response > json')->text);
  121.  
  122.     # content
  123.     my $xml = Mojo::DOM->new->parse($inbox->at('response > html')->text);
  124.  
  125.     # Each conversation in a span.gc-message
  126.     return map
  127.       Google::Voice::Feed->new($_, $meta, $self->rnr_se, $c),
  128.       @{$xml->find('.gc-message')};
  129. }
  130.  
  131. sub call {
  132.     my $self = shift;
  133.     my ($from, $to) = @_;
  134.  
  135. #    my $json = $self->ua->post_form(
  136. #        'https://www.google.com/voice/call/connect' => {
  137. #            forwardingNumber => $from,
  138. #            outgoingNumber   => $to,
  139. #            phoneType        => 1,
  140. #            remember         => 0,
  141. #            _rnr_se          => $self->rnr_se
  142. #        }
  143. #    )->res->json;
  144.     my $json = $self->ua->post(
  145.         'https://www.google.com/voice/call/connect' => form => {
  146.             forwardingNumber => $from,
  147.             outgoingNumber   => $to,
  148.             phoneType        => 1,
  149.             remember         => 0,
  150.             _rnr_se          => $self->rnr_se
  151.         }
  152.     )->res->json;
  153.  
  154.     $@ = $json->{error} and return unless $json->{ok};
  155.  
  156.     return Google::Voice::Call->new(@_, $self->rnr_se, $self->ua);
  157. }
  158.  
  159. 1;
  160.  
  161. =head1 NAME
  162.  
  163. Google::Voice - Easy interface for google voice
  164.  
  165. =head1 DESCRIPTION
  166.  
  167. Easy interface for google voice
  168.  
  169. =head1 USAGE
  170.  
  171.     use Google::Voice;
  172.  
  173.     my $g = Google::Voice->new->login('username', 'password');
  174.  
  175.     # Send sms
  176.     $g->send_sms(5555555555 => 'Hello friend!');
  177.  
  178.     # Error code from google on fail
  179.     print $@ if !$g->send_sms('invalid phone' => 'text message');
  180.  
  181.     # connect call & cancel it
  182.     my $call = $g->call('+15555555555' => '+14444444444');
  183.     $call->cancel;
  184.  
  185.  
  186.     # Print all sms conversations
  187.     foreach my $sms ($g->sms) {
  188.         print $sms->name;
  189.         print $_->time, ':', $_->text, "\n" foreach $sms->messages;
  190.  
  191.         # Delete conversation
  192.         $sms->delete;
  193.     }
  194.  
  195.     # loop through voicemail messages
  196.     foreach my $vm ($g->voicemail) {
  197.  
  198.         # Name, number, and transcribed text
  199.         print $vm->name . "\n";
  200.         print $vm->meta->{phoneNumber} . "\n";
  201.         print $vm->text . "\n";
  202.  
  203.         # Download mp3
  204.         $vm->download->move_to($vm->id . '.mp3');
  205.  
  206.         # Delete
  207.         $vm->delete;
  208.     }
  209.  
  210. =head1 METHODS
  211.  
  212. =head2 new
  213.  
  214. Create object
  215.  
  216. =head2 login
  217.  
  218. Login.  Returns object on success, false on failure.
  219.  
  220. =head2 call
  221.  
  222. Connect two phone numbers
  223.  
  224. =head2 send_sms
  225.  
  226. Send SMS message.  Returns true/false.
  227.  
  228. =head2 sms
  229.  
  230. List of SMS messages
  231.  
  232. =head2 voicemail
  233.  
  234. List of voicemail messages
  235.  
  236. =head2 recorded
  237.  
  238. List of recorded calls
  239.  
  240. =head2 placed
  241.  
  242. List of placed calls
  243.  
  244. =head2 received
  245.  
  246. List of placed calls
  247.  
  248. =head2 missed
  249.  
  250. List of missed calls
  251.  
  252. =head2 starred
  253.  
  254. List of starred items (call, sms, or voicemail)
  255.  
  256. =head2 spam
  257.  
  258. List of items marked as spam (call, sms, or voicemail)
  259.  
  260. =head2 all
  261.  
  262. List of all items (call, sms, or voicemail)
  263.  
  264. =head1 SEE ALSO
  265.  
  266. L<Mojo::UserAgent>, L<Mojo::DOM>
  267.  
  268. =head1 DEVELOPMENT
  269.  
  270. L<http://github.com/tempire/perl-google-voice>
  271.  
  272. =head1 AUTHOR
  273.  
  274. Glen Hinkle tempire@cpan.org
  275.  
  276. =head1 CREDITS
  277.  
  278. David Jones
  279.  
  280. Graham Forest
  281.  
  282. =cut
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement