Как установить параметры для API поиска изображений BING - PullRequest
0 голосов
/ 14 марта 2019

В настоящее время я работаю над школьным проектом, который использует API поиска изображений Bing.Моя цель - получить изображение профиля для каждого персонажа Звездных войн (как можно точнее).Я не понимаю почему, но API, кажется, не находит результатов с акцентами на символах.

Например, в приведенном ниже коде, когда searchTerm = "Han Solo" все работает, находят, но когда searchTerm = "Dormé" API не возвращаетлюбая картинка.

Странно, если я выполняю тот же поиск в bing напрямую, он находит много картинок, но я не получаю ни одного из API.

//server.js
app.get('/getPortrait/*', (req, res) => {  
    const serviceKey = "MY_KEY";

    let searchTerm = req.url.split('/').pop(); 
    // when searchTerme= "han solo", it works fine
    // when searchTerme= "Dormé", it works but returns no image in the response

    let credentials = new CognitiveServicesCredentials(serviceKey);
    let imageSearchClient = new Search.ImageSearchClient(credentials);

    let resultURL;

    const sendQuery = async () => {
        return await imageSearchClient.imagesOperations.search(searchTerm);
    };
    sendQuery().then(imageResults =>{
        console.debug(imageResults)
        if (imageResults == null || imageResults.value.length == 0) {
            console.error("No image results were found.");
            res.send(defaultPic);
        }
        else {
            resultURL = imageResults.value[0].contentUrl;
            console.log(resultURL);
            res.send(resultURL);
       }
    }).catch(err => {
        console.error(err)
        res.send(defaultPic);
    });
});

Есть ли способ настроить поиск напринимать все типы символов?

Вот результаты, которые я получаю для запросов на тезисы:

\\searchTerm = "Dormé"
Object {_type: "Images", value: Array(0)}
_type:"Images"
value:Array(0) []
__proto__:Object {constructor: , __defineGetter__: , __defineSetter__: , …}
\\searchTerm = "han solo"
Object {_type: "Images", readLink: "https://api.cognitive.microsoft.com/api/v7/images/…", webSearchUrl: "https://www.bing.com/images/search?q=han%20solo&FO…", totalEstimatedMatches: 868, nextOffset: 43, …}
nextOffset:43
readLink:"https://api.cognitive.microsoft.com/api/v7/images/search?q=han%20solo"
totalEstimatedMatches:868
value:Array(35) [Object, Object, Object, …]
webSearchUrl:"https://www.bing.com/images/search?q=han%20solo&FORM=OIIARP"
__proto__:Object {constructor: , __defineGetter__: , __defineSetter__: , …}
https://www.starwarsnewsnet.com/wp-content/uploads/2017/01/Alden-Ehrenreich-as-Han-Solo-4.jpg

Спасибо за помощь:)

1 Ответ

0 голосов
/ 11 июня 2019

Проблема не связана с поиском Bing Image напрямую, к сожалению, вы открыли чудесную банку с червями вокруг кодировки символов в node.js (и в Интернете в целом)

Чтобы продемонстрировать проблему,сначала напишите более простую версию вашего метода:

app.get('/getPortrait/*', (req, res) => {  
    const serviceKey = "MY_KEY";

    let searchTerm = req.url.split('/').pop(); 
    // when searchTerme= "han solo", it works fine
    // when searchTerme= "Dormé", it works but returns no image in the response

    // will return Dorm%C3%A9
    res.send(searchTerm);
});

Dorm%C3%A9 - это версия Dormé с кодировкой URL, которую ваш браузер автоматически сгенерировал, когда вы вводили ее в строку URL.Вы можете убедиться в этом, используя веб-сайт для декодирования URL-адресов, например: https://urldecode.org/?text=Dorm%25C3%25A9&mode=decode

Итак, вам необходимо декодировать это значение в своем коде, используя функцию decodeURI .

const sendQuery = async () => {
    return await imageSearchClient.imagesOperations.search(decodeURI(searchTerm));
};

И теперь этот запрос http://localhost:3000/getPortrait/Dorm%C3%A9 теперь возвращает следующее:

http://vignette2.wikia.nocookie.net/starwars/images/1/18/Dormesenate.jpg/revision/latest?cb=20070506233854

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...