| <!DOCTYPE html>
|
| <html>
|
| <head>
|
| <title>FastAPI Search Client</title>
|
| <style>
|
| body { font-family: Arial, sans-serif; max-width: 800px; margin: 20px auto; }
|
| .input-group { margin-bottom: 15px; }
|
| textarea { width: 300px; padding: 8px; resize: vertical; }
|
| #results { margin-top: 20px; }
|
| .result { margin-bottom: 15px; padding: 10px; border: 1px solid #ddd; }
|
| </style>
|
| </head>
|
| <body>
|
| <h2>FastAPI Search Client</h2>
|
|
|
| <div class="input-group">
|
| <label>API Key:</label><br>
|
| <textarea id="apiKey" placeholder="Enter your API_SECRET_KEY"></textarea>
|
| </div>
|
|
|
| <div class="input-group">
|
| <input type="text" id="query" placeholder="Enter search query and press Enter..."
|
| style="width: 300px; padding: 8px;">
|
| </div>
|
|
|
| <div id="results"></div>
|
|
|
| <script>
|
| const API_URL = 'https://huggingface.co/spaces/Almaatla/search';
|
|
|
| document.getElementById('query').addEventListener('keypress', async (e) => {
|
| if (e.key === 'Enter') {
|
| const apiKey = document.getElementById('apiKey').value.trim();
|
| const query = e.target.value.trim();
|
|
|
| if (!apiKey || !query) {
|
| alert('Please enter both API key and search query');
|
| return;
|
| }
|
|
|
| try {
|
| const response = await fetch(API_URL, {
|
| method: 'POST',
|
| headers: {
|
| 'Content-Type': 'application/json',
|
| 'X-API-Key': apiKey
|
| },
|
| body: JSON.stringify({
|
| query: query,
|
| engine: 'google',
|
| num_results: 10
|
| })
|
| });
|
|
|
| if (!response.ok) {
|
| throw new Error(`HTTP error! status: ${response.status}`);
|
| }
|
|
|
| const data = await response.json();
|
| displayResults(data);
|
| } catch (error) {
|
| console.error('Error:', error);
|
| document.getElementById('results').innerHTML = `
|
| <div class="error">
|
| Error: ${error.message}
|
| </div>
|
| `;
|
| }
|
| }
|
| });
|
|
|
| function displayResults(data) {
|
| const results = document.getElementById('results');
|
| let html = '';
|
|
|
| if (data.organic_results?.length > 0) {
|
| html += '<h3>Search Results:</h3>';
|
| data.organic_results.forEach(result => {
|
| html += `
|
| <div class="result">
|
| <a href="${result.link}" target="_blank">${result.title}</a>
|
| <p>${result.snippet}</p>
|
| <small>${result.displayed_link}</small>
|
| </div>
|
| `;
|
| });
|
| }
|
|
|
| if (data.related_searches?.length > 0) {
|
| html += '<h3>Related Searches:</h3>';
|
| data.related_searches.forEach(search => {
|
| html += `
|
| <div class="result">
|
| ${search.query}
|
| </div>
|
| `;
|
| });
|
| }
|
|
|
| results.innerHTML = html || '<p>No results found</p>';
|
| }
|
| </script>
|
| </body>
|
| </html>
|
|
|