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
andTypes::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 <david@schweikert.ch>, heavily influenced by Chromi/Chromix by Stephen Blott.