diff --git a/doc/api.md b/doc/api.md index ba8625a44f..9dfd39ae27 100644 --- a/doc/api.md +++ b/doc/api.md @@ -462,6 +462,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 9c64b4a3cf..0e2954c7ea 100644 --- a/include/api.php +++ b/include/api.php @@ -1485,6 +1485,65 @@ 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')) { + throw new BadRequestException("q parameter is required."); + } + + 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 = dba::p( + "SELECT ".item_fieldlists()." + FROM `item` ".item_joins()." + WHERE ".item_condition()." AND (`item`.`uid` = 0 OR (`item`.`uid` = ? AND NOT `item`.`global`)) + AND `item`.`body` LIKE CONCAT('%',?,'%') + $sql_extra + AND `item`.`id`>? + ORDER BY `item`.`id` DESC LIMIT ".intval($start)." ,".intval($count)." ", + api_user(), + $_REQUEST['q'], + $since_id + ); + + $data['status'] = api_format_items(dba::inArray($r), api_get_user(get_app())); + + 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