mirror of
https://github.com/YGGverse/YGGo.git
synced 2025-02-03 10:25:52 +00:00
implement basic api
This commit is contained in:
parent
81cb970248
commit
9916fb701f
36
README.md
36
README.md
@ -53,6 +53,41 @@ sphinxsearch
|
||||
* * * * * cd /YGGo/crontab && php crawler.php > /dev/null 2>&1
|
||||
```
|
||||
|
||||
#### API
|
||||
|
||||
JSON interface to build third party applications / distributed index sharing.
|
||||
Could be enabled or disabled by API_ENABLED option
|
||||
|
||||
Address
|
||||
|
||||
```
|
||||
/api.php
|
||||
```
|
||||
|
||||
##### Search API
|
||||
|
||||
Returns search results.
|
||||
Could be enabled or disabled by API_SEARCH_ENABLED option
|
||||
|
||||
###### Request attributes
|
||||
|
||||
```
|
||||
GET action=search
|
||||
GET query={string} - search request, empty if not provided
|
||||
GET page={int} - search results page, 1 if not provided
|
||||
```
|
||||
|
||||
##### Hosts distribution API
|
||||
|
||||
Returns node hosts collected with fields provided in API_HOSTS_FIELDS settings.
|
||||
Could be enabled or disabled by API_HOSTS_ENABLED option
|
||||
|
||||
###### Request attributes
|
||||
|
||||
```
|
||||
GET action=hosts
|
||||
```
|
||||
|
||||
#### Roadmap / ideas
|
||||
|
||||
* [x] Web pages full text ranking search
|
||||
@ -66,6 +101,7 @@ sphinxsearch
|
||||
* [ ] Implement smart queue algorithm that indexing new sites homepage in higher priority
|
||||
* [ ] Implement database auto backup on crawl process completing
|
||||
* [x] Add transactions to prevent data loss on DB crashes
|
||||
* [x] JSON API
|
||||
* [ ] Distributed index data sharing between the nodes trough service API
|
||||
* [x] An idea to make unique gravatars for sites without favicons, because simpler to ident, comparing to ipv6
|
||||
* [ ] An idea to make some visitors counters, like in good old times?
|
||||
|
@ -146,4 +146,13 @@ define('CLEAN_HOST_LIMIT', 20);
|
||||
* or the cleaner can stuck in queue
|
||||
*
|
||||
*/
|
||||
define('CLEAN_HOST_SECONDS_OFFSET', 3600);
|
||||
define('CLEAN_HOST_SECONDS_OFFSET', 3600);
|
||||
|
||||
// API settings
|
||||
define('API_ENABLED', true);
|
||||
|
||||
define('API_SEARCH_ENABLED', true);
|
||||
define('API_SEARCH_PAGINATION_RESULTS_LIMIT', 20);
|
||||
|
||||
define('API_HOSTS_ENABLED', true);
|
||||
define('API_HOSTS_FIELDS', '`scheme`,`name`,`port`,`crawlPageLimit`,`robots`,`robotsPostfix`,`timeAdded`,`timeUpdated`'); // string: *|field names comma separated
|
@ -29,6 +29,15 @@ class MySQL {
|
||||
}
|
||||
|
||||
// Host
|
||||
public function getAPIHosts(string $apiHostFields) {
|
||||
|
||||
$query = $this->_db->prepare('SELECT ' . $apiHostFields . ' FROM `host`');
|
||||
|
||||
$query->execute();
|
||||
|
||||
return $query->fetchAll();
|
||||
}
|
||||
|
||||
public function getHost(int $crc32url) {
|
||||
|
||||
$query = $this->_db->prepare('SELECT * FROM `host` WHERE `crc32url` = ? LIMIT 1');
|
||||
|
86
public/api.php
Normal file
86
public/api.php
Normal file
@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
// Load system dependencies
|
||||
require_once('../config/app.php');
|
||||
require_once('../library/curl.php');
|
||||
require_once('../library/robots.php');
|
||||
require_once('../library/filter.php');
|
||||
require_once('../library/parser.php');
|
||||
require_once('../library/mysql.php');
|
||||
require_once('../library/sphinxql.php');
|
||||
|
||||
if (!API_ENABLED) {
|
||||
|
||||
$response = [
|
||||
'status' => false,
|
||||
'message' => _('API requests disabled by the node owner.'),
|
||||
];
|
||||
}
|
||||
|
||||
// Action
|
||||
switch (!empty($_GET['action']) ? $_GET['action'] : false) {
|
||||
|
||||
// Search API
|
||||
case 'search';
|
||||
|
||||
// Connect database
|
||||
$db = new MySQL(DB_HOST, DB_PORT, DB_NAME, DB_USERNAME, DB_PASSWORD);
|
||||
|
||||
// Connect Sphinx search server
|
||||
$sphinx = new SphinxQL(SPHINX_HOST, SPHINX_PORT);
|
||||
|
||||
|
||||
// Filter request data
|
||||
$query = !empty($_GET['query']) ? Filter::url($_GET['query']) : '';
|
||||
$page = !empty($_GET['page']) ? Filter::url($_GET['page']) : 1;
|
||||
|
||||
// Make search request
|
||||
$sphinxResults = $sphinx->searchHostPages('"' . $query . '"', $page * API_SEARCH_PAGINATION_RESULTS_LIMIT - API_SEARCH_PAGINATION_RESULTS_LIMIT, API_SEARCH_PAGINATION_RESULTS_LIMIT);
|
||||
$sphinxResultsTotal = $sphinx->searchHostPagesTotal('"' . $query . '"');
|
||||
|
||||
// Generate results
|
||||
$dbResults = [];
|
||||
|
||||
foreach ($sphinxResults as $sphinxResult) {
|
||||
|
||||
if ($hostPage = $db->getFoundHostPage($sphinxResult->id)) {
|
||||
|
||||
$dbResults[] = $hostPage;
|
||||
}
|
||||
}
|
||||
|
||||
// Make response
|
||||
$response = [
|
||||
'status' => true,
|
||||
'totals' => $sphinxResultsTotal,
|
||||
'result' => $dbResults,
|
||||
];
|
||||
|
||||
break;
|
||||
|
||||
// Host API
|
||||
case 'hosts';
|
||||
|
||||
// Connect database
|
||||
$db = new MySQL(DB_HOST, DB_PORT, DB_NAME, DB_USERNAME, DB_PASSWORD);
|
||||
|
||||
$response = [
|
||||
'status' => true,
|
||||
'totals' => $db->getTotalHosts(),
|
||||
'result' => $db->getAPIHosts(API_HOSTS_FIELDS),
|
||||
];
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
$response = [
|
||||
'status' => false,
|
||||
'message' => _('Undefined API action request.'),
|
||||
];
|
||||
}
|
||||
|
||||
// Output
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
echo json_encode($response);
|
Loading…
x
Reference in New Issue
Block a user