From 4a5d988d8c15cfe9263b23458a8f0a129beee014 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Mon, 18 Dec 2017 02:59:11 +0100 Subject: [PATCH] Implement search API (fixes #929) --- doc/api.md | 18 ++++++++++++++ include/api.php | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/doc/api.md b/doc/api.md index 159bc69914..3c5cd0b7be 100644 --- a/doc/api.md +++ b/doc/api.md @@ -449,6 +449,24 @@ It shows all direct answers (excluding the original post) to a given id. Friendica doesn't allow showing followers of other users. +--- +### search (*; AUTH) +#### Parameters +* q: search query +* page: the page number (starting at 1) to return +* rpp: the number of statuses to return per page +* count: alias for the rpp parameter +* since_id: returns statuses with ids greater than the given id +* max_id: returns statuses with ids lower or equal to the given id + +#### Unsupported parameters +* geocode +* lang +* locale +* result_type +* until +* include_entities + --- ### users/search (*) #### Parameters diff --git a/include/api.php b/include/api.php index 2aa8fc645c..9cc82560d2 100644 --- a/include/api.php +++ b/include/api.php @@ -1485,6 +1485,71 @@ function api_users_search($type) /// @TODO move to top of file or somewhere better api_register_func('api/users/search', 'api_users_search'); +/** + * Returns statuses that match a specified query. + * + * @see https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets + * + * @param string $type Return format: json, xml, atom, rss + * + * @return array|string + * @throws UnauthorizedException + * @throws BadRequestException + */ +function api_search($type) +{ + $data = array(); + + if (x($_REQUEST, 'q')) { + if (x($_REQUEST, 'rpp')) { + $count = $_REQUEST['rpp']; + } elseif (x($_REQUEST, 'count')) { + $count = $_REQUEST['count']; + } else { + $count = 15; + } + + $since_id = (x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0); + $max_id = (x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0); + $page = (x($_REQUEST, 'page') ? $_REQUEST['page'] - 1 : 0); + + $start = $page * $count; + + if ($max_id > 0) { + $sql_extra .= ' AND `item`.`id` <= ' . intval($max_id); + } + + $r = q( + "SELECT %s + FROM `item` %s + WHERE %s AND (`item`.`uid` = 0 OR (`item`.`uid` = %s AND NOT `item`.`global`)) + AND `item`.`body` REGEXP '%s' + $sql_extra + AND `item`.`id`>%d + GROUP BY `item`.`uri`, `item`.`id` + ORDER BY `item`.`id` DESC LIMIT %d ,%d ", + item_fieldlists(), + item_joins(), + item_condition(), + intval(local_user()), + dbesc(protect_sprintf(preg_quote($_REQUEST['q']))), + intval($since_id), + intval($start), + intval($count) + ); + + $data['status'] = api_format_items($r, api_get_user(get_app())); + } else { + throw new BadRequestException("q parameter is required."); + } + + return api_format_data("statuses", $type, $data); +} + +/// @TODO move to top of file or somewhere better +api_register_func('api/search/tweets', 'api_search', true); +api_register_func('api/search', 'api_search', true); + /** * * http://developer.twitter.com/doc/get/statuses/home_timeline -- 2.39.5