Хорошо, в качестве быстрого предупреждения, это довольно глупая демонстрация. Я имею в виду, я знаю, что это мое дело — я человек, который делает демо с кошками. Но это на самом деле заходит слишком далеко. Неделю назад мне было скучно, и я нашел интересный API, API Sunrise Sunset. Это бесплатный API, который возвращает время восхода и захода солнца для определенного местоположения. Так что, очевидно, я увидел это и подумал, что это будет идеальная услуга для вампиров.

Я имею в виду — представьте, что вам хорошо и удобно в вашей невероятно готической гробнице, вы проснулись после приятного сна и не совсем уверены, который сейчас час.

Совет для профессионалов. Не ищите в Google вампирский склеп на работе. Источник

Или, возможно, вы знаете время, но не уверены, что солнце уже взошло. Здесь на помощь приходит API. Работать с API довольно просто — для основных параметров вы просто передаете долготу и широту. Я начал с создания этого действия OpenWhisk:

const rp = require('request-promise');

function main(args) {

    if(!args.lat || !args.lng) {
        return { error:'Parameters lat and lng are required.' };
    }

    return new Promise((resolve, reject) => {
        let now = new Date();
        let url = `https://api.sunrise-sunset.org/json?lat=${args.lat}&lng=${args.lng}&formatted=0`;
        let options = {
            uri:url,
            json:true
        };

        rp(options).then(result => {
            let data = result.results;
            /*
            if now < data.sunrise || now > data.sunset
            */
            let sunrise = new Date(data.sunrise);
            let sunset = new Date(data.sunset);
            
            resolve({result:(now < sunrise || now > sunset)});
        }).catch(err => {
            reject({error:err});
        });

    });

}

Сверху вниз — я выполняю небольшую базовую проверку параметров, а затем просто передаю запрос в API. Получив результат, я сравниваю текущее время с временем восхода и захода солнца для данного местоположения. Если текущее время после восхода солнца или после захода солнца, я возвращаю true. Я назвал это действиеVampireSafe, так что true означает, что да, это идеальное место для вампиров, чтобы выйти, хорошо провести время и т. д.

Я разместил это на OpenWhisk и включил его как веб-экшен, и на этом я полностью закончил с моим API-интерфейсом безопасности от вампиров. По сути, это заняло у меня минут десять или около того, а я уже сделал общественную услугу для монстров повсюду.

На стороне клиента я написал быстрое приложение с минимальным использованием HTML и JavaScript. Вот HTML:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">
        <style>
            body {
                background-color:black;
            }

            h1, div {
                color: red;
            }
        </style>
    </head>
    <body>

        <h1>Vampire Safe?</h1>

        <div id="status"></div>

        <script src="client.js"></script>
    </body>
</html>

Как видите, просто простая метка H1 и пустой div. Простите меня за встроенный стиль. А вот JavaScript:

let $status;
const API = 'https://openwhisk.ng.bluemix.net/api/v1/web/[email protected]_My%20Space/safeToDelete/isVampireSafe.json';
const GOOD = `<p>It is totally safe to be outside as a vampire. Happy Hunting!</p>`;
const BAD = `<p>Sorry, the sun is up. Stay indoors!</p>`;

document.addEventListener('DOMContentLoaded', init, false);
function init() {

    $status = document.querySelector('#status');

    //First, get location
    navigator.geolocation.getCurrentPosition(gotLoc,locErr);

}

function locErr(e) {
    console.log('location error', e);
    $status.innerHTML = `
    <p>
    You need to let this app know your location in order for it to work. Or maybe you did
    and somethig else went wrong. I'm truly sorry.
    </p>`;
}

function gotLoc(pos) {
    console.log('position',pos.coords);

    fetch(API+'?lat='+pos.coords.latitude+'&lng='+pos.coords.longitude).then((res) => {
        return res.json();
    }).then((res) => {
        console.log(res);
        if(res.result === true) {
            $status.innerHTML=GOOD;
        } else {
            $status.innerHTML=BAD;
        }
    });
}

Это просто сводится к быстрому вызову геолокации, а затем к моему API. Как только я получу свои результаты, я обновлю HTML. Вот снимок экрана в действии (обратите внимание, сейчас 13:49 по моему времени и около 200 градусов).

Конечно, если бы я хотел получить действительно точную информацию, я мог бы также проверить погоду и позволить вампирам выйти, если на улице облачно/шторм, но это, конечно, было бы глупой тратой времени.

Хотите попробовать сами? Вы можете посетить онлайн-сайт здесь: https://cfjedimaster.github.io/Serverless-Examples/vampire/client.html

Первоначально опубликовано на www.raymondcamden.com 27 июля 2017 г.