Pull to refresh

Как я опробовал Microsoft Project Oxford + Telegram Bot API

Reading time 4 min
Views 15K
Думаю, как уже понятно из названия, речь пойдет о таких вещах, как Microsoft Project Oxford и Telegram API.

Что такое Microsoft Project Oxford — набор готовых REST API, в доступной форме дающих разработчикам всю мощь алгоритмов машинного зрения, анализа естественного языка и распознавания голоса для использования в своих приложениях. Стоит отметить, что доступность сервисов в виде REST API позволяет использовать его на совершенно любых платформах и с помощью своих любимых технологий разработки, не ограничиваясь предложенными Microsoft. Более подробно — тут или тут.

Telegram Bot API — (думаю и так многие знают) кто не знает идет сюда.

Первое, что мне пришло в голову — самое простое сделать бота, который определяет возраст и пол человека на фото. Для этого нам нужно Face API и ключ API, все это можно получить на официальном сайте .

Итак, начнем (рассказывать о том, как создать бота, я не буду, т.к информации об этом куча). После того, как зарегистрировали бота, webhooks и получили ключ API, преступаем к написанию.

Писать решил на PHP. Почему? бес попутал

1) Получаем сообщение от пользователя:

require_once '/home/edalqrmq/php/HTTP/Request.php';
define('BOT_TOKEN', 'Token');
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/'); 
define('FILE_URL', 'https://api.telegram.org/file/bot'.BOT_TOKEN.'/');//для формирования ссылки на фото
$content = file_get_contents("php://input");
$update = json_decode($content, true);
$chatID = $update["message"]["chat"]["id"];

Примерно вот такой JSON:

{  
   "update_id":3405704853232,
   _"message":{  
      "message_id":238,
      "from":{  
         "id":138183417332,
         "first_name":"Kirill",
         "last_name":"Dudka"
      },
      "chat":{  
         "id":1381834173,
         "first_name":"Kirill",
         "last_name":"Dudka",
         "type":"private"
      },
      "date":1461168940323,
      "photo":[  
         {  
            "file_id":"AgADAgADw6gxG_mCPAjHE7knq2P_UUJfLyLw4AAgI",
            "file_size":1211,
            "width":90,
            "height":67
         },
         {  
            "file_id":"AgADAgADw6gxG_mCPAjHE7knDjERzAUtSA0ABGwI",
            "file_size":16846,
            "width":320,
            "height":240
         },
         {  
            "file_id":"AgADAgADw6gxG_mCPAjHE7knBB_ZFZmQI",
            "file_size":55547,
            "width":800,
            "height":600
         }
      ]
   }
}


2) Проверяем, на наличие фото и формируем ссылку на изображение:

if($update["message"]["photo"]){
$photoId = $update["message"]["photo"]["2"]["file_id"];
$url_json = file_get_contents(API_URL."getFile?file_id=".$photoId);
$massURL = json_decode($url_json, true);
$photoURL = FILE_URL.$massURL["result"]["file_path"];
}

3) Далее нам нужно отправить изображение на анализ, более подробно можно посмотреть тут:

$req = &new HTTP_Request('https://api.projectoxford.ai/face/v1.0/detect');
$req->setMethod(HTTP_REQUEST_METHOD_POST);

$req->addHeader('Content-Type','application/json');
$req->addHeader('Ocp-Apim-Subscription-Key','key');

$req->addQueryString('returnFaceId', 'true');
$req->addQueryString('returnFaceLandmarks', 'false');
$req->addQueryString('returnFaceAttributes', 'age,gender,smile');// параметры которые хотим узнать


$req->setBody('{"url":"'.$photoURL.'"}');

В ответ нам приходит, что-то подобное:


Pragma: no-cache
Cache-Control: no-cache
Date: Wed, 20 Apr 2016 18:31:59 GMT
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Length: 143
Content-Type: application/json; charset=utf-8
Expires: -1

[
  {
    "faceId": "a194a7b3-7e86-46fc-9b73-166e09127546581b",
    "faceRectangle": {
      "top": 80,
      "left": 24,
      "width": 162,
      "height": 162
    },
    "faceAttributes": {
      "age": 23.3
    }
  }
]


4) Дальше дело за малым, отправить данные пользователю:

try
{
    $req->sendRequest();
	$face_json = $req->getResponseBody();
	$massFace = json_decode($face_json, true);
	$age = $massFace["0"]["faceAttributes"]["age"];
	$gender_En = $massFace["0"]["faceAttributes"]["gender"];
	if(!$massFace["0"]["faceAttributes"]){
	$sendto = API_URL."sendmessage?chat_id=".$chatID."&text= Мило, но это не человек";
	}
	else{
	if($gender_En=="male"){
	$gender = "Мужской";
	}
	else{
	if($gender_En=="female"){
	$gender = "Женский";
	}
	}
	$sendto = API_URL."sendmessage?chat_id=".$chatID."&text= Пол: ".$gender." Возраст: ".$age;
	}
}
catch (HttpException $ex)
{
    echo $ex;
}
}
else
{
	$sendto = API_URL."sendmessage?chat_id=".$chatID."&text=Отправь мне фото";
}

file_get_contents($sendto);

Собственно на этом все, в итоге получилась такая картина:

image

Итого ушел час времени и немного кофе. Бот выводит информацию только о первом найденном лице, не ставил себе задачу написать бота на прод (пока что), Microsoft Project Oxford — достаточно интересное API, которое заслуживает внимания.

Всем спасибо.

Следующее Определяем пол и возраст с помощью Microsoft Project Oxford и C#
Да пребудут с вами ваши нейроны!
Tags:
Hubs:
+17
Comments 10
Comments Comments 10

Articles