Initial release of the Unifi API Client
This commit is contained in:
commit
8ce264b2a0
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
.idea
|
||||
/examples/config.php
|
||||
/composer.lock
|
||||
/vendor
|
19
LICENSE
Normal file
19
LICENSE
Normal file
|
@ -0,0 +1,19 @@
|
|||
Copyright (c) 2015 Joris van de Sande, https://github.com/jorisvandesande
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
54
README.md
Normal file
54
README.md
Normal file
|
@ -0,0 +1,54 @@
|
|||
Unifi API Client
|
||||
================
|
||||
|
||||
Unifi API Client can be used to connect to the API of your [Ubiquiti Unifi Controller](https://www.ubnt.com/enterprise/software/).
|
||||
This client is build on top of [Guzzle](http://guzzlephp.org/).
|
||||
|
||||
The code is tested against Unifi Controller version 4.6.6.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
The API client can be installed with [Composer](https://getcomposer.org/):
|
||||
|
||||
composer require jorisvandesande/unifi-api-client
|
||||
|
||||
Or you can download the latest release at:
|
||||
https://github.com/jorisvandesande/unifi-api-client/releases
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
```php
|
||||
use JVDS\UnifiApiClient\Client;
|
||||
use GuzzleHttp\Client as HttpClient;
|
||||
|
||||
$apiClient = new Client(new HttpClient(['base_uri' => 'https://127.0.0.1:8443']));
|
||||
$apiClient->login('your_username', 'your_password');
|
||||
|
||||
// call supported methods via methods on the client
|
||||
$apiClient->statistics('default');
|
||||
|
||||
// or call any API url via the get and post methods:
|
||||
$apiClient->get('/api/self');
|
||||
$apiClient->post('/api/s/default/cmd/stamgr', ['cmd' => 'block-sta', 'mac':'01:01:01:01:01:01'])
|
||||
|
||||
// logout
|
||||
$apiClient->login('your_username', 'your_password');
|
||||
```
|
||||
|
||||
Examples can be found in the [examples](examples) directory. To run the examples, you must
|
||||
copy the config.example.php file to config.php and change the configuration to your needs.
|
||||
|
||||
Supported API calls
|
||||
-------------------
|
||||
|
||||
At the moment only a few API methods are implemented in the Client. Altough it is possible to use
|
||||
the ```get()``` and ```post()``` methods of the Client to call any API url, the goal is to
|
||||
support more methods.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
MIT Licensed, see the [LICENSE](LICENSE) file.
|
32
composer.json
Normal file
32
composer.json
Normal file
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"name": "jorisvandesande/unifi-api-client",
|
||||
"type": "library",
|
||||
"description": "Unifi API Client can be used to connect to the API of your Ubiquiti Unifi Controller",
|
||||
"keywords": ["unifi", "ubiquiti", "api client", "api", "unifi controller", "client"],
|
||||
"homepage": "https://github.com/jorisvandesande/unifi-api-client",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Joris van de Sande",
|
||||
"email": "joris@vandesande.link",
|
||||
"homepage": "https://github.com/jorisvandesande"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.5.0",
|
||||
"guzzlehttp/guzzle": "~6.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"JVDS\\UnifiApiClient\\": "src/"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0-dev"
|
||||
}
|
||||
},
|
||||
"archive": {
|
||||
"exclude": ["/examples"]
|
||||
}
|
||||
}
|
28
examples/README.md
Normal file
28
examples/README.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
Examples
|
||||
========
|
||||
|
||||
To run the examples, you must copy the config.example.php file to config.php
|
||||
and change the configuration to your needs.
|
||||
|
||||
statistics.php
|
||||
--------------
|
||||
|
||||
Fetches the client statistics for a given site.
|
||||
|
||||
php statistics.php
|
||||
|
||||
authorize-guest.php
|
||||
-------------------
|
||||
|
||||
Authorizes a guest (mac address) for x minutes.
|
||||
You need to login with a user that has full access to the Unifi controller.
|
||||
|
||||
php authorize-guest.php
|
||||
|
||||
unauthorize-guest.php
|
||||
---------------------
|
||||
|
||||
Unauthorize a guest (mac address).
|
||||
You need to login with a user that has full access to the Unifi controller.
|
||||
|
||||
php unauthorize-guest.php
|
35
examples/authorize-guest.php
Normal file
35
examples/authorize-guest.php
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$config = require 'config.php';
|
||||
|
||||
use JVDS\UnifiApiClient\Client;
|
||||
use GuzzleHttp\Client as HttpClient;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
|
||||
$apiClient = new Client(new HttpClient(['base_uri' => $config['base_uri']]));
|
||||
|
||||
try {
|
||||
|
||||
// login to the unifi controller API
|
||||
$apiClient->login($config['username'], $config['password']);
|
||||
|
||||
// Authorize guest with mac address 01:01:01:01:01:01 for 60 minutes
|
||||
// You need a user with full access to the unifi controller for this call!
|
||||
$responseBody = $apiClient->authorizeGuest($config['site'], '01:01:01:01:01:01', 60);
|
||||
|
||||
print_r(json_decode($responseBody));
|
||||
|
||||
$apiClient->logout();
|
||||
|
||||
} catch (RequestException $e) {
|
||||
echo $e->getMessage() . PHP_EOL;
|
||||
|
||||
echo '----- Request ------' . PHP_EOL;
|
||||
echo $e->getRequest()->getBody()->getContents();
|
||||
echo PHP_EOL;
|
||||
|
||||
echo '----- Response ------' . PHP_EOL;
|
||||
echo $e->hasResponse() ? $e->getResponse()->getBody()->getContents() : '- no response -';
|
||||
echo PHP_EOL;
|
||||
}
|
11
examples/config.example.php
Normal file
11
examples/config.example.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
return [
|
||||
// The base uri of your Unifi controller
|
||||
'base_uri' => 'https://127.0.0.1:8443',
|
||||
// Your username (You should create a user with read only access to the Unifi controller)
|
||||
'username' => '',
|
||||
// Your password
|
||||
'password' => '',
|
||||
// The site name to run the examples against
|
||||
'site' => 'default'
|
||||
];
|
37
examples/device-statistics.php
Normal file
37
examples/device-statistics.php
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$config = require 'config.php';
|
||||
|
||||
use JVDS\UnifiApiClient\Client;
|
||||
use GuzzleHttp\Client as HttpClient;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
|
||||
$apiClient = new Client(new HttpClient(['base_uri' => $config['base_uri']]));
|
||||
|
||||
try {
|
||||
|
||||
// login to the unifi controller API
|
||||
$apiClient->login($config['username'], $config['password']);
|
||||
|
||||
// Fetch device statistics for the given site
|
||||
$responseBody = $apiClient
|
||||
->deviceStatistics($config['site'])
|
||||
->getBody()
|
||||
->getContents();
|
||||
|
||||
print_r(json_decode($responseBody, true));
|
||||
|
||||
$apiClient->logout();
|
||||
|
||||
} catch (RequestException $e) {
|
||||
echo $e->getMessage() . PHP_EOL;
|
||||
|
||||
echo '----- Request ------' . PHP_EOL;
|
||||
echo $e->getRequest()->getBody()->getContents();
|
||||
echo PHP_EOL;
|
||||
|
||||
echo '----- Response ------' . PHP_EOL;
|
||||
echo $e->hasResponse() ? $e->getResponse()->getBody()->getContents() : '- no response -';
|
||||
echo PHP_EOL;
|
||||
}
|
37
examples/statistics.php
Normal file
37
examples/statistics.php
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$config = require 'config.php';
|
||||
|
||||
use JVDS\UnifiApiClient\Client;
|
||||
use GuzzleHttp\Client as HttpClient;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
|
||||
$apiClient = new Client(new HttpClient(['base_uri' => $config['base_uri']]));
|
||||
|
||||
try {
|
||||
|
||||
// login to the unifi controller API
|
||||
$apiClient->login($config['username'], $config['password']);
|
||||
|
||||
// Fetch statistics for the given site
|
||||
$responseBody = $apiClient
|
||||
->statistics($config['site'])
|
||||
->getBody()
|
||||
->getContents();
|
||||
|
||||
print_r(json_decode($responseBody));
|
||||
|
||||
$apiClient->logout();
|
||||
|
||||
} catch (RequestException $e) {
|
||||
echo $e->getMessage() . PHP_EOL;
|
||||
|
||||
echo '----- Request ------' . PHP_EOL;
|
||||
echo $e->getRequest()->getBody()->getContents();
|
||||
echo PHP_EOL;
|
||||
|
||||
echo '----- Response ------' . PHP_EOL;
|
||||
echo $e->hasResponse() ? $e->getResponse()->getBody()->getContents() : '- no response -';
|
||||
echo PHP_EOL;
|
||||
}
|
35
examples/unauthorize-guest.php
Normal file
35
examples/unauthorize-guest.php
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$config = require 'config.php';
|
||||
|
||||
use JVDS\UnifiApiClient\Client;
|
||||
use GuzzleHttp\Client as HttpClient;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
|
||||
$apiClient = new Client(new HttpClient(['base_uri' => $config['base_uri']]));
|
||||
|
||||
try {
|
||||
|
||||
// login to the unifi controller API
|
||||
$apiClient->login($config['username'], $config['password']);
|
||||
|
||||
// Revoke authorization for guest with mac address 01:01:01:01:01:01
|
||||
// You need a user with full access to the unifi controller for this call!
|
||||
$responseBody = $apiClient->unauthorizeGuest($config['site'], '01:01:01:01:01:01');
|
||||
|
||||
print_r(json_decode($responseBody));
|
||||
|
||||
$apiClient->logout();
|
||||
|
||||
} catch (RequestException $e) {
|
||||
echo $e->getMessage() . PHP_EOL;
|
||||
|
||||
echo '----- Request ------' . PHP_EOL;
|
||||
echo $e->getRequest()->getBody()->getContents();
|
||||
echo PHP_EOL;
|
||||
|
||||
echo '----- Response ------' . PHP_EOL;
|
||||
echo $e->hasResponse() ? $e->getResponse()->getBody()->getContents() : '- no response -';
|
||||
echo PHP_EOL;
|
||||
}
|
202
src/Client.php
Normal file
202
src/Client.php
Normal file
|
@ -0,0 +1,202 @@
|
|||
<?php
|
||||
|
||||
namespace JVDS\UnifiApiClient;
|
||||
|
||||
use GuzzleHttp\ClientInterface;
|
||||
use GuzzleHttp\Cookie\CookieJar;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
|
||||
/**
|
||||
* Unifi controller API client.
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* use JVDS\UnifiApiClient\Client;
|
||||
* use GuzzleHttp\Client as HttpClient;
|
||||
*
|
||||
* $apiClient = new Client(new HttpClient(['base_uri' => 'https://127.0.0.1:8443']));
|
||||
* $apiClient->login('your_username', 'your_password');
|
||||
* $apiClient->statistics('default'); // fetch statistics for default site
|
||||
* </code>
|
||||
*
|
||||
* Unifi controllers come with a self signed certificate by default.
|
||||
* To verify that you're connecting to your own unifi controller,
|
||||
* you should download your controller's certificate.
|
||||
* And the verify option should be set to the path of the downloaded certificate:
|
||||
*
|
||||
* <code>
|
||||
* use JVDS\UnifiApiClient\Client;
|
||||
* use GuzzleHttp\Client as HttpClient;
|
||||
*
|
||||
* $apiClient = new Client(
|
||||
* new HttpClient(['base_uri' => 'https://127.0.0.1:8443']),
|
||||
* ['verify' => '/your/unifi/cert.pem']
|
||||
* );
|
||||
* $apiClient->login('your_username', 'your_password');
|
||||
* </code>
|
||||
*
|
||||
* It is also possible to use your own certificate in the unifi controller.
|
||||
* More information about this is available at: http://wiki.ubnt.com/UniFi_FAQ#Custom_SSL_certificate
|
||||
*
|
||||
* @author Joris van de Sande
|
||||
*/
|
||||
class Client
|
||||
{
|
||||
/**
|
||||
* @var ClientInterface|null
|
||||
*/
|
||||
private $client;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $requestOptions;
|
||||
|
||||
/**
|
||||
* @param ClientInterface $client
|
||||
* @param array $requestOptions Guzzle request options that will be sent with every request
|
||||
*
|
||||
* @link http://docs.guzzlephp.org/en/latest/request-options.html
|
||||
*/
|
||||
public function __construct(ClientInterface $client, array $requestOptions = [])
|
||||
{
|
||||
$this->client = $client;
|
||||
$this->requestOptions = $this->getRequestOptions($requestOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Login to the Unifi controller.
|
||||
* You need to login before you can make other api requests.
|
||||
*
|
||||
* @param string $username username
|
||||
* @param string $password password
|
||||
*
|
||||
* @throws GuzzleException in case of a login failure.
|
||||
*/
|
||||
public function login($username, $password)
|
||||
{
|
||||
$this->post(
|
||||
'/api/login',
|
||||
['username' => $username, 'password' => $password, 'strict' => true]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws GuzzleException in case of a failure.
|
||||
*/
|
||||
public function logout()
|
||||
{
|
||||
$this->client->request('get', '/logout', ['allow_redirects' => false] + $this->requestOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $site
|
||||
*
|
||||
* @return ResponseInterface
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function statistics($site)
|
||||
{
|
||||
return $this->get('/api/s/' . $site . '/stat/sta');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $site
|
||||
*
|
||||
* @return ResponseInterface
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function deviceStatistics($site)
|
||||
{
|
||||
return $this->get('/api/s/' . $site. '/stat/device');
|
||||
}
|
||||
|
||||
/**
|
||||
* Authorize a guest by mac address.
|
||||
*
|
||||
* @param string $site
|
||||
* @param string $mac the mac address of the guest to authorize.
|
||||
* @param int $minutes number of minutes to authorize guest.
|
||||
* @param array $data associative array with extra data, i.e. up (kbps), down (kbps), bytes (MB)
|
||||
*
|
||||
* @return ResponseInterface
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function authorizeGuest($site, $mac, $minutes, array $data = [])
|
||||
{
|
||||
return $this->post(
|
||||
'/api/s/' . $site . '/cmd/stamgr',
|
||||
[
|
||||
'cmd' => 'authorize-guest',
|
||||
'mac' => $mac,
|
||||
'minutes' => $minutes
|
||||
] + $data
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unauthorize a guest by mac address.
|
||||
*
|
||||
* @param string $site
|
||||
* @param string $mac
|
||||
*
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function unauthorizeGuest($site, $mac)
|
||||
{
|
||||
|
||||
return $this->post(
|
||||
'/api/s/' . $site . '/cmd/stamgr',
|
||||
[
|
||||
'cmd' => 'unauthorize-guest',
|
||||
'mac' => $mac
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $url (relative) url to the api endpoint
|
||||
* @param array $data data to be sent with the request.
|
||||
*
|
||||
* @return ResponseInterface
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function post($url, array $data = [])
|
||||
{
|
||||
return $this->client->request(
|
||||
'post',
|
||||
$url,
|
||||
['json' => $data] + $this->requestOptions
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $url
|
||||
* @param array $data
|
||||
*
|
||||
* @return ResponseInterface
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function get($url, array $data = [])
|
||||
{
|
||||
$requestOptions = $this->requestOptions;
|
||||
|
||||
if ($data) {
|
||||
$requestOptions['query'] = $data;
|
||||
}
|
||||
|
||||
return $this->client->request('get', $url, $requestOptions);
|
||||
}
|
||||
|
||||
private function getRequestOptions(array $defaultRequestOptions)
|
||||
{
|
||||
return array_merge(
|
||||
[
|
||||
'cookies' => new CookieJar(),
|
||||
'verify' => false
|
||||
],
|
||||
$defaultRequestOptions
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user