Trang này cung cấp thông tin về từng điểm cuối có sẵn thông qua Tenor API. Đối với mỗi điểm cuối, trang này cung cấp những thông tin sau:
- URL cơ sở cần sử dụng
- Các phương pháp hay nhất cần tuân thủ
- Các tham số có sẵn
- Định dạng phản hồi
- Ví dụ về các yêu cầu bằng từng ngôn ngữ
Tìm kiếm
URL cơ sở
https://tenor.googleapis.com/v2/search?<parameters>
Nhận một đối tượng JSON chứa danh sách các GIF phù hợp nhất cho một nhóm từ khoá tìm kiếm, danh mục, biểu tượng cảm xúc hoặc bất kỳ tổ hợp nào của các thành phần này.
Khi bạn thêm tham số URL searchfilter=sticker
vào yêu cầu, điểm cuối tìm kiếm của Tenor sẽ trả về hình dán thay vì GIF. Đối tượng phản hồi trong các phản hồi tìm kiếm hình dán bao gồm định dạng trong suốt trong trường media_formats
.
Để trả về kết quả theo thứ tự ngẫu nhiên thay vì theo mức độ liên quan, hãy thêm tham số URL random=true
.
Các phương pháp hay nhất
- Để phân biệt các hoạt động tích hợp, hãy cung cấp một tham số
client_key
cùng vớikey
của API. - Cung cấp cụm từ tìm kiếm của người dùng khi họ nhập, bao gồm cả dấu câu và ký tự đặc biệt.
- Khi người dùng quyết định chia sẻ GIF hoặc hình dán nào, bạn cũng nên thêm một lệnh gọi tương ứng đến điểm cuối Register Share (Đăng ký chia sẻ). Lệnh gọi không bắt buộc này giúp AI của Công cụ tìm kiếm của Tenor điều chỉnh kết quả.
- Để kiểm soát số lượng và luồng GIF được trả về, hãy sử dụng các tham số
limit
vàpos
. Ví dụ: bạn có thể đặtlimit = 10
cho kết quả tìm kiếm ban đầu của người dùng và tải bản xem trước của những ảnh GIF đó để người dùng duyệt xem. Nếu người dùng yêu cầu thêm kết quả, hãy thu thập 10 kết quả tiếp theo bằng cách thực hiện cùng một lệnh gọi API nhưng đặtpos
thành giá trị của trườngnext
trong phản hồi ban đầu. Bạn có thể sử dụng mẫu này để tạo trải nghiệm tải từng phần mượt mà. Điều này giúp giảm mức sử dụng băng thông và rút ngắn thời gian phản hồi cho người dùng, vì ít ảnh GIF xem trước cần được tải song song hơn ở phía máy khách. - Để duy trì mức phân loại nội dung an toàn nội bộ cho ảnh GIF được trả về, hãy sử dụng tham số
ContentFilter
. Giá trị mặc định làoff
. - Để giảm số lượng định dạng nội dung được trả về, hãy sử dụng tham số
media_filter
. Điều này có thể giảm kích thước Đối tượng phản hồi xuống hơn 70%.
Thông số
Bảng sau đây cung cấp thông tin chi tiết về các tham số cho điểm cuối Tìm kiếm:
Thông số | |
---|---|
key |
Bắt buộc
Khoá API để có quyền truy cập đặc biệt Không có giá trị mặc định. |
q |
Bắt buộc
Một chuỗi tìm kiếm Không có giá trị mặc định. |
client_key |
Strongly recommended (Rất nên dùng)
Một chuỗi do ứng dụng chỉ định, đại diện cho hoạt động tích hợp. Khoá ứng dụng cho phép bạn sử dụng cùng một khoá API trên nhiều hoạt động tích hợp nhưng vẫn có thể phân biệt chúng. Đối với một hoạt động tích hợp ứng dụng, hãy sử dụng cùng một giá trị Mọi hành vi tuỳ chỉnh của ứng dụng sẽ được kích hoạt bằng cách ghép nối các tham số Không có giá trị mặc định. |
searchfilter |
Không bắt buộc
Danh sách các loại nội dung không phải GIF được phân tách bằng dấu phẩy để lọc Đối tượng phản hồi. Theo mặc định, Không có giá trị mặc định. Các giá trị được chấp nhận là
|
country |
Strongly recommended (Rất nên dùng)
Chỉ định quốc gia xuất xứ của yêu cầu. Để làm như vậy, hãy cung cấp mã quốc gia gồm 2 chữ cái theo tiêu chuẩn ISO 3166-1. Giá trị mặc định là |
locale |
Strongly recommended (Rất nên dùng)
Chỉ định ngôn ngữ mặc định để diễn giải chuỗi tìm kiếm. Bạn có thể dùng mã quốc gia mà bạn cung cấp trong Giá trị mặc định là |
contentfilter |
Strongly recommended (Rất nên dùng)
Chỉ định cấp độ bộ lọc an toàn nội dung. Giá trị mặc định là |
media_filter |
Strongly recommended (Rất nên dùng)
Danh sách các định dạng GIF được phân tách bằng dấu phẩy để lọc Đối tượng phản hồi. Theo mặc định, Ví dụ: Không có giá trị mặc định. |
ar_range |
Strongly recommended (Rất nên dùng)
Lọc Đối tượng phản hồi để chỉ bao gồm những ảnh GIF có tỷ lệ khung hình phù hợp với phạm vi đã chọn. Giá trị mặc định là
|
random |
Không bắt buộc
Chỉ định xem có sắp xếp ngẫu nhiên câu trả lời hay không. Giá trị mặc định là Các giá trị được chấp nhận là |
limit |
Không bắt buộc
Tìm nạp tối đa số lượng kết quả được chỉ định. Giá trị mặc định là |
pos |
Không bắt buộc
Truy xuất kết quả bắt đầu tại vị trí "value". Sử dụng một giá trị khác 0 và không trống từ Không có giá trị mặc định. |
Định dạng phản hồi
Bảng sau đây cung cấp thông tin chi tiết về định dạng phản hồi cho điểm cuối Tìm kiếm:
Khoá | |
---|---|
next |
Một giá trị nhận dạng vị trí để sử dụng với truy vấn API tiếp theo, thông qua trường |
results |
Một mảng Đối tượng phản hồi chứa nội dung phù hợp nhất cho cụm từ tìm kiếm được yêu cầu. Nội dung được sắp xếp theo thứ hạng mức độ liên quan. |
Ví dụ về yêu cầu
Curl
/* search for excited top 8 GIFs */ curl "https://tenor.googleapis.com/v2/search?q=excited&key=API_KEY&client_key=my_test_app&limit=8"
Python
# set the apikey and limit apikey = "API_KEY" # click to set to your apikey lmt = 8 ckey = "my_test_app" # set the client_key for the integration and use the same value for all API calls # our test search search_term = "excited" # get the top 8 GIFs for the search term r = requests.get( "https://tenor.googleapis.com/v2/search?q=%s&key=%s&client_key=%s&limit=%s" % (search_term, apikey, ckey, lmt)) if r.status_code == 200: # load the GIFs using the urls for the smaller GIF sizes top_8gifs = json.loads(r.content) print(top_8gifs) else: top_8gifs = None
Android/Java
import android.app.Application; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; public class App extends Application { private static final String API_KEY = "API_KEY"; private static final String CLIENT_KEY = "my_test_app" private static final String LogTag = "TenorTest"; @Override public void onCreate() { super.onCreate(); new Thread() { @Override public void run() { final String searchTerm = "excited"; // make initial search request for the first 8 items JSONObject searchResult = getSearchResults(searchTerm, 8); // load the results for the user Log.v(LogTag, "Search Results: " + searchResult.toString()); } }.start(); } /** * Get Search Result GIFs */ public static JSONObject getSearchResults(String searchTerm, int limit) { // make search request - using default locale of EN_US final String url = String.format("https://tenor.googleapis.com/v2/search?q=%1$s&key=%2$s&client_key=%3$s&limit=%4$s", searchTerm, API_KEY, CLIENT_KEY, limit); try { return get(url); } catch (IOException | JSONException ignored) { } return null; } /** * Construct and run a GET request */ private static JSONObject get(String url) throws IOException, JSONException { HttpURLConnection connection = null; try { // Get request connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // Handle failure int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_CREATED) { String error = String.format("HTTP Code: '%1$s' from '%2$s'", statusCode, url); throw new ConnectException(error); } // Parse response return parser(connection); } catch (Exception ignored) { } finally { if (connection != null) { connection.disconnect(); } } return new JSONObject(""); } /** * Parse the response into JSONObject */ private static JSONObject parser(HttpURLConnection connection) throws JSONException { char[] buffer = new char[1024 * 4]; int n; InputStream stream = null; try { stream = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while (-1 != (n = reader.read(buffer))) { writer.write(buffer, 0, n); } return new JSONObject(writer.toString()); } catch (IOException ignored) { } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } return new JSONObject(""); } }
Swift 2.0+/iOS
let apikey = "API_KEY" let clientkey = "my_test_app" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { requestData() return true } /** Execute web request to retrieve the top GIFs returned (in batches of 8) for the given search term. */ func requestData() { // the test search term let searchTerm = "excited" // Define the results upper limit let limit = 8 // make initial search request for the first 8 items let searchRequest = URLRequest(url: URL(string: String(format: "https://tenor.googleapis.com/v2/search?q=%@&key=%@&client_key=%@&limit=%d", searchTerm, apikey, clientkey, limit))!) makeWebRequest(urlRequest: searchRequest, callback: tenorSearchHandler) // Data will be loaded by each request's callback } /** Async URL requesting function. */ func makeWebRequest(urlRequest: URLRequest, callback: @escaping ([String:AnyObject]) -> ()) { // Make the async request and pass the resulting JSON object to the callback let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in do { if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] { // Push the results to our callback callback(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } } task.resume() } /** Web response handler for search requests. */ func tenorSearchHandler(response: [String:AnyObject]) { // Parse the JSON response let responseGifs = response["results"]! // Load the GIFs into your view print("Result GIFS: (responseGifs)") } }
JavaScript
<!DOCTYPE html> <html> <script> // url Async requesting function function httpGetAsync(theUrl, callback) { // create the request object var xmlHttp = new XMLHttpRequest(); // set the state change callback to capture when the response comes in xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } } // open as a GET call, pass in the url and set async = True xmlHttp.open("GET", theUrl, true); // call send with no params as they were passed in on the url string xmlHttp.send(null); return; } // callback for the top 8 GIFs of search function tenorCallback_search(responsetext) { // Parse the JSON response var response_objects = JSON.parse(responsetext); top_10_gifs = response_objects["results"]; // load the GIFs -- for our example we will load the first GIFs preview size (nanogif) and share size (gif) document.getElementById("preview_gif").src = top_10_gifs[0]["media_formats"]["nanogif"]["url"]; document.getElementById("share_gif").src = top_10_gifs[0]["media_formats"]["gif"]["url"]; return; } // function to call the trending and category endpoints function grab_data() { // set the apikey and limit var apikey = "API_KEY"; var clientkey = "my_test_app"; var lmt = 8; // test search term var search_term = "excited"; // using default locale of en_US var search_url = "https://tenor.googleapis.com/v2/search?q=" + search_term + "&key=" + apikey +"&client_key=" + clientkey + "&limit=" + lmt; httpGetAsync(search_url,tenorCallback_search); // data will be loaded by each call's callback return; } // SUPPORT FUNCTIONS ABOVE // MAIN BELOW // start the flow grab_data(); </script> <body> <h2># 1 GIF loaded - preview image</h2> <img id="preview_gif" src="" alt="" style="width:220px;height:164px;"> <h2># 1 GIF loaded - share image</h2> <img id="share_gif" src="" alt="" style="width:498px;height:372px;"> </body> </html>
Objective-C
NSString *apiKey = @"API_KEY"; NSString *clientKey = @"my_test_app"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self requestData]; return YES; } /** Execute web request to retrieve the top GIFs returned(in batches of 8) for the given search term. */ -(void)requestData { // Define the results upper limit int limit = 8; // the test search term NSString *searchQuery = @"excited"; // Get the top 10 trending GIFs (updated through out the day) - using the default locale of en_US NSString *UrlString = [NSString stringWithFormat:@"https://tenor.googleapis.com/v2/search?key=%@&client_key=%@&q=%@&limit=%d", apiKey, clientKey, searchQuery, limit]; NSURL *searchUrl = [NSURL URLWithString:UrlString]; NSURLRequest *searchRequest = [NSURLRequest requestWithURL:searchUrl]; [self makeWebRequest:searchRequest withCallback:tenorSearchResultsHandler]; // Data will be loaded by each request's callback } /** Async URL requesting function. */ -(void)makeWebRequest:(NSURLRequest *)urlRequest withCallback:(void (^)(NSDictionary *))callback { // Make the async request and pass the resulting JSON object to the callback NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NStopGifsError *jsonError = nil; NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError]; if(jsonError != nil) { NSLog(@"%@", jsonError.localizedDescription); return; } // Push the results to our callback callback(jsonResult); }]; [task resume]; } /** Web response handler for searches. */ void (^tenorSearchResultsHandler)(NSDictionary *) = ^void(NSDictionary *response) { // Parse the JSON response NSDictionary *topGifs = response[@"results"]; // Load the GIFs into your view NSLog(@"Search Results: %@", topGifs); };
Nổi bật
URL cơ sở
https://tenor.googleapis.com/v2/featured?<parameters>
Nhận một đối tượng JSON chứa danh sách các GIF nổi bật toàn cầu hiện tại. Tenor cập nhật luồng phát nổi bật thường xuyên trong ngày.
Khi tham số URL searchfilter=sticker
được đưa vào yêu cầu, điểm cuối Nổi bật của Tenor sẽ trả về hình dán thay vì GIF. Trong các câu trả lời có nhãn dán nổi bật, Đối tượng phản hồi bao gồm các định dạng trong suốt trong trường media
.
Các phương pháp hay nhất
- Để phân biệt các hoạt động tích hợp, hãy cung cấp một tham số
client_key
cùng vớikey
của API. - Khi người dùng quyết định chia sẻ GIF hoặc hình dán nào, bạn cũng nên thêm một lệnh gọi tương ứng đến điểm cuối Register Share (Đăng ký chia sẻ). Lệnh gọi không bắt buộc này giúp AI của Công cụ tìm kiếm của Tenor điều chỉnh kết quả.
- Để kiểm soát số lượng và luồng GIF được trả về và tải, hãy sử dụng các tham số
limit
vàpos
. Ví dụ: bạn có thể đặtlimit = 10
cho kết quả yêu cầu ban đầu về nội dung đang thịnh hành của người dùng và tải bản xem trước của những ảnh GIF đó để người dùng duyệt xem. Nếu người dùng yêu cầu thêm kết quả, hãy thu thập 10 kết quả tiếp theo bằng cách thực hiện cùng một lệnh gọi API nhưng vớipos
được đặt thành giá trị của trườngnext
trong phản hồi ban đầu. Bạn có thể sử dụng mẫu này để tạo trải nghiệm tải từng phần mượt mà. Điều này giúp giảm mức sử dụng băng thông và rút ngắn thời gian phản hồi cho người dùng, vì ít ảnh GIF xem trước cần được tải song song hơn ở phía máy khách. - Để chỉ định mức phân loại an toàn nội dung GIF phù hợp cho dịch vụ hoặc ứng dụng của bạn, hãy sử dụng tham số
ContentFilter
. - Để giảm số lượng định dạng GIF được trả về, hãy sử dụng tham số
media_filter
. Điều này có thể giảm kích thước Đối tượng phản hồi xuống 75%.
Thông số
Bảng sau đây cung cấp thông tin chi tiết về các tham số cho điểm cuối Được làm nổi bật:
Thông số | |
---|---|
key |
Bắt buộc
Khoá API để truy cập API đặc quyền Không có giá trị mặc định. |
client_key |
Strongly recommended (Rất nên dùng)
Một chuỗi do ứng dụng chỉ định, đại diện cho hoạt động tích hợp. Khoá ứng dụng cho phép bạn sử dụng cùng một khoá API trên nhiều chế độ tích hợp nhưng vẫn có thể phân biệt chúng. Đối với một hoạt động tích hợp ứng dụng, hãy sử dụng cùng một giá trị Mọi hành vi tuỳ chỉnh của ứng dụng sẽ được kích hoạt bằng cách ghép nối các tham số Không có giá trị mặc định. |
searchfilter |
Không bắt buộc
Danh sách các loại nội dung không phải GIF được phân tách bằng dấu phẩy để lọc Đối tượng phản hồi. Theo mặc định, Không có giá trị mặc định. Các giá trị được chấp nhận là
|
country |
Strongly recommended (Rất nên dùng)
Chỉ định quốc gia xuất xứ của yêu cầu. Để làm như vậy, hãy cung cấp mã quốc gia gồm 2 chữ cái theo tiêu chuẩn ISO 3166-1. Giá trị mặc định là |
locale |
Strongly recommended (Rất nên dùng)
Chỉ định ngôn ngữ mặc định để diễn giải chuỗi tìm kiếm. Bạn có thể dùng mã quốc gia mà bạn cung cấp trong Giá trị mặc định là |
media_filter |
Strongly recommended (Rất nên dùng)
Danh sách các định dạng GIF được phân tách bằng dấu phẩy để lọc Đối tượng phản hồi. Theo mặc định, Ví dụ: Không có giá trị mặc định. |
ar_range |
Strongly recommended (Rất nên dùng)
Lọc Đối tượng phản hồi để chỉ bao gồm những ảnh GIF có tỷ lệ khung hình phù hợp với phạm vi đã chọn. Giá trị mặc định là
|
contentfilter |
Strongly recommended (Rất nên dùng)
Chỉ định cấp độ bộ lọc an toàn nội dung. Giá trị mặc định là |
limit |
Không bắt buộc
Tìm nạp tối đa số lượng kết quả được chỉ định. Giá trị mặc định là |
pos |
Không bắt buộc
Truy xuất kết quả bắt đầu tại vị trí "value". Sử dụng một giá trị khác 0 và không trống từ Không có giá trị mặc định. |
Định dạng phản hồi
Bảng sau đây cung cấp thông tin chi tiết về định dạng phản hồi cho Điểm cuối được làm nổi bật:
Khoá | |
---|---|
next |
Một giá trị nhận dạng vị trí để sử dụng với truy vấn API tiếp theo, thông qua trường |
results |
Một mảng gồm các Đối tượng Phản hồi được làm nổi bật. |
Ví dụ về yêu cầu
Curl
/* Featured GIFs call */ curl "https://tenor.googleapis.com/v2/featured?key=API_KEY&client_key=my_test_app"
Python
import requests import json # set the apikey and limit apikey = "API_KEY" # click to set to your apikey ckey = "my_test_app" # set the client_key for the integration lmt = 10 # get the top 10 featured GIFs - using the default locale of en_US r = requests.get("https://tenor.googleapis.com/v2/featured?key=%s&client_key=%s&limit=%s" % (apikey, ckey, lmt)) if r.status_code == 200: featured_gifs = json.loads(r.content) else: featured_gifs = None # load the featured GIFs print (featured_gifs)
Android/Java
import android.app.Application; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; public class App extends Application { private static final String API_KEY = "API_KEY"; private static final String CLIENT_KEY = "my_test_app"; private static final String LogTag = "TenorTest"; @Override public void onCreate() { super.onCreate(); new Thread() { @Override public void run() { // get the top 10 featured GIFs JSONObject featuredGifs = getFeaturedGifs(10); // load the results for the user Log.v(LogTag, "Featured GIFS: " + featuredGifs.toString()); } }.start(); } /** * Get featured GIFs */ public static JSONObject getFeaturedGifs(int limit) { // get the Featured GIFS - using the default locale of en_US final String url = String.format("https://tenor.googleapis.com/v2/featured?key=%1$s&client_key=%2$s&limit=%3$s", API_KEY, CLIENT_KEY, limit); try { return get(url); } catch (IOException | JSONException ignored) { } return null; } /** * Construct and run a GET request */ private static JSONObject get(String url) throws IOException, JSONException { HttpURLConnection connection = null; try { // Get request connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // Handle failure int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_CREATED) { String error = String.format("HTTP Code: '%1$s' from '%2$s'", statusCode, url); throw new ConnectException(error); } // Parse response return parser(connection); } catch (Exception ignored) { } finally { if (connection != null) { connection.disconnect(); } } return new JSONObject(""); } /** * Parse the response into JSONObject */ private static JSONObject parser(HttpURLConnection connection) throws JSONException { char[] buffer = new char[1024 * 4]; int n; InputStream stream = null; try { stream = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while (-1 != (n = reader.read(buffer))) { writer.write(buffer, 0, n); } return new JSONObject(writer.toString()); } catch (IOException ignored) { } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } return new JSONObject(""); } }
Swift 2.0+/iOS
let apikey = "API_KEY" let clientkey = "my_test_app" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { requestData() return true } /** Execute web requests to retrieve featured GIFs */ func requestData() { // Define the results upper limit let limit = 10 // Get the top 10 featured GIFs (updated throughout the day) - using the default locale of en_US let featuredRequest = URLRequest(url: URL(string: String(format: "https://tenor.googleapis.com/v2/featured?key=%@&client_key=%@&limit=%d", apikey, clientkey, limit))!) makeWebRequest(urlRequest: featuredRequest, callback: tenorFeaturedResultsHandler) // Data will be loaded by the request's callback } /** Async URL requesting function. */ func makeWebRequest(urlRequest: URLRequest, callback: @escaping ([String:AnyObject]) -> ()) { // Make the async request and pass the resulting JSON object to the callback let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in do { if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] { // Push the results to our callback callback(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } } task.resume() } /** Web response handler for featured top 10 GIFs. */ func tenorFeaturedResultsHandler(response: [String:AnyObject]) { // Parse the JSON response let topTenGifs = response["results"]! // Load the GIFs into your view print("Featured Results: (topTenGifs)") } }
JavaScript
<!DOCTYPE html> <html> <script> // url Async requesting function function httpGetAsync(theUrl, callback) { // create the request object var xmlHttp = new XMLHttpRequest(); // set the state change callback to capture when the response comes in xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } } // open as a GET call, pass in the url and set async = True xmlHttp.open("GET", theUrl, true); // call send with no params as they were passed in on the url string xmlHttp.send(null); return; } // callback for featured top 10 GIFs function tenorCallback_featured(responsetext) { // Parse the JSON response var response_objects = JSON.parse(responsetext); top_10_gifs = response_objects["results"]; // load the GIFs -- for our example we will load the first GIFs preview size (nanogif) and share size (gif) document.getElementById("preview_gif").src = top_10_gifs[0]["media_formats"]["nanogif"]["url"]; document.getElementById("share_gif").src = top_10_gifs[0]["media_formats"]["gif"]["url"]; return; } // function to call the featured endpoint function grab_data() { // set the apikey and limit var apikey = "API_KEY"; var clientkey = "my_test_app"; var lmt = 10; // get the top 10 featured GIFs (updated throughout the day) - using the default locale of en_US var featured_url = "https://tenor.googleapis.com/v2/featured?key=" + apikey + "&client_key=" + clientkey + "&limit=" + lmt; httpGetAsync(featured_url,tenorCallback_featured); // data will be loaded by each call's callback return; } // SUPPORT FUNCTIONS ABOVE // MAIN BELOW // start the flow grab_data(); </script> <style> .container { position: relative; text-align: center; color: white; } .title { text-align: center; } .centered { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style> <body> <h2 class="title">GIF loaded - preview image</h2> <div class="container"> <img id="preview_gif" src="" alt="" style=""> </div> <h2 class="title">GIF loaded - share image</h2> <div class="container"> <img id="share_gif" src="" alt="" style=""> </div> </body> </html>
Objective-C
NSString *apiKey = @"API_KEY"; NSString *clientKey = @"my_test_app"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self requestData]; return YES; } /** Execute web requests to retrieve featured GIFs */ -(void)requestData { // Define the results upper limit int limit = 10; // Get the top 10 featured GIFs (updated throughout the day) - using the default locale of en_US NSString *featuredUrlString = [NSString stringWithFormat:@"https://tenor.googleapis.com/v2/featured?key=%@&client_key=%@&limit=%d", apiKey, clientKey, limit]; NSURL *featuredUrl = [NSURL URLWithString:featuredUrlString]; NSURLRequest *featuredRequest = [NSURLRequest requestWithURL:featuredUrl]; [self makeWebRequest:featuredRequest withCallback:tenorFeaturedResultsHandler]; // Data will be loaded by each request's callback } /** Async URL requesting function. */ -(void)makeWebRequest:(NSURLRequest *)urlRequest withCallback:(void (^)(NSDictionary *))callback { // Make the async request and pass the resulting JSON object to the callback NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSError *jsonError = nil; NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError]; if(jsonError != nil) { NSLog(@"%@", jsonError.localizedDescription); return; } // Push the results to our callback callback(jsonResult); }]; [task resume]; } /** Web response handler for featured top 10 GIFs. */ void (^tenorFeaturedResultsHandler)(NSDictionary *) = ^void(NSDictionary *response) { // Parse the JSON response NSDictionary *topTenGifs = response[@"results"]; // Load the GIFs into your view NSLog(@"Featured Results: %@", topTenGifs); };
Danh mục
URL cơ sở
https://tenor.googleapis.com/v2/categories?<parameters>
Nhận một đối tượng JSON chứa danh sách các danh mục GIF được liên kết với loại được cung cấp. Mỗi danh mục đều có một URL tìm kiếm tương ứng để sử dụng nếu người dùng nhấp vào danh mục đó. URL tìm kiếm bao gồm mọi tham số từ lệnh gọi ban đầu đến điểm cuối Danh mục.
Các kiểu được hỗ trợ
featured
(mặc định): Các danh mục ảnh GIF cảm xúc hoặc phản ứng nổi bật hiện tại. Trong đó có một GIF xem trước cho mỗi thuật ngữ.trending
: Cụm từ tìm kiếm thịnh hành hiện tại. Trong đó có một GIF xem trước cho mỗi cụm từ.
Các phương pháp hay nhất
- Để phân biệt các hoạt động tích hợp, hãy cung cấp một tham số
client_key
cùng vớikey
của API. - Sử dụng tham số
locale
để chuyển đổi tên danh mục sang ngôn ngữ của người dùng. Giá trị mặc định làen_US
. - Để chỉ định mức phân loại an toàn nội dung GIF phù hợp cho dịch vụ hoặc ứng dụng của bạn, hãy sử dụng tham số
ContentFilter
. Khi được dùng, tham sốContentFilter
sẽ được truyền đến tất cả các URL tìm kiếm có trongcategories
Đối tượng phản hồi.
Thông số
Bảng sau đây cung cấp thông tin chi tiết về các thông số cho điểm cuối Danh mục:
Thông số | |
---|---|
key |
Bắt buộc
Khoá API để truy cập API đặc quyền Không có giá trị mặc định. |
client_key |
Strongly recommended (Rất nên dùng)
Một chuỗi do ứng dụng chỉ định, đại diện cho hoạt động tích hợp. Khoá ứng dụng cho phép bạn sử dụng cùng một khoá API trên nhiều hoạt động tích hợp nhưng vẫn có thể phân biệt chúng. Đối với một hoạt động tích hợp ứng dụng, hãy sử dụng cùng một giá trị Mọi hành vi tuỳ chỉnh của ứng dụng sẽ được kích hoạt bằng cách ghép nối các tham số Không có giá trị mặc định. |
country |
Strongly recommended (Rất nên dùng)
Chỉ định quốc gia xuất xứ của yêu cầu. Để làm như vậy, hãy cung cấp mã quốc gia gồm 2 chữ cái theo tiêu chuẩn ISO 3166-1. Giá trị mặc định là |
locale |
Strongly recommended (Rất nên dùng)
Chỉ định ngôn ngữ mặc định để diễn giải chuỗi tìm kiếm. Bạn có thể dùng mã quốc gia mà bạn cung cấp trong Giá trị mặc định là |
type |
Strongly recommended (Rất nên dùng)
Xác định loại danh mục được trả về. Giá trị mặc định là |
contentfilter |
Strongly recommended (Rất nên dùng)
Chỉ định cấp độ bộ lọc an toàn nội dung. Giá trị mặc định là |
Định dạng phản hồi
Bảng sau đây cung cấp thông tin chi tiết về định dạng phản hồi cho điểm cuối Danh mục:
Khoá | |
---|---|
tags |
Một mảng |
Ví dụ về yêu cầu
Curl
/* categories call */ curl "https://tenor.googleapis.com/v2/categories?key=API_KEY&client_key=my_test_app"
Python
import requests import json # set the apikey and limit apikey = "API_KEY" # click to set to your apikey ckey = "my_test_app" # set the client_key for the integration # get the current list of categories - using the default locale of en_US r = requests.get("https://tenor.googleapis.com/v2/categories?key=%s&client_key=%s" % (apikey, ckey)) if r.status_code == 200: categories = json.loads(r.content) else: categories = None # load the categories below the search bar for the user print (categories)
Android/Java
import android.app.Application; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; public class App extends Application { private static final String API_KEY = "API_KEY"; private static final String CLIENT_KEY = "my_test_app"; private static final String LogTag = "TenorTest"; @Override public void onCreate() { super.onCreate(); new Thread() { @Override public void run() { // get the current list of categories JSONObject categories = getCategories(); // load the results for the user Log.v(LogTag, "GIF Categories: " + categories.toString()); } }.start(); } /** * Get categories */ public static JSONObject getCategories() { // get the categories - using the default locale of en_US final String url = String.format("https://tenor.googleapis.com/v2/categories?key=%1$s&client_key=%2$s", API_KEY, CLIENT_KEY); try { return get(url); } catch (IOException | JSONException ignored) { } return null; } /** * Construct and run a GET request */ private static JSONObject get(String url) throws IOException, JSONException { HttpURLConnection connection = null; try { // Get request connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // Handle failure int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_CREATED) { String error = String.format("HTTP Code: '%1$s' from '%2$s'", statusCode, url); throw new ConnectException(error); } // Parse response return parser(connection); } catch (Exception ignored) { } finally { if (connection != null) { connection.disconnect(); } } return new JSONObject(""); } /** * Parse the response into JSONObject */ private static JSONObject parser(HttpURLConnection connection) throws JSONException { char[] buffer = new char[1024 * 4]; int n; InputStream stream = null; try { stream = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while (-1 != (n = reader.read(buffer))) { writer.write(buffer, 0, n); } return new JSONObject(writer.toString()); } catch (IOException ignored) { } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } return new JSONObject(""); } }
Swift 2.0+/iOS
let apikey = "API_KEY" let clientkey = "my_test_app" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { requestData() return true } /** Execute web requests to retrieve featured GIFs and GIF categories. */ func requestData() { // Get the current list of categories - using the default locale of en_US let categoryRequest = URLRequest(url: URL(string: String(format: "https://tenor.googleapis.com/v2/categories?key=%@&client_key=%@", apikey, clientkey))!) makeWebRequest(urlRequest: categoryRequest, callback: tenorCategoryResultsHandler) // Data will be loaded by each request's callback } /** Async URL requesting function. */ func makeWebRequest(urlRequest: URLRequest, callback: @escaping ([String:AnyObject]) -> ()) { // Make the async request and pass the resulting JSON object to the callback let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in do { if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] { // Push the results to our callback callback(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } } task.resume() } /** Web response handler for GIF categories. */ func tenorCategoryResultsHandler(response: [String:AnyObject]) { // Parse the JSON response let categories = response["tags"]! // Load the categories into your view print("Category Results: (categories)") } }
JavaScript
<!DOCTYPE html> <html> <script> // url Async requesting function function httpGetAsync(theUrl, callback) { // create the request object var xmlHttp = new XMLHttpRequest(); // set the state change callback to capture when the response comes in xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } } // open as a GET call, pass in the url and set async = True xmlHttp.open("GET", theUrl, true); // call send with no params as they were passed in on the url string xmlHttp.send(null); return; } // callback for GIF categories function tenorCallback_categories(responsetext) { // Parse the JSON response var response_objects = JSON.parse(responsetext); categories = response_objects["tags"]; // load the categories - example is for the first category // url to load: var imgurl = categories[0]["image"]; // text to overlay on image: var txt_overlay = categories[0]["name"]; // search to run if user clicks the category var category_search_path = categories[0]["path"]; document.getElementById("category_gif").src = imgurl document.getElementById("catgif_caption").innerHTML = txt_overlay document.getElementById("cat_link").href = category_search_path return; } // function to call the category endpoints function grab_data() { // set the apikey and limit var apikey = "API_KEY"; var clientkey = "my_test_app"; // get the current list of categories - using the default locale of en_US var cat_url = "https://tenor.googleapis.com/v2/categories?key=" + apikey + "&client_key=" + clientkey; httpGetAsync(cat_url,tenorCallback_categories); // data will be loaded by each call's callback return; } // SUPPORT FUNCTIONS ABOVE // MAIN BELOW // start the flow grab_data(); </script> <style> .container { position: relative; text-align: center; color: white; } .title { text-align: center; } .centered { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style> <body> <h2 class="title">GIF Category</h2> <div class="container"> <a id="cat_link" href=""> <img id="category_gif" src="" alt="" style=""> <div id="catgif_caption" class="centered"></div> </a> </div> </body> </html>
Objective-C
NSString *apiKey = @"API_KEY"; NSString *clientKey = @"my_test_app"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self requestData]; return YES; } /** Execute web requests to retrieve GIF categories. */ -(void)requestData { // Get the current list of categories - using the default locale of en_US NSString *categoryUrlString = [NSString stringWithFormat:@"https://tenor.googleapis.com/v2/categories?key=%@&client_key=%@", apiKey, clientKey]; NSURL *categoryUrl = [NSURL URLWithString:categoryUrlString]; NSURLRequest *categoryRequest = [NSURLRequest requestWithURL:categoryUrl]; [self makeWebRequest:categoryRequest withCallback:tenorCategoryResultsHandler]; // Data will be loaded by each request's callback } /** Async URL requesting function. */ -(void)makeWebRequest:(NSURLRequest *)urlRequest withCallback:(void (^)(NSDictionary *))callback { // Make the async request and pass the resulting JSON object to the callback NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSError *jsonError = nil; NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError]; if(jsonError != nil) { NSLog(@"%@", jsonError.localizedDescription); return; } // Push the results to our callback callback(jsonResult); }]; [task resume]; } /** Web response handler for GIF categories. */ void (^tenorCategoryResultsHandler)(NSDictionary *) = ^void(NSDictionary *response) { // Parse the JSON response NSDictionary *categories = response[@"tags"]; // Load the categories into your view NSLog(@"Category Results: %@", categories); };
Cụm từ tìm kiếm được đề xuất
URL cơ sở
https://tenor.googleapis.com/v2/search_suggestions?<parameters>
Nhận một đối tượng JSON chứa danh sách các cụm từ tìm kiếm thay thế cho một cụm từ tìm kiếm nhất định.
Đề xuất tìm kiếm giúp người dùng thu hẹp phạm vi tìm kiếm hoặc khám phá các cụm từ tìm kiếm có liên quan để tìm được ảnh GIF chính xác hơn. API này trả về kết quả theo thứ tự những kết quả có nhiều khả năng thúc đẩy lượt chia sẻ nhất cho một cụm từ nhất định, dựa trên hành vi tìm kiếm và chia sẻ của người dùng trong quá khứ.
Các phương pháp hay nhất
- Để phân biệt các hoạt động tích hợp, hãy cung cấp một tham số
client_key
cùng vớikey
của API. - Hiển thị kết quả theo thứ tự do phản hồi cung cấp.
Thông số
Bảng sau đây cung cấp thông tin chi tiết về các tham số cho điểm cuối Đề xuất tìm kiếm:
Thông số | |
---|---|
key |
Bắt buộc
Khoá API để truy cập API đặc quyền Không có giá trị mặc định. |
q |
Bắt buộc
Một chuỗi tìm kiếm Không có giá trị mặc định. |
client_key |
Strongly recommended (Rất nên dùng)
Một chuỗi do ứng dụng chỉ định, đại diện cho hoạt động tích hợp. Khoá ứng dụng cho phép bạn sử dụng cùng một khoá API trên nhiều hoạt động tích hợp nhưng vẫn có thể phân biệt chúng. Đối với một hoạt động tích hợp ứng dụng, hãy sử dụng cùng một giá trị Mọi hành vi tuỳ chỉnh của ứng dụng sẽ được kích hoạt bằng cách ghép nối các tham số Không có giá trị mặc định. |
country |
Strongly recommended (Rất nên dùng)
Chỉ định quốc gia xuất xứ của yêu cầu. Để làm như vậy, hãy cung cấp mã quốc gia gồm 2 chữ cái theo tiêu chuẩn ISO 3166-1. Giá trị mặc định là |
locale |
Strongly recommended (Rất nên dùng)
Chỉ định ngôn ngữ mặc định để diễn giải chuỗi tìm kiếm. Bạn có thể dùng mã quốc gia mà bạn cung cấp trong Giá trị mặc định là |
limit |
Không bắt buộc
Tìm nạp tối đa số lượng kết quả được chỉ định. Giá trị mặc định là |
Định dạng phản hồi
Bảng sau đây cung cấp thông tin chi tiết về định dạng phản hồi cho điểm cuối Đề xuất tìm kiếm:
Khoá | |
---|---|
results |
Một mảng gồm các cụm từ tìm kiếm đề xuất |
Ví dụ về yêu cầu
Curl
/* search suggestion */ curl "https://tenor.googleapis.com/v2/search_suggestions?key=API_KEY&client_key=my_test_app&q=smile&limit=5"
Python
# set the apikey and limit the # coming back apikey = "API_KEY" # click to set to your apikey ckey = "my_test_app" # set the client_key for the integration lmt = 5 # partial search search = "smile" r = requests.get( "https://tenor.googleapis.com/v2/search_suggestions?key=%s&client_key=%s&q=%s&limit=%s" % (apikey, ckey, search, lmt)) if r.status_code == 200: # return the search suggestions search_suggestion_list = json.loads(r.content)["results"] print search_suggestion_list else: # handle a possible error search_suggestion_list = []
Android/Java
import android.app.Application; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; public class App extends Application { private static final String API_KEY = "API_KEY"; private static final String CLIENT_KEY = "my_test_app"; private static final String LogTag = "TenorTest"; @Override public void onCreate() { super.onCreate(); new Thread() { @Override public void run() { // for testing, the last search final String lastSearch = "smile"; int limit = 5; // make the search suggestion call JSONObject searchSuggestionResult = searchSuggestionRequest(lastSearch, limit); // load the results for the user Log.v(LogTag, "Search Suggestion Results: " + searchSuggestionResult.toString()); } }.start(); } /** * Autocomplete Request */ public static JSONObject searchSuggestionRequest(String lastSearch, int limit) { // make an autocomplete request - using default locale of EN_US final String url = String.format("https://tenor.googleapis.com/v2/search_suggestions?key=%1$s&client_key=%2$s&q=%3$s&limit=%4$s", API_KEY, CLIENT_KEY, lastSearch, limit); try { return get(url); } catch (IOException | JSONException ignored) { } return null; } /** * Construct and run a GET request */ private static JSONObject get(String url) throws IOException, JSONException { HttpURLConnection connection = null; try { // Get request connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // Handle failure int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_CREATED) { String error = String.format("HTTP Code: '%1$s' from '%2$s'", statusCode, url); throw new ConnectException(error); } // Parse response return parser(connection); } catch (Exception ignored) { } finally { if (connection != null) { connection.disconnect(); } } return new JSONObject(""); } /** * Parse the response into JSONObject */ private static JSONObject parser(HttpURLConnection connection) throws JSONException { char[] buffer = new char[1024 * 4]; int n; InputStream stream = null; try { stream = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while (-1 != (n = reader.read(buffer))) { writer.write(buffer, 0, n); } return new JSONObject(writer.toString()); } catch (IOException ignored) { } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } return new JSONObject(""); } }
Swift 2.0+/iOS
let apikey = "API_KEY" let clientkey = "my_test_app" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { requestData() return true } /** Execute web requests to get search suggestions. */ func requestData() { // for testing, the partial search let lastsearch = "smile" let limit = 5 // Get the top 5 search suggestions - using the default locale of en_US let suggestRequest = URLRequest(url: URL(string: String(format: "https://tenor.googleapis.com/v2/search_suggestions?key=%@&client_key=%@&q=%@&limit=%d", apikey, clientkey, lastsearch, limit))!) makeWebRequest(urlRequest: suggestRequest, callback: tenorSuggestResultsHandler) // Data will be loaded by each request's callback } /** Async URL requesting function. */ func makeWebRequest(urlRequest: URLRequest, callback: @escaping ([String:AnyObject]) -> ()) { // Make the async request and pass the resulting JSON object to the callback let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in do { if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] { // Push the results to our callback callback(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } } task.resume() } /** Web response handler for search suggestion requests. */ func tenorSuggestResultsHandler(response: [String:AnyObject]) { // Parse the JSON response let searchSuggestion = response["results"]! // Load the GIFs into your view print("Search Suggestion Results: (searchSuggestion)") } }
JavaScript
<!DOCTYPE html> <html> <script> // url Async requesting function function httpGetAsync(theUrl, callback) { // create the request object var xmlHttp = new XMLHttpRequest(); // set the state change callback to capture when the response comes in xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } } // open as a GET call, pass in the url and set async = True xmlHttp.open("GET", theUrl, true); // call send with no params as they were passed in on the url string xmlHttp.send(null); return; } // callback for share event function tenorCallback_searchSuggestion(responsetext) { var response_objects = JSON.parse(responsetext); predicted_words = response_objects["results"]; document.getElementById("ac_1").innerHTML = predicted_words[0]; document.getElementById("ac_2").innerHTML = predicted_words[1]; document.getElementById("ac_3").innerHTML = predicted_words[2]; document.getElementById("ac_4").innerHTML = predicted_words[3]; } // SUPPORT FUNCTIONS ABOVE // MAIN BELOW //search term psearch_term = "smile"; // set the apikey and limit var apikey = "API_KEY"; var clientkey = "my_test_app"; var lmt = 5; // using default locale of en_US var autoc_url = "https://tenor.googleapis.com/v2/search_suggestions?key=" + apikey + "&client_key=" + clientkey + "&q=" + psearch_term + "&limit=" + lmt; // send search suggestion request httpGetAsync(autoc_url,tenorCallback_searchSuggestion); </script> <body> <h2>Search Suggestion for "smile":</h2> <h3 id = "ac_1"></h3> <h3 id = "ac_2"></h3> <h3 id = "ac_3"></h3> <h3 id = "ac_4"></h3> </body> </html>
Objective-C
NSString *apiKey = @"API_KEY"; NSString *clientKey = @"my_test_app"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self requestData]; return YES; } /** Execute web requests to get search suggestions. */ -(void)requestData { // Define the results upper limit int limit = 5; // the test search term NSString *lastSearch = @"smile"; // Get the search suggestions for the given last search - using the default locale of en_US NSString *UrlString = [NSString stringWithFormat:@"https://tenor.googleapis.com/v2/search_suggestions?key=%@&client_key=%@&q=%@&limit=%d", apiKey, clientKey, lastSearch, limit]; NSURL *searchUrl = [NSURL URLWithString:UrlString]; NSURLRequest *searchRequest = [NSURLRequest requestWithURL:searchUrl]; [self makeWebRequest:searchRequest withCallback:tenorSearchSuggestionResultsHandler]; // Data will be loaded by each request's callback } /** Async URL requesting function. */ -(void)makeWebRequest:(NSURLRequest *)urlRequest withCallback:(void (^)(NSDictionary *))callback { // Make the async request and pass the resulting JSON object to the callback NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NStopGifsError *jsonError = nil; NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError]; if(jsonError != nil) { NSLog(@"%@", jsonError.localizedDescription); return; } // Push the results to our callback callback(jsonResult); }]; [task resume]; } /** Web response handler for search suggestions */ void (^tenorSearchSuggestionResultsHandler)(NSDictionary *) = ^void(NSDictionary *response) { // Parse the JSON response NSDictionary *results = response[@"results"]; // Load the GIFs into your view NSLog(@"Search Suggestion Result: %@", results); };
Tự động hoàn thành
URL cơ sở
https://tenor.googleapis.com/v2/autocomplete?q=<term>&key=<API KEY>
Nhận một đối tượng JSON chứa danh sách các cụm từ tìm kiếm đã hoàn tất cho một cụm từ tìm kiếm một phần nhất định. Danh sách này được sắp xếp theo AI của Tenor và số lượng kết quả sẽ giảm khi AI của Tenor trở nên chắc chắn hơn.
Các phương pháp hay nhất
- Để phân biệt các hoạt động tích hợp, hãy cung cấp một tham số
client_key
cùng vớikey
của API. - Sử dụng tham số
locale
để điều chỉnh kết quả theo ngôn ngữ của người dùng. Giá trị mặc định làen_US
. - Hiển thị kết quả theo thứ tự do phản hồi cung cấp.
Thông số
Bảng sau đây cung cấp thông tin chi tiết về các tham số cho điểm cuối Autocomplete:
Thông số | |
---|---|
key |
Bắt buộc
Khoá API để truy cập API đặc quyền Không có giá trị mặc định. |
q |
Bắt buộc
Một chuỗi tìm kiếm Không có giá trị mặc định. |
client_key |
Strongly recommended (Rất nên dùng)
Một chuỗi do ứng dụng chỉ định, đại diện cho hoạt động tích hợp. Khoá ứng dụng cho phép bạn sử dụng cùng một khoá API trên nhiều hoạt động tích hợp nhưng vẫn có thể phân biệt chúng. Đối với một hoạt động tích hợp ứng dụng, hãy sử dụng cùng một giá trị Mọi hành vi tuỳ chỉnh của ứng dụng sẽ được kích hoạt bằng cách ghép nối các tham số Không có giá trị mặc định. |
country |
Strongly recommended (Rất nên dùng)
Chỉ định quốc gia xuất xứ của yêu cầu. Để làm như vậy, hãy cung cấp mã quốc gia gồm 2 chữ cái theo tiêu chuẩn ISO 3166-1. Giá trị mặc định là |
locale |
Strongly recommended (Rất nên dùng)
Chỉ định ngôn ngữ mặc định để diễn giải chuỗi tìm kiếm. Bạn có thể dùng mã quốc gia mà bạn cung cấp trong Giá trị mặc định là |
limit |
Không bắt buộc
Tìm nạp tối đa số lượng kết quả được chỉ định. Giá trị mặc định là |
Định dạng phản hồi
Bảng sau đây cung cấp thông tin chi tiết về định dạng phản hồi cho điểm cuối Autocomplete:
Khoá | |
---|---|
results |
Một mảng gồm các cụm từ tìm kiếm đề xuất |
Ví dụ về yêu cầu
Curl
/* autocomplete */ curl "https://tenor.googleapis.com/v2/autocomplete?key=API_KEY&client_key=my_test_app&q=exc"
Python
apikey = "API_KEY" # click to set to your apikey ckey = "my_test_app" # set the client_key for the integration lmt = 5 # partial search psearch = "exc" r = requests.get( "https://tenor.googleapis.com/v2/autocomplete?key=%s&client_key=%s&q=%s&limit=%s" % (apikey, ckey, psearch, lmt)) if r.status_code == 200: # return the search predictions search_term_list = json.loads(r.content)["results"] print(search_term_list) else: # handle a possible error search_term_list = []
Android/Java
import android.app.Application; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; public class App extends Application { private static final String API_KEY = "API_KEY"; private static final String CLIENT_KEY = "my_test_app"; private static final String LogTag = "TenorTest"; @Override public void onCreate() { super.onCreate(); new Thread() { @Override public void run() { // for testing, the partial search final String partialSearch = "exc"; int limit = 5; // make the autocomplete call JSONObject autoCompleteResult = autoCompleteRequest(partialSearch, limit); // load the results for the user Log.v(LogTag, "AutoComplete Results: " + autoCompleteResult.toString()); } }.start(); } /** * Autocomplete Request */ public static JSONObject autoCompleteRequest(String partialSearch, int limit) { // make an autocomplete request - using default locale of EN_US final String url = String.format("https://tenor.googleapis.com/v2/autocomplete?key=%1$s&client_key=%2$s&q=%3$s&limit=%4$s", API_KEY, CLIENT_KEY, partialSearch, limit); try { return get(url); } catch (IOException | JSONException ignored) { } return null; } /** * Construct and run a GET request */ private static JSONObject get(String url) throws IOException, JSONException { HttpURLConnection connection = null; try { // Get request connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // Handle failure int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_CREATED) { String error = String.format("HTTP Code: '%1$s' from '%2$s'", statusCode, url); throw new ConnectException(error); } // Parse response return parser(connection); } catch (Exception ignored) { } finally { if (connection != null) { connection.disconnect(); } } return new JSONObject(""); } /** * Parse the response into JSONObject */ private static JSONObject parser(HttpURLConnection connection) throws JSONException { char[] buffer = new char[1024 * 4]; int n; InputStream stream = null; try { stream = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while (-1 != (n = reader.read(buffer))) { writer.write(buffer, 0, n); } return new JSONObject(writer.toString()); } catch (IOException ignored) { } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } return new JSONObject(""); } }
Swift 2.0+/iOS
let apikey = "API_KEY" let clientkey = "my_test_app" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { requestData() return true } /** Execute web requests to get autocomplete suggestions. */ func requestData() { // for testing, the partial search let partialSearch = "exc" let limit = 5 // Get up to 5 results from the autocomplete suggestions - using the default locale of en_US let autoRequest = URLRequest(url: URL(string: String(format: "https://tenor.googleapis.com/v2/autocomplete?key=%@&client_key=%@&q=%@&limit=%d", apikey, clientkey, partialSearch, limit))!) makeWebRequest(urlRequest: autoRequest, callback: tenorAutoCompleteResultsHandler) // Data will be loaded by each request's callback } /** Async URL requesting function. */ func makeWebRequest(urlRequest: URLRequest, callback: @escaping ([String:AnyObject]) -> ()) { // Make the async request and pass the resulting JSON object to the callback let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in do { if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] { // Push the results to our callback callback(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } } task.resume() } /** Web response handler for autocomplete requests. */ func tenorAutoCompleteResultsHandler(response: [String:AnyObject]) { // Parse the JSON response let autoSuggestions = response["results"]! // Load the GIFs into your view print("Autocomplete Results: (autoSuggestions)") } }
JavaScript
<!DOCTYPE html> <html> <script> // url Async requesting function function httpGetAsync(theUrl, callback) { // create the request object var xmlHttp = new XMLHttpRequest(); // set the state change callback to capture when the response comes in xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } } // open as a GET call, pass in the url and set async = True xmlHttp.open("GET", theUrl, true); // call send with no params as they were passed in on the url string xmlHttp.send(null); return; } // callback for share event function tenorCallback_autocomplete(responsetext) { var response_objects = JSON.parse(responsetext); predicted_words = response_objects["results"]; document.getElementById("ac_1").innerHTML = predicted_words[0]; document.getElementById("ac_2").innerHTML = predicted_words[1]; } // SUPPORT FUNCTIONS ABOVE // MAIN BELOW //partial search term psearch_term = "exc"; // set the apikey and limit var apikey = "API_KEY"; var clientkey = "my_test_app"; var lmt = 5; // using default locale of en_US var autoc_url = "https://tenor.googleapis.com/v2/autocomplete?key=" + apikey + "&client_key=" + clientkey + "&q=" + psearch_term + "&limit=" + lmt; // send autocomplete request httpGetAsync(autoc_url,tenorCallback_autocomplete); </script> <body> <h2>Partial Search "exc":</h2> <h3 id = "ac_1"></h3> <h3 id = "ac_2"></h3> </body> </html>
Objective-C
NSString *apiKey = @"API_KEY"; NSString *clientKey = @"my_test_app"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self requestData]; return YES; } /** Execute web requests to get autocomplete suggestions. */ -(void)requestData { // Define the results upper limit int limit = 8; // the test search term NSString *partialSearch = @"exc"; // Get the auto complete predictions for the given partial search - using the default locale of en_US NSString *UrlString = [NSString stringWithFormat:@"https://tenor.googleapis.com/v2/autocomplete?key=%@&client_key=%@&q=%@&limit=%d", apiKey, clientKey, partialSearch, limit]; NSURL *searchUrl = [NSURL URLWithString:UrlString]; NSURLRequest *searchRequest = [NSURLRequest requestWithURL:searchUrl]; [self makeWebRequest:searchRequest withCallback:tenorAutoCompleteResultsHandler]; // Data will be loaded by each request's callback } /** Async URL requesting function. */ -(void)makeWebRequest:(NSURLRequest *)urlRequest withCallback:(void (^)(NSDictionary *))callback { // Make the async request and pass the resulting JSON object to the callback NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NStopGifsError *jsonError = nil; NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError]; if(jsonError != nil) { NSLog(@"%@", jsonError.localizedDescription); return; } // Push the results to our callback callback(jsonResult); }]; [task resume]; } /** Web response handler for auto complete predictions */ void (^tenorAutoCompleteResultsHandler)(NSDictionary *) = ^void(NSDictionary *response) { // Parse the JSON response NSDictionary *results = response[@"results"]; // Load the GIFs into your view NSLog(@"Auto Complete Result: %@", results); };
Cụm từ tìm kiếm thịnh hành
URL cơ sở
https://tenor.googleapis.com/v2/trending_terms?<parameters>
Nhận một đối tượng JSON chứa danh sách các cụm từ tìm kiếm thịnh hành hiện tại. AI của Tenor cập nhật danh sách này hằng giờ.
Các phương pháp hay nhất
- Để phân biệt các hoạt động tích hợp, hãy cung cấp một tham số
client_key
cùng vớikey
của API. - Hiển thị kết quả theo thứ tự do phản hồi cung cấp.
Thông số
Bảng sau đây cung cấp thông tin chi tiết về các tham số cho điểm cuối Cụm từ tìm kiếm thịnh hành:
Thông số | |
---|---|
key |
Bắt buộc
Khoá API để truy cập API đặc quyền Không có giá trị mặc định. |
client_key |
Strongly recommended (Rất nên dùng)
Một chuỗi do ứng dụng chỉ định, đại diện cho hoạt động tích hợp. Khoá ứng dụng cho phép bạn sử dụng cùng một khoá API trên nhiều hoạt động tích hợp nhưng vẫn có thể phân biệt chúng. Đối với một hoạt động tích hợp ứng dụng, hãy sử dụng cùng một giá trị Mọi hành vi tuỳ chỉnh của ứng dụng sẽ được kích hoạt bằng cách ghép nối các tham số Không có giá trị mặc định. |
country |
Strongly recommended (Rất nên dùng)
Chỉ định quốc gia xuất xứ của yêu cầu. Để làm như vậy, hãy cung cấp mã quốc gia gồm 2 chữ cái theo tiêu chuẩn ISO 3166-1. Giá trị mặc định là |
locale |
Strongly recommended (Rất nên dùng)
Chỉ định ngôn ngữ mặc định để diễn giải chuỗi tìm kiếm. Bạn có thể dùng mã quốc gia mà bạn cung cấp trong Giá trị mặc định là |
limit |
Không bắt buộc
Tìm nạp tối đa số lượng kết quả được chỉ định. Giá trị mặc định là |
Định dạng phản hồi
Bảng sau đây cung cấp thông tin chi tiết về định dạng phản hồi cho điểm cuối Cụm từ tìm kiếm thịnh hành:
Khoá | |
---|---|
results |
Một mảng gồm các cụm từ tìm kiếm đề xuất. Các cụm từ được sắp xếp theo Thứ hạng xu hướng. |
Ví dụ về yêu cầu
Curl
/* trending Terms call */ curl "https://tenor.googleapis.com/v2/trending_terms?key=API_KEY&client_key=my_test_app"
Python
import requests import json apikey = "API_KEY" # click to set to your apikey ckey = "my_test_app" # set the client_key for the integration # get the current list of categories - using the default locale of en_US r = requests.get("https://tenor.googleapis.com/v2/trending_terms?key=%s&client_key=%s" % (apikey,ckey)) if r.status_code == 200: trending_terms = json.loads(r.content) else: trending_terms = None # load the results print(trending_terms)
Android/Java
import android.app.Application; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; public class App extends Application { private static final String API_KEY = "API_KEY"; private static final String CLIENT_KEY = "my_test_app"; private static final String LogTag = "TenorTest"; @Override public void onCreate() { super.onCreate(); new Thread() { @Override public void run() { // get the current list of categories JSONObject terms = getTrendingTerms(); // load the results for the user Log.v(LogTag, "Trending Terms: " + terms.toString()); } }.start(); } /** * Get trending terms */ public static JSONObject getTrendingTerms() { // get the categories - using the default locale of en_US final String url = String.format("https://tenor.googleapis.com/v2/trending_terms?key=%1$s&client_key=%2$s", API_KEY, CLIENT_KEY); try { return get(url); } catch (IOException | JSONException ignored) { } return null; } /** * Construct and run a GET request */ private static JSONObject get(String url) throws IOException, JSONException { HttpURLConnection connection = null; try { // Get request connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // Handle failure int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_CREATED) { String error = String.format("HTTP Code: '%1$s' from '%2$s'", statusCode, url); throw new ConnectException(error); } // Parse response return parser(connection); } catch (Exception ignored) { } finally { if (connection != null) { connection.disconnect(); } } return new JSONObject(""); } /** * Parse the response into JSONObject */ private static JSONObject parser(HttpURLConnection connection) throws JSONException { char[] buffer = new char[1024 * 4]; int n; InputStream stream = null; try { stream = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while (-1 != (n = reader.read(buffer))) { writer.write(buffer, 0, n); } return new JSONObject(writer.toString()); } catch (IOException ignored) { } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } return new JSONObject(""); } }
Swift 2.0+/iOS
let apikey = "API_KEY" let clientkey = "my_test_app" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { requestData() return true } /** Execute web requests to retrieve trending terms. */ func requestData() { // Get the current list of categories - using the default locale of en_US let categoryRequest = URLRequest(url: URL(string: String(format: "https://tenor.googleapis.com/v2/trending_terms?key=%@&client_key=%@", apikey, clientkey))!) makeWebRequest(urlRequest: categoryRequest, callback: tenorTermsResultsHandler) // Data will be loaded by each request's callback } /** Async URL requesting function. */ func makeWebRequest(urlRequest: URLRequest, callback: @escaping ([String:AnyObject]) -> ()) { // Make the async request and pass the resulting JSON object to the callback let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in do { if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] { // Push the results to our callback callback(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } } task.resume() } /** Web response handler for GIF categories. */ func tenorTermsResultsHandler(response: [String:AnyObject]) { // Parse the JSON response let terms = response["results"]! // Load the categories into your view print("Trending Terms Results: (terms)") } }
JavaScript
<!DOCTYPE html> <html> <script> // url Async requesting function function httpGetAsync(theUrl, callback) { // create the request object var xmlHttp = new XMLHttpRequest(); // set the state change callback to capture when the response comes in xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } } // open as a GET call, pass in the url and set async = True xmlHttp.open("GET", theUrl, true); // call send with no params as they were passed in on the url string xmlHttp.send(null); return; } // callback for GIF categories function tenorCallback_terms(responsetext) { // Parse the JSON response var response_objects = JSON.parse(responsetext); terms = response_objects["results"]; document.getElementById("res").innerHTML = terms return; } // function to call the trending terms function grab_data() { // set the apikey and limit var apikey = "API_KEY"; var clientkey = "my_test_app"; var lmt = 10; // get the current list of trending terms - using the default locale of en_US var cat_url = "https://tenor.googleapis.com/v2/trending_terms?key=" + apikey + "&client_key=" + clientkey; httpGetAsync(cat_url,tenorCallback_terms); // data will be loaded by each call's callback return; } // SUPPORT FUNCTIONS ABOVE // MAIN BELOW // start the flow grab_data(); </script> <style> .container { position: relative; text-align: center; color: white; } .title { text-align: center; } .centered { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style> <body> <h2 class="title">Trending Terms</h2> <div class="container" id="res"> </div> </body> </html>
Objective-C
NSString *apiKey = @"API_KEY"; NSString *clientKey = @"my_test_app"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self requestData]; return YES; } /** Execute web requests to retrieve trending terms. */ -(void)requestData { // Get the current list of categories - using the default locale of en_US NSString *categoryUrlString = [NSString stringWithFormat:@"https://tenor.googleapis.com/v2/trending_terms?key=%@&client_key=%@", apiKey, clientkey]; NSURL *categoryUrl = [NSURL URLWithString:categoryUrlString]; NSURLRequest *categoryRequest = [NSURLRequest requestWithURL:categoryUrl]; [self makeWebRequest:categoryRequest withCallback:tenorTermsResultsHandler]; // Data will be loaded by each request's callback } /** Async URL requesting function. */ -(void)makeWebRequest:(NSURLRequest *)urlRequest withCallback:(void (^)(NSDictionary *))callback { // Make the async request and pass the resulting JSON object to the callback NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSError *jsonError = nil; NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError]; if(jsonError != nil) { NSLog(@"%@", jsonError.localizedDescription); return; } // Push the results to our callback callback(jsonResult); }]; [task resume]; } /** Web response handler for GIF categories. */ void (^tenorTermsResultsHandler)(NSDictionary *) = ^void(NSDictionary *response) { // Parse the JSON response NSDictionary *terms = response[@"results"]; // Load the categories into your view NSLog(@"Trending Terms: %@", terms); };
Đăng ký chia sẻ
URL cơ sở
https://tenor.googleapis.com/v2/registershare?<parameters>
Đăng ký hoạt động chia sẻ ảnh GIF hoặc hình dán của người dùng.
Các phương pháp hay nhất
- Để phân biệt các hoạt động tích hợp, hãy cung cấp một tham số
client_key
cùng vớikey
của API. - Cung cấp cụm từ tìm kiếm. Điều này giúp tinh chỉnh thêm AI của Công cụ tìm kiếm của Tenor, giúp người dùng dễ dàng tìm thấy ảnh GIF hoặc hình dán phù hợp hơn.
- Sử dụng tham số
locale
để tăng mức độ liên quan theo khu vực của tín hiệu chia sẻ. Giá trị mặc định làen_US
.
Thông số
Bảng sau đây cung cấp thông tin chi tiết về các tham số cho điểm cuối Register Share:
Thông số | |
---|---|
key |
Bắt buộc
Khoá API để truy cập API đặc quyền Không có giá trị mặc định. |
id |
Bắt buộc
Không có giá trị mặc định. |
client_key |
Strongly recommended (Rất nên dùng)
Một chuỗi do ứng dụng chỉ định, đại diện cho hoạt động tích hợp. Khoá ứng dụng cho phép bạn sử dụng cùng một khoá API trên nhiều hoạt động tích hợp nhưng vẫn có thể phân biệt chúng. Đối với một hoạt động tích hợp ứng dụng, hãy sử dụng cùng một giá trị Mọi hành vi tuỳ chỉnh của ứng dụng sẽ được kích hoạt bằng cách ghép nối các tham số Không có giá trị mặc định. |
country |
Strongly recommended (Rất nên dùng)
Chỉ định quốc gia xuất xứ của yêu cầu. Để làm như vậy, hãy cung cấp mã quốc gia gồm 2 chữ cái theo tiêu chuẩn ISO 3166-1. Giá trị mặc định là |
locale |
Strongly recommended (Rất nên dùng)
Chỉ định ngôn ngữ mặc định để diễn giải chuỗi tìm kiếm. Bạn có thể dùng mã quốc gia mà bạn cung cấp trong Giá trị mặc định là |
q |
Strongly recommended (Rất nên dùng)
Chuỗi tìm kiếm dẫn đến lượt chia sẻ này. Không có giá trị mặc định. |
Định dạng phản hồi
Không có phản hồi chính thức cho điểm cuối Register Share. Nhà phát triển có thể kiểm tra mã phản hồi HTTPS để xác định xem họ đã truy cập thành công vào API hay chưa.
Ví dụ về yêu cầu
Curl
/* register share */ curl "https://tenor.googleapis.com/v2/registershare?id=16989471141791455574&key=API_KEY&client_key=my_test_app&q=excited"
Python
# set the apikey apikey = "API_KEY" # click to set to your apikey ckey = "my_test_app" # set the client_key for the integration # get the GIF's id and search used shard_gifs_id = top_8gifs["results"][0]["id"] search_term = "excited" r = requests.get("https://tenor.googleapis.com/v2/registershare?id=%s&key=%s&client_key=%s&q=%s" % (shard_gifs_id, apikey, ckey, search_term)) if r.status_code == 200: pass # move on else: pass # handle error
Android/Java
import android.app.Application; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; public class App extends Application { private static final String API_KEY = "API_KEY"; private static final String CLIENT_KEY = "my_test_app"; private static final String LogTag = "TenorTest"; @Override public void onCreate() { super.onCreate(); new Thread() { @Override public void run() { // test values for the share example final String gifId = "16989471141791455574"; final String searchTerm = "excited"; // make the register share call JSONObject shareResult = registerShare(gifId, searchTerm); // load the results for the user Log.v(LogTag, "Share Results: " + shareResult.toString()); } }.start(); } /** * Register the GIF share */ public static JSONObject registerShare(String gifId, String searchTerm) { // make register share request - using default locale of EN_US final String url = String.format("https://tenor.googleapis.com/v2/registershare?key=%1$s&client_key=%2$s&id=%3$s&q=%4$s", API_KEY, CLIENT_KEY, gifId, searchTerm); try { return get(url); } catch (IOException | JSONException ignored) { } return null; } /** * Construct and run a GET request */ private static JSONObject get(String url) throws IOException, JSONException { HttpURLConnection connection = null; try { // Get request connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // Handle failure int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_CREATED) { String error = String.format("HTTP Code: '%1$s' from '%2$s'", statusCode, url); throw new ConnectException(error); } // Parse response return parser(connection); } catch (Exception ignored) { } finally { if (connection != null) { connection.disconnect(); } } return new JSONObject(""); } /** * Parse the response into JSONObject */ private static JSONObject parser(HttpURLConnection connection) throws JSONException { char[] buffer = new char[1024 * 4]; int n; InputStream stream = null; try { stream = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while (-1 != (n = reader.read(buffer))) { writer.write(buffer, 0, n); } return new JSONObject(writer.toString()); } catch (IOException ignored) { } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } return new JSONObject(""); } }
Swift 2.0+/iOS
let apikey = "API_KEY" let clientkey = "my_test_app" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // test values for the share example let gifId = "16989471141791455574" let searchTerm = "excited" // register the user's share registerShare(gifId: gifId, searchTerm: searchTerm) return true } // Function for handling a user's selection of a GIF to share. // In a production application, the GIF id should be the "id" field of the GIF response object that the user selected // to share. The search term should be the user's last search. func registerShare(gifId: String, searchTerm: String) { // Register the user's share - using the default locale of en_US let shareRequest = URLRequest(url: URL(string: String(format: "https://tenor.googleapis.com/v2/registershare?key=%@&client_key=%@&id=%@&q=%@", apikey, clientkey, gifId, searchTerm))!) makeWebRequest(urlRequest: shareRequest, callback: tenorShareHandler) // Data will be loaded by each request's callback } /** Async URL requesting function. */ func makeWebRequest(urlRequest: URLRequest, callback: @escaping ([String:AnyObject]) -> ()) { // Make the async request and pass the resulting JSON object to the callback let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in do { if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] { // Push the results to our callback callback(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } } task.resume() } /** Web response handler for search requests. */ func tenorShareHandler(response: [String:AnyObject]) { // no response expected from the registershare endpoint }
JavaScript
<!DOCTYPE html> <html> <script> // url Async requesting function function httpGetAsync(theUrl, callback) { // create the request object var xmlHttp = new XMLHttpRequest(); // set the state change callback to capture when the response comes in xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } } // open as a GET call, pass in the url and set async = True xmlHttp.open("GET", theUrl, true); // call send with no params as they were passed in on the url string xmlHttp.send(null); return; } // callback for share event function tenorCallback_share(responsetext) { // no action is needed in the share callback } // function to call the register share endpoint function send_share(search_term,shared_gifs_id) { // set the apikey and limit var apikey = "API_KEY"; var clientkey = "my_test_app"; var share_url = "https://tenor.googleapis.com/v2/registershare?id=" + shared_gifs_id + "&key=" + apikey + "&client_key=" + clientkey + "&q=" + search_term; httpGetAsync(share_url,tenorCallback_share); } // SUPPORT FUNCTIONS ABOVE // MAIN BELOW // grab search term from cookies or some other storage search_term = "excited"; // GIF id from the shared gif // shared_gifs_id = gif_json_response_object_from_search["results"][0]["id"] shared_gifs_id = "16989471141791455574"; // example // send the share notifcation back to Tenor send_share(search_term,shared_gifs_id); alert("share sent!"); </script> <body> </body> </html>
Objective-C
NSString *apiKey = @"API_KEY"; NSString *clientKey = @"my_test_app"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self requestData]; return YES; } /** Function for handling a user's selection of a GIF to share. In a production application, the GIF id should be the "id" field of the GIF response object that the user selected to share. The search term should be the user's last search. */ -(void)requestData { // the test search term NSString *searchQuery = @"excited"; NSString *gifId = @"16989471141791455574"; // Send the share event for the GIF id and search query NSString *UrlString = [NSString stringWithFormat:@"https://tenor.googleapis.com/v2/registershare?id=%@&key=%@&client_key=%@&q=%@", gifId, apiKey, clientKey, searchQuery]; NSURL *searchUrl = [NSURL URLWithString:UrlString]; NSURLRequest *searchRequest = [NSURLRequest requestWithURL:searchUrl]; [self makeWebRequest:searchRequest withCallback:tenorSearchResultsHandler]; // Data will be loaded by each request's callback } /** Async URL requesting function. */ -(void)makeWebRequest:(NSURLRequest *)urlRequest withCallback:(void (^)(NSDictionary *))callback { // Make the async request and pass the resulting JSON object to the callback NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NStopGifsError *jsonError = nil; NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError]; if(jsonError != nil) { NSLog(@"%@", jsonError.localizedDescription); return; } // Push the results to our callback callback(jsonResult); }]; [task resume]; } /** Web response handler for registered shares */ void (^tenorShareResultsHandler)(NSDictionary *) = ^void(NSDictionary *response) { // no response expected from the registershare endpoint. };
Bài đăng
URL cơ sở
https://tenor.googleapis.com/v2/posts?<parameters>
Nhận ảnh GIF, hình dán hoặc kết hợp cả hai cho các mã nhận dạng được chỉ định.
Các phương pháp hay nhất
- Để phân biệt các hoạt động tích hợp, hãy cung cấp một tham số
client_key
cùng vớikey
của API. - Để giảm số lượng định dạng GIF được trả về, hãy sử dụng tham số
media_filter
. Điều này có thể giảm kích thước Đối tượng phản hồi xuống 75%.
Thông số
Bảng sau đây cung cấp thông tin chi tiết về các tham số cho điểm cuối Bài đăng:
Thông số | |
---|---|
key |
Bắt buộc
Khoá API để truy cập API đặc quyền Không có giá trị mặc định. |
ids |
Bắt buộc
Danh sách mã nhận dạng Đối tượng phản hồi được phân tách bằng dấu phẩy. Không có giá trị mặc định và giá trị tối đa là |
client_key |
Strongly recommended (Rất nên dùng)
Một chuỗi do ứng dụng chỉ định, đại diện cho hoạt động tích hợp. Khoá ứng dụng cho phép bạn sử dụng cùng một khoá API trên nhiều hoạt động tích hợp nhưng vẫn có thể phân biệt chúng. Đối với một hoạt động tích hợp ứng dụng, hãy sử dụng cùng một giá trị Mọi hành vi tuỳ chỉnh của ứng dụng sẽ được kích hoạt bằng cách ghép nối các tham số Không có giá trị mặc định. |
media_filter |
Strongly recommended (Rất nên dùng)
Danh sách các định dạng GIF được phân tách bằng dấu phẩy để lọc Đối tượng phản hồi. Theo mặc định, Ví dụ: Không có giá trị mặc định. |
Định dạng phản hồi
Bảng sau đây cung cấp thông tin chi tiết về định dạng phản hồi cho điểm cuối Bài đăng:
Khoá | |
---|---|
results |
Một mảng Đối tượng phản hồi tương ứng với các đối tượng được truyền trong danh sách |
Ví dụ về yêu cầu
Curl
/* Posts endpoint */ curl "https://tenor.googleapis.com/v2/posts?key=API_KEY&client_key=my_test_app&ids=11586094175715197775"
Python
apikey = "API_KEY" # click to set to your apikey ckey = "my_test_app" # set the client_key for the integration # our gif id gifid = "11586094175715197775" # get the specific gif r = requests.get( "https://tenor.googleapis.com/v2/posts?ids=%s&key=%s&client_key=%s" % (gifid, apikey,ckey)) if r.status_code == 200: # load the GIFs using the urls for the smaller GIF sizes gifs = json.loads(r.content) print(gifs) else: gifs = None
Android/Java
import android.app.Application; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; public class App extends Application { private static final String API_KEY = "API_KEY"; private static final String CLIENT_KEY = "my_test_app"; private static final String LogTag = "TenorTest"; @Override public void onCreate() { super.onCreate(); new Thread() { @Override public void run() { final String gif_id ="11586094175715197775"; // get the requested gif JSONObject gifResult = getGifResults(gif_id); // load the results for the user Log.v(LogTag, "Gif Results: " + gifResult.toString()); } }.start(); } /** * Get Search Result GIFs */ public static JSONObject getGifResults(String gif_id) { final String url = String.format("https://tenor.googleapis.com/v2/posts?ids=%1$s&key=%2$s&client_key=%3$s", gif_id, API_KEY, CLIENT_KEY); try { return get(url); } catch (IOException | JSONException ignored) { } return null; } /** * Construct and run a GET request */ private static JSONObject get(String url) throws IOException, JSONException { HttpURLConnection connection = null; try { // Get request connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // Handle failure int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_CREATED) { String error = String.format("HTTP Code: '%1$s' from '%2$s'", statusCode, url); throw new ConnectException(error); } // Parse response return parser(connection); } catch (Exception ignored) { } finally { if (connection != null) { connection.disconnect(); } } return new JSONObject(""); } /** * Parse the response into JSONObject */ private static JSONObject parser(HttpURLConnection connection) throws JSONException { char[] buffer = new char[1024 * 4]; int n; InputStream stream = null; try { stream = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while (-1 != (n = reader.read(buffer))) { writer.write(buffer, 0, n); } return new JSONObject(writer.toString()); } catch (IOException ignored) { } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } return new JSONObject(""); } }
Swift 2.0+/iOS
let apikey = "API_KEY" let clientkey = "my_test_app" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { requestData() return true } /** Execute web request to the requested gif. */ func requestData() { // the test gif id let gifid = "11586094175715197775" // request the gif let searchRequest = URLRequest(url: URL(string: String(format: "https://tenor.googleapis.com/v2/posts?ids=%@&key=%@&client_key=%@", gifid, apikey, clientkey))!) makeWebRequest(urlRequest: searchRequest, callback: tenorgifHandler) // Data will be loaded by each request's callback } /** Async URL requesting function. */ func makeWebRequest(urlRequest: URLRequest, callback: @escaping ([String:AnyObject]) -> ()) { // Make the async request and pass the resulting JSON object to the callback let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in do { if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] { // Push the results to our callback callback(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } } task.resume() } /** Web response handler for search requests. */ func tenorgifHandler(response: [String:AnyObject]) { // Parse the JSON response let responseGifs = response["results"]! // Load the GIFs into your view print("Result GIFS: (responseGifs)") } }
JavaScript
<!DOCTYPE html> <html> <script> // url Async requesting function function httpGetAsync(theUrl, callback) { // create the request object var xmlHttp = new XMLHttpRequest(); // set the state change callback to capture when the response comes in xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } } // open as a GET call, pass in the url and set async = True xmlHttp.open("GET", theUrl, true); // call send with no params as they were passed in on the url string xmlHttp.send(null); return; } // callback for the requested gif function tenorCallback_gifs(responsetext) { // Parse the JSON response var response_objects = JSON.parse(responsetext); var gif = response_objects["results"]; // load the GIFs -- for our example we will load the first GIFs preview size (nanogif) and share size (gif) document.getElementById("preview_gif").src = gif[0]["media_formats"]["nanogif"]["url"]; document.getElementById("share_gif").src = gif[0]["media_formats"]["gif"]["url"]; return; } // function to call the trending and category endpoints function grab_data() { // set the apikey and limit var apikey = "API_KEY"; var clientkey = "my_test_app"; // GIF id var gif_id = "11586094175715197775"; // using default locale of en_US var search_url = "https://tenor.googleapis.com/v2/posts?ids=" + gif_id + "&key=" + apikey + "&client_key=" + clientkey; httpGetAsync(search_url,tenorCallback_gifs); // data will be loaded by each call's callback return; } // SUPPORT FUNCTIONS ABOVE // MAIN BELOW // start the flow grab_data(); </script> <body> <h2># 1 GIF loaded - preview image</h2> <img id="preview_gif" src="" alt="" style="width:220px;height:164px;"> <h2># 1 GIF loaded - share image</h2> <img id="share_gif" src="" alt="" style="width:498px;height:372px;"> </body> </html>
Objective-C
NSString *apiKey = @"API_KEY"; NSString *clientKey = @"my_test_app"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self requestData]; return YES; } /** Execute web request to retrieve the requested gif. */ -(void)requestData { NSString *gifid = @"11586094175715197775"; // Get the GIF NSString *UrlString = [NSString stringWithFormat:@"https://tenor.googleapis.com/v2/posts?key=%@&client_key=%@&ids=%@", apiKey, clientKey, gifid]; NSURL *searchUrl = [NSURL URLWithString:UrlString]; NSURLRequest *searchRequest = [NSURLRequest requestWithURL:searchUrl]; [self makeWebRequest:searchRequest withCallback:tenorgifResultsHandler]; // Data will be loaded by each request's callback } /** Async URL requesting function. */ -(void)makeWebRequest:(NSURLRequest *)urlRequest withCallback:(void (^)(NSDictionary *))callback { // Make the async request and pass the resulting JSON object to the callback NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NStopGifsError *jsonError = nil; NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError]; if(jsonError != nil) { NSLog(@"%@", jsonError.localizedDescription); return; } // Push the results to our callback callback(jsonResult); }]; [task resume]; } /** Web response handler for searches. */ void (^tenorgifResultsHandler)(NSDictionary *) = ^void(NSDictionary *response) { // Parse the JSON response NSDictionary *gif = response[@"results"]; // Load the GIFs into your view NSLog(@"GIF Results: %@", gif); };