Skip to content

AnyEvent::Chromi - Control Google Chrome from Perl

License

Notifications You must be signed in to change notification settings

open-ch/AnyEvent-Chromi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NAME

AnyEvent::Chromi - Remotely control Google Chrome from Perl

SYNOPSIS

# Start in client mode (need "chromix-server" or examples/server.pl)
my $chromi AnyEvent::Chromi->new(mode => 'client', on_connect => sub {
    my ($chromi) = @_;
    ...
    $chromi->call(...);
});

# Start in server mode
my $chromi AnyEvent::Chromi->new(mode => 'server');

DESCRIPTION

AnyEvent::Chromi allows you to remotely control Google Chrome from a Perl script. It requires the Chromi extension https://github.com/smblott-github/chromi, which exposes all of the Chrome Extensions API via a websocket connection.

METHODS

  • $chromi = AnyEvent::Chromi->new(mode => ..., on_connect => ...);

    • mode => 'client|server'

      If 'server' (default), it will start a websocket server on port 7441 and wait for the connection from Chrome (initiated by the Chromi extension). This is the most practical way to use AnyEvent::Chromi if you write a long-running script, because it doesn't require a separate daemon.

      If 'client', it will connect to port 7441 itself, expecting a websocket server, like the one provided by chromix-server, or by the examples/server.pl script.

    • port => N

      Use port N instead of 7441.

    • on_connect => sub { my ($chromi) = @_; ... }

      Will be executed as soon as Chrome connects (in server mode), or as the connection to the websocket server is done.

  • $chromi->call($method, $args, $cb)

    Call the Chrome extension method $method, e.g. chrome.windows.getAll.

    $args is expected to be a ARRAYREF with the arguments for the method. It will be converted to JSON by AnyEvent::Chromi.

    $cb is a callback for when the reply is received. The first argument to the callback is the status (either "done" or "error"), and the second is a ARRAYREF with the data.

    Note: you need to make sure that the JSON::XS serialization is generating the proper data types. This is particularly important for booleans, where Types::Serialiser::true and Types::Serialiser::false can be used.

  • $chromi->is_connected

    In server mode: returns true if Chrome is connected and awaits commands.

    In client mode: returns true if connected to chromix-server.

EXAMPLES

  • List all tabs

      $chromi->call(
          'chrome.windows.getAll', [{ populate => Types::Serialiser::true }],
          sub {
              my ($status, $reply) = @_;
              $status eq 'done' or return;
              defined $reply and ref $reply eq 'ARRAY' or return;
              map { say "$_->{url}" } @{$reply->[0]{tabs}};
              $cv->send();
          }
    
  • Focus a tab

      $chromi->call(
          'chrome.tabs.update', [$tab_id, { active => Types::Serialiser::true }],
      );
    

See also the "examples" directory:

  • examples/client.pl

    Lists the URLs of all tabs. Requires chromix-server

  • examples/server.pl

    chromix-server replacement written in Perl. Additionally to chromix-server, it also properly supports multiple clients with one or more chrome instances.

AUTHOR

David Schweikert <[email protected]>, heavily influenced by Chromi/Chromix by Stephen Blott.

SEE ALSO

About

AnyEvent::Chromi - Control Google Chrome from Perl

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages