Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Классический пинбол, как в древнем игровом автомате или в компактной игрушке: есть пружины, шарики и препятствия. В нашем варианте можно не только зарабатывать очки: чтобы пройти уровень, придется выполнить дополнительную миссию.

Пинбол Пикабу

Аркады, На ловкость, Казуальные

Играть

Топ прошлой недели

  • Rahlkan Rahlkan 1 пост
  • Tannhauser9 Tannhauser9 4 поста
  • alex.carrier alex.carrier 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
1
Kabzki
Kabzki
2 года назад
Лига программистов

Вопрос: откуда сервисы afisha или кассир.ру берут данные?⁠⁠

Есть сервисы-агрегаторы, которые генерируют массу актуальных событий, на которые можно купить билет, забронировать и т.д., плюс достаточно подробно описывают их (фото, цены, фишки, скидки и т д). Откуда они берут всю эту информацию? исключительно пользователи сами размещают? или они сами мониторят и вручную добавляют? как тогда договариваются, что через них можно, условно, оплатить билет в, условно, театре?

И дополнительный вопрос. Если кто помнит, был сервис Foursquare. Чек-ины. Потом он разделился на Swarm. Но в итоге стал самой большой геолокационной базой мест в мире. С открытым api. Кто то вопрос изучал интеграции с ними? как, сколько стоит и т д.

Гуглил, не нагуглил. Спасибо заранее за ответы.

[моё] IT Программирование API Текст
20
23
Web.Study
Web.Study
2 года назад
Web-технологии

4 редких API, которые встречаются в дикой природе JavaScript⁠⁠

В продолжение к этой статье я хочу вам рассказать о еще 4 API, которые не очень популярны, но могут выручить вас в некоторых ситуациях


Наш канал для новичков во Front-end

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Beacon API


Beacon API позволяет отправлять на сервер асинхронные и неблокирующие запросы (методом POST), которые гарантированно завершаются до выгрузки страницы, в отличие от XMLHttpRequest или Fetch API.


Одним из основных вариантов использования Beacon API является логгирование активности пользователей или отправка аналитических данных на сервер.


Раньше для этого приходилось прибегать к таким уловкам, как обработка событий unload или beforeunload глобального объекта Window с помощью синхронного XMLHttpRequest, например:


const someData = {
a: 1,
b: 2,
};
// страница будет выгружена только после отправки данного запроса
window.addEventListener("beforeunload", () => {
const xhr = new XMLHttpRequest(); 
xhr.open("POST", "https://example.com/beacon");
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
const params = new URLSearchParams(Object.entries(someData)); xhr.send(params); 
});


Интерфейс


Beacon API расширяет свойство navigator методом sendBeacon, который имеет следующую сигнатуру:

navigator.sendBeacon(url: string | URL, data?: BodyInit | null)

- url — адрес сервера;

- data — опциональные данные для отправки, которые могут быть строкой, объектом, ArrayBuffer, Blob, DataView, FormData, TypedArray или URLSearchParams.


sendBeacon возвращает логическое значение (true или false) — индикатор постановки data в очередь для передачи.


Пример использования


Создаем шаблон проекта с помощью Yarn и Vite на чистом JavaScript:

# rare-web-apis - название проекта
# --template vanilla - используемый шаблон
yarn create vite rare-web-apis --template vanilla

Переходим в созданную директорию, устанавливаем зависимости и запускаем сервер для разработки:

cd rare-web-apis
yarn
yarn dev

Определяем в файле main.js следующий обработчик:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Событие visibilitychange объекта document (подробнее о нем можно почитать по ссылке, приведенной в начале статьи) является более надежным способом определения состояния видимости страницы, чем события unload или beforeunload. В обработчике при скрытии страницы, например, при переключении вкладки или сворачивании страницы, с помощью sendBeacon по адресу https://example.com/beacon отправляются некоторые данные в форме URLSearchParams.


Результат переключения вкладки:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост
4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Поддержка — 96.8%.



Clipboard API



Clipboard API позволяет выполнять асинхронные операции записи/чтения текстовых и других данных в/из системного буфера обмена, а также обрабатывать события copy, cut и paste (копирование, вырезка и вставка) буфера.

По причинам безопасности Clipboard API доступен только при условии, что:


- страница обслуживается по протоколу https или localhost;

- страница находится в активной вкладке браузера (не находится в фоновом режиме);

- операции записи/чтения инициализируются пользователем (например, с помощью нажатия кнопки).


Разрешение clipboard-write для записи данных предоставляется активной странице автоматически, а разрешение clipboard-read для чтения данных запрашивается у пользователя с помощью Permissions API.


Раньше для работы с содержимым редактируемой области использовался метод document.execCommand. Например, вот как выполнялась запись текста:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Интерфейс


Clipboard API расширяет свойство navigator интерфейсом Clipboard, экземпляры которого предоставляют следующие методы для работы с буфером:


- writeText(text: string) — для записи текста, принимает строку;

- readText() — для чтения текста, возвращает строку;

- write(data: ClipboardItem[]) — для записи данных, принимает массив объектов ClipboardItem (см. ниже);

- read() — для чтения данных, возвращает массив объектов ClipboardItem.


Поскольку речь идет об асинхронном интерфейсе, все названные методы возвращают промис, который разрешается данными или отклоняется с ошибкой.


ClipboardItem — это интерфейс, предназначенный для работы с нетекстовыми данными, который имеет следующую сигнатуру:

new ClipboardItem(
items: Record<string, string | Blob | PromiseLike<string | Blob>>,
options?: ClipboardItemOptions
)

- items — данные для записи в форме объектов, ключами которых являются MIME-типы, а значениями — строки, Blob или промисы, разрешающиеся строками или Blob;

- options — опциональные настройки (точнее, одна настройка — presentationStyle).


В действительности, ClipboardItem можно использовать также для работы с текстовыми данными, но есть один нюанс, о котором чуть позже.


Что касается событий copy, cut и paste, то их обработка обычно выполняется через свойство clipboardData события ClipboardEvent, которое содержит объект DataTransfer, предоставляющий следующие методы:


- setData(format: string, data: string) — для записи данных;

- getData(format: string) — для чтения данных;

- clearData() — для удаления данных и др.

Пример использования


Начнем с записи и чтения текста. Редактируем файл index.html следующим образом:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Получаем ссылки на DOM-элементы:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Определяем функцию копирования текста:


async function copyText() {
let textToCopy; 
// получаем выделение
const selectedText = getSelection().toString().trim(); 
// текстом для копирования является либо выделенный текст, либо содержимое `copyBox`
selectedText
? (textToCopy = selectedText)
: (textToCopy = copyBox.textContent.trim()); 
// если текст отсутствует
if (!textToCopy) {
logBox.textContent = "No text to copy"; 
return; 
}
try {
// записываем текст в буфер
await navigator.clipboard.writeText(textToCopy); 
logBox.textContent = "Copy success"; 
} catch (e) {
console.error(e); 
logBox.textContent = "Copy error"; 
}
}

Определяем функцию для вставки текста:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Наконец, регистрируем соответствующие обработчики:

copyBtn.addEventListener("click", copyText); 
pasteBtn.addEventListener("click", pasteText);

Обратите внимание: при первой вставке текста браузер запрашивает разрешение на чтение буфера. При отказе в разрешении выбрасывается исключение DOMException: Read permission denied.


Записать текстовые данные с помощью ClipboardItem можно следующим образом:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Обратите внимание: несмотря на то, что значением объекта ClipboardItem может быть строка (new ClipboardItem({ [type]: text })), при записи такого объекта в буфер выбрасывается исключение DOMException: Invalid Blob types.


Также обратите внимание, что при программной записи данных в случае, когда страница находится в фоновом режиме, выбрасывается исключение DOMException: Document is not focused.


Для извлечения данных из ClipboardItem используется метод getType:

const blob = await item.getType(type); 
const text = await blob.text(); 
console.log(text); // Text to copy

Добавим возможность копирования и вставки изображения, хранящегося на сервере.


Добавляем кнопки в index.html:

<div>
<button id="copy-img-btn">Copy remote image</button>
<button id="paste-img-btn">Paste remote image</button>
</div>

Определяем тип и функцию для копирования изображения:


const IMG_TYPE = "image/png";
async function copyRemoteImg() {
try {
const response = await fetch(
"https://images.unsplash.com/photo-1529788295308-1eace6f67388..."
);

// см. ниже
const blob = new Blob([await response.blob()], { type: IMG_TYPE });

// создаем элемент копирования

const item = new ClipboardItem({ [blob.type]: blob });
// записываем его в буфер
await navigator.clipboard.write([item]);

logBox.textContent = "Copy image success";
} catch (e) {
console.error(e);
logBox.textContent = "Copy image error";
}
}

Не уверен насчет других браузеров, но в Chrome наблюдается следующее:


- при преобразовании изображения из тела ответа в Blob с помощью response.blob() дефолтным типом становится image/jpeg (независимо от типа запрашиваемого изображения);

- при попытке записи такого Blob в буфер выбрасывается исключение DOMException: Type image/jpeg not supported on write.


Поэтому приходится выполнять двойное преобразование с помощью new Blob([await response.blob()], { type: IMG_TYPE });.


Определяем функцию для чтения данных из буфера и вставки изображения:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Итерация по item.types является безопасной, в отличие от прямого обращения к item.getType() — при отсутствии типа выбрасывается исключение DOMException: Failed to execute 'getType' on 'ClipboardItem': The type was not found.


Регистрируем соответствующие обработчики:

copyImgBtn.addEventListener("click", copyRemoteImg); pasteImgBtn.addEventListener("click", pasteRemoteImg);

Реализуем модификацию копируемых и вставляемых данных.


Редактируем index.html:


<textarea cols="30" rows="10" id="text-area">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Libero, labore.</textarea>

Определяем функцию модификации копируемых данных:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Данная функция добавляет к копируемому тексту строку copied from MySite.com.


Определяем функцию модификации добавляемых данных:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Данная функция переводит добавляемый текст в верхний регистр.


Обратите внимание, что в обоих случаях отключается стандартная обработка события браузером с помощью e.preventDefault().


Регистрируем соответствующие обработчики:

textArea.addEventListener("copy", onCopy); textArea.addEventListener("paste", onPaste);

Поддержка — 95.08%.



Notifications API


Notifications API позволяет отображать системные уведомления. Особенность этих уведомлений состоит в том, что они находятся вне контекста окна браузера, поэтому могут отображаться даже если пользователь сменил вкладку или свернул окно. Данный интерфейс разработан таким образом, что совместим со встроенными механизмами уведомлений на большинстве платформ.


Интерфейс


Для запроса разрешения на показ уведомлений используется метод Notification.requestPermission. Данный метод возвращает промис, который разрешается или отклоняется со статусом разрешения. Статус разрешения содержится в свойстве Notification.permission и может иметь одно из трех значений:


- default — запрос на разрешение не выполнялся, уведомления не отображаются;

- granted — пользователь предоставил разрешение, уведомления отображаются;

- denied — пользователь отклонил запрос, уведомления не отображаются.


Для создания уведомления используется конструктор Notification, который имеет следующую сигнатуру:

new Notification(title: string, options?: NotificationOptions | undefined)

- title: string — заголовок уведомления;

- options — опциональный объект с настройками, такими как:

- body: string — тело уведомления;

- icon: string — ссылка на иконку;

- tag: string — тег, используемый для идентификации уведомления. Тег позволяет обновлять уведомления без их отображения, что может быть полезным при большом количестве уведомлений;

- image: string — ссылка на изображение;

- data: any — данные, ассоциированные с уведомлением и др.


Для закрытия уведомления используется метод notification.close.


Notifications API позволяет обрабатывать следующие события:


- show — отображение уведомления;

- close — закрытие уведомления;

- click — нажатие на уведомление;

- error.


Пример использования


В качестве примера реализуем отображение уведомлений о скрытии страницы. При клике по уведомлению в контейнер для логгов будет выводиться соответствующее сообщение.


Определяем в index.html кнопку для запроса разрешения на показ уведомлений:

<button id="notification-btn">Enable notifications</button>

Регистрируем соответствующий обработчик в main.js:

notificationBtn.addEventListener("click", () => { Notification.requestPermission();
});
Определяем переменные для уведомления и идентификатора таймера, а также функцию для создания уведомления:
4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Несмотря на то, что большинство браузеров автоматически уничтожают уведомления по прошествии некоторого времени (около 4 сек), рекомендуется делать это явно.


Расширяем обработку изменения состояния видимости страницы:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Включаем уведомления:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Переключаем вкладку:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

При клике по уведомлению на странице приложения появляется сообщение Notification clicked.


Обратите внимание: при нахождении в другой вкладке уведомление уничтожается через 3 сек, а при возвращении в приложение — сразу.


Поддержка оставляет желать лучшего — 79.86%.



Performance API


Performance API позволяет измерять задержку в приложении на стороне клиента. Интерфейсы Performance (интерфейсы производительности) считаются высокоточными (high resolution), поскольку имеют точность, равную тысячным миллисекунды (точность зависит от ограничений аппаратного или программного обеспечения). Данные интерфейсы используются для вычисления частоты кадров (например, в анимации) и бенчмаркинге (например, для измерения времени загрузки ресурса).


Поскольку системные часы (system clock) платформы подвергаются различным корректировкам (таким как коррекция времени по NTP), интерфейсы Performance поддерживают монотонные часы (monotonic clock), т.е. время, которое все время увеличивается. Для этого Performance API определяет тип DOMHighResTimeStamp вместо использования интерфейса Date.now().


DOMHighResTimeStamp представляет высокоточную отметку времени (point in time). Данный тип является double и используется интерфейсами производительности. Значение DOMHighResTimeStamp может быть дискретной отметкой времени или разницей между двумя такими отметками.


Единицей DOMHighResTimeStamp является миллисекунда с точностью до 5 микросекунд. Если браузер не может обеспечить такую точность, допускается представление значения в миллисекундах с точностью до миллисекунды.


Интерфейс


Основным методом, предоставляемым Performance API, является метод now, который возвращает DOMHighResTimeStamp, значение которого зависит от времени создания контекста браузера или воркера (worker).

Кроме этого, рассматриваемый интерфейс содержит два основных свойства:


- timing — возвращает объект PerformanceTiming, содержащий такую информацию, как время начала навигации, время начала и завершения перенаправлений, время начала и завершения ответов и т.д.;

- navigation — возвращает объект PerformanceNavigation, представляющий тип навигации, происходящей в текущем контексте браузера, такой как переход к странице из истории, по ссылке и т.п.


Пример использования


В качестве примера реализуем функцию для измерения времени выполнения другой функции.


Редактируем main.js:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Определяем функцию вычисления факториала числа и измеряем время ее выполнения:

const getFactorial = (n) => (n <= 1 ? 1 : n * getFactorial(n - 1)); howLong(getFactorial)(12);

Определяем функцию получения данных из сети и измеряем время ее выполнения:

const fetchSomething = (url) => fetch(url).then((r) => r.json()); howLong(fetchSomething)("https://jsonplaceholder.typicode.com/users?_limit=10");

Результат:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Поддержка — 97.17%.



Иии...


На этом все, надеюсь ты узнал что-то новое и применишь это на практике. Иначе зачем я писал этот и прошлый пост

Показать полностью 17
[моё] Программирование IT Javascript API Frontend Программист Длиннопост
1
24
Web.Study
Web.Study
2 года назад
Web-технологии

4 малоизвестных, но не маловажных API для Javascript⁠⁠

Недавно я копался на хабре и нашел подборку полезных API, которые при этом не мейнстримные. Решил поделиться ими с вами, чтобы вы их юзали на практике (а грех их не заюзать).


Наш канал для новичков во fron-end, где мы рассказываем не только о JS

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Page Visibility API


Данный интерфейс позволяет определять, когда пользователь покидает страницу. Точнее, он вызывает событие при каждом изменении состояния видимости (visibility status) страницы, например, когда пользователь сворачивает/разворачивает окно, переходит на другую вкладку и т.д.


Раньше для этого приходилось прибегать к таким уловкам, как обработка событий blur и focus. Соответствующий код выглядел так:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Приведенный код работает, но не совсем так, как ожидается. Поскольку событие blur вызывается, когда страница теряет фокус, оно может возникнуть, когда пользователь нажимает на поиск, диалоговое окно (alert), консоль или границу окна. События blur и focus сообщают нам о том, что страница активна, но не о том, видим или скрыт ее контент.


Случаи использования


Page Visibility API может использоваться для предотвращения выполнения операций, которые имеют значение, только когда пользователь видит страницу, или для выполнения фоновых операций. Еще несколько кейсов:


• приостановка воспроизведения видео, каруселей изображений (автослайдеров) или анимации, когда пользователь покидает страницу;

• если на странице отображаются данные в реальном времени, нет смысла их обновлять, если пользователь покинул страницу;

• отправка аналитических данных о действиях пользователя.


Интерфейс


Page Visibility API предоставляет 2 свойства и одно событие для получения доступа к состоянию видимости страницы:


• document.hidden — доступное только для чтения глобальное свойство. Признано устаревшим. Если страница скрыта, возвращается true, иначе — false;

• document.visibilityState — обновленная версия document.hidden. Возвращает 4 возможных значения:
• visible — страница видима или, если быть точнее, страница не свернута и находится в текущей вкладке;

• hidden — страница скрыта;

• prerender — начальное состояние видимой страницы: предварительный рендеринг;

• unloaded — страница выгружена из памяти;

• visibilitychange — событие объекта document, возникающее при изменении visibilityState:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Пример использования


В качестве примера рассмотрим приостановку видео и прекращение получения ресурсов из API, когда пользователь покидает страницу. Создаем шаблон проекта с помощью Vite и Yarn:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Переходим в созданную директорию, устанавливаем зависимости и запускаем сервер для разработки:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Приложение доступно по адресу http://localhost:3000.


Удаляем шаблонный код из файла main.js и добавляем элемент video в файле index.html:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Возвращаемся к main.js. Добавляем обработчик события visibilitychange объекта document:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

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


Получаем ссылку на элемент video и управляем воспроизведением видео в зависимости от видимости страницы:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Прим. пер.: приведенный код работать не будет: получаем ошибку Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.. Это объясняется тем, что вызов video.play() при изменении состояния видимости страницы на visible равносилен наличию у элемента video атрибута autoplay. Современные браузеры допускают автоматическое (без участия пользователя) воспроизведение видео только в режиме без звука. Соответственно, для того, чтобы код работал, как ожидается, элементу video необходимо добавить атрибут muted.


Когда пользователь покидает страницу, воспроизведение видео приостанавливается. Когда пользователь возвращается на страницу, воспроизведение видео продолжается.

Теперь рассмотрим пример прекращения выполнения запросов к API. Для этого напишем функцию, запрашивающую цитату из quotable.io. Добавляем в index.html элемент div для хранения цитаты:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Определяем в main.js функцию для получения произвольной цитаты с помощью Fetch API:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Приведенный код работает, но функция getQuote вызывается только один раз. Обернем ее в setInterval с интервалом в 10 секунд:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Если пользователь свернет окно или перейдет на другую вкладку, запросы все равно будут отправляться каждые 10 секунд. Давайте это исправим:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Теперь запросы будут выполняться только при условии, что страница находится в видимом состоянии.


Поддержка — 98.24%.


Web Share API


Web Share API предоставляет разработчикам доступ к встроенному механизму совместного использования (native sharing mechanism) операционной системы, что особенно актуально для мобильных телефонов. Данный интерфейс позволяет делиться текстом, ссылками и файлами без создания собственного механизма или использования сторонних решений.


Случаи использования


Web Share API позволяет делиться содержимым страницы в соцсетях или копировать его в буфер обмена пользователя.


Интерфейс


Web Share API предоставляет 2 метода:


• navigator.canShare(data): принимает данные для совместного использования и возвращает логическое значение — индикатор того, можно ли этими данными поделиться;

• navigator.share(data): возвращает промис, который разрешается в случае успешного шаринга (sharing) данных. Данный метод вызывает нативный механизм и принимает данные для шаринга. Обратите внимание: этот метод может вызываться только в ответ на действие пользователя (нажатие кнопки, переход по ссылке и т.п.) (требуется кратковременная активация). data — это объект со следующими свойствами:

• url — ссылка для шаринга;

• text — текст;

• title — заголовок;

• files — массив объектов File.



Пример использования


Возьмем последний пример и добавим возможность делиться цитатой. Добавляем соответствующую кнопку в index.html:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

В main.js получаем ссылку на эту кнопку и определяем функцию для шаринга данных:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Нам также потребуется глобальная переменная для хранения содержимого текущей цитаты:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Определяем обработчик нажатия кнопки:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Обратите внимание: Web Share API работает только в безопасном окружении. Это означает, что страница должна обслуживаться по протоколу https или wss.


Поддержка — 89.82%.



Broadcast Channel API


Broadcast Channel API позволяет контекстам браузера (browser contexts) обмениваться данными друг с другом. К браузерным контекстам относятся такие элементы, как окно, вкладка, iframe и т.д. По причинам безопасности контексты, обменивающиеся данными, должны принадлежать одному источнику (same origin). Один источник означает одинаковый протокол, домен и порт.


Случаи использования


Broadcast Channel API обычно используется для синхронизации окон и вкладок браузера для улучшения пользовательского опыта или повышения безопасности. Он также может применяться для уведомления одного контекста о завершении процесса в другом контексте. Другие примеры:


• авторизация пользователя во всех вкладках;

• отображение загруженного ресурса во всех вкладках;

• запуск сервис-воркера для выполнения фоновой задачи.


Интерфейс


Broadcast Channel API предоставляет объект BroadcastChannel, позволяющий обмениваться сообщениями с другими контекстами. Конструктор этого объекта принимает единственный аргумент: строку — идентификатор канала (channel identifier):

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

BroadcastChannel предоставляет 2 метода:


• broadcastChannel.postMessage(message): позволяет отправлять сообщения всем подключенным контекстам. В качестве аргумента данный метод принимает любой тип данных:
4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

• broadcastChannel.close(): закрываем канал коммуникации, что позволяет браузеру выполнить сборку мусора.


При получении сообщения возникает событие message. Это событие содержит свойство data с отправленными данными, а также другие свойства, позволяющие идентифицировать отправителя, такие как origin, lastEventId, source и ports:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Пример использования


Возьмем последний пример, создадим новый контекст и добавим возможность обмена цитатами между существующим и новым контекстами.

Создаем директорию new-context в корне проекта. Создаем в ней файл index.html следующего содержания:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Создаем файл new-context/main.js.


Получаем ссылку на div и создаем новый канал коммуникации:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Добавляем обработчик события message:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Создаем канал в основном main.js и редактируем функцию getQuote:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Прим. пер.: для того, чтобы запустить данный пример локально, необходимо сделать следующее:


• в корне проекта создаем файл vite.config.js следующего содержания:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

• запускаем сервер для разработки с помощью команды yarn dev;

• открываем 2 вкладки:
• по адресу http://127.0.0.1:5173/index.html;

• по адресу http://127.0.0.1:5173/new-context/index.html.


Поддержка — 92.3%.



Internationalization API


Шпаргалка по Internationalization API


При разработке приложения иногда требуется переводить его содержимое на другие языки. Однако простого перевода часто оказывается недостаточно, поскольку такие вещи, как даты, числа, единицы измерения и др. могут различаться в разных странах. Неправильный перевод таких вещей может привести к плохому пользовательскому опыту.


Предположим, что мы хотим отобразить на странице "10 ноября 2022 года" как "11/10/22". Эта дата в разных странах будет выглядеть по-разному:


• 11/10/22 или ММ/ДД/ГГ в США;

• 10/11/22 в Европе и Латинской Америке;

• 22/11/10 в Японии, Китае и Канаде.


Здесь на помощь приходит Internationalization API (или I18n). Данный интерфейс позволяет решить несколько групп задач, связанных с интернационализацией и локализацией, но в этой статье мы не будем погружаться в него слишком глубоко.


Интерфейс


Для определения страны пользователя в I18n используется идентификатор локали (или просто локаль) (locale identifier, locale). Локаль — это строка, представляющая страну, регион, диалект и другие характеристики. Если точнее, локаль — это строка, состоящая из подтегов (subtags), разделенных дефисом, например:


• zh — китайский (язык);

• zh-Hant — китайский (язык), традиционные иероглифы (сценарий — script);

• zh-Hang-TW — китайский (язык), традиционные иероглифы (сценарий), используемые на Тайване (регион).


Полный список подтегов можно найти в этом RFC.


I18n предоставляет объект Intl, который, в свою очередь, предоставляет несколько специальных конструкторов для работы с чувствительными к языку данными, наиболее интересными из которых являются следующие:


• Intl.DateTimeFormat — форматирование даты и времени;

• Intl.DisplayNames — форматирование названий языков, регионов и сценариев;

• Intl.Locale — генерация и манипуляция идентификаторами локалей;

• Intl.NumberFormat — форматирование чисел;

• Intl.RelativeTimeFormat — форматирование относительного времени (завтра, 2 дня назад и т.п.).


Пример использования


В качестве примера рассмотрим использование конструктора Intl.DateTimeFormat для форматирование свойства dateAdded цитат. Данный конструктор принимает 2 аргумента: строку locale для определения правил форматирование даты и объект options для кастомизации форматирования.


Прим. пер.: в качестве первого аргумента Intl.DateTimeFormat также принимает массив локалей. Например, для установки дефолтной локали пользователя в конструктор передается пустой массив ([]).


Объект, возвращаемый Intl.DateTimeFormat, предоставляет метод format, который принимает объект Date с датой для форматирования и объект options для кастомизации отображения форматированной даты:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Обратите внимание: мы установили настройку timeZone в значение UTC для того, чтобы при форматировании даты не учитывалось локальное время пользователя.


Определяем в main.js функцию для форматирования даты:

function formatDate(dateString) {
const date = new Date(dateString);
const dateTime = new Intl.DateTimeFormat([], { timeZone: "UTC" });
return dateTime.format(date);
}

Вызываем эту функцию внутри функции getQuote для форматирования свойства dateAdded:

const getQuote = async () => {
if (document.visibilityState !== "visible") return;
try {
// ...
const parsedQuote = `<q>${content}</q> <br> <p>- ${author}</p> <br> <p>Added on ${formatDate(
dateAdded
)}</p>`;
// ...
} catch (e) {
console.error(e); 
}
};

Поддержка — 97.74%.


Прим. пер.: на днях использовал Intl.DateTimeFormat для отображения даты и времени в коротком формате:

const getDateWithHoursAndMinutes = (date) => 
new Intl.DateTimeFormat([], {
dateStyle: "short",
timeStyle: "short",
}).format(date); 
console.log(getDateWithHoursAndMinutes(new Date())); // 23.09.2022, 21:30

Надеюсь, что вы, как и я, узнали что-то новое и не зря потратили время.

Благодарю за внимание и happy coding!

Показать полностью 25
[моё] Программирование IT Javascript API Frontend Длиннопост
3
9
Readluiforwin
Readluiforwin
2 года назад
QA Rules

Что такое web, mobile, api тестирование⁠⁠

Всем привет!

Очень часто можно услышать такие слова как web-тестирование, mobile-тестирование, api-тестирование.

Попробуем разобраться в этом простым языком.


Если говорить кратко, то web-тестирование - это проверка работы функционала на стороне веб-приложения, иначе говоря, что страницы, которые вы видите через браузер корректно отображают данные, которые приходят с сервера, а также логика на странице отрабатывает верно.


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


В данном случае в веб-части проверять мы будем именно то, что страница корректно отображает то, что приходит в ответе от сервера

Тут мы плавно переходим к api-тестированию (в нашем случае http-rest)


Целью api-тестирования является проверка логики работы сервера. Что же такое api? Простыми словами - это язык общения сервисов и приложений. Логика здесь такая: чтобы отобразить информацию, которая хранится на сервере, веб-приложение отправляет запрос на этот сервер по определенному пути, конечной точкой которого является эндпоинт (например, https://www.youtube.com/watch?v=dQw4w9WgXcQ, здесь эндпоинтом является /watch). Сервер же, в зависимости от эндпоина выполняет ту или иную функцию, и отдает ответ. Если по запрашиваемому приложением эндпоинту на сервере нет заранее запланированного ответа - вернется код 404 (например, https://www.youtube.com/watch12323).

Каждый ответ сервера можно разделить на условно 3 мажорные части: headers, status, body (но не только из них)

В headers содержаться заголовки ответа, например такой как Content-Type который говорит, какого типа будет содержаться контент в ответе.

В body помещается основная информация, в примере выше это будет самый лучший сотрудник: например, его ник, или имя-фамилия, ссылка на профиль.
В status содержится код ответа, который состоит из 3-х значного числа. По первой цифре которого можно понять что произошло с нашим запросом, всего есть 5 типов кодов, но самыми часто-встречаемыми являются: 2xx - запрос выполнен корректно, 4xx - ошибки на клиенте (например 404 - запрос по эндпоинту, которого не существует на сервере), 5хх - ошибки на сервере, например, при определенной комбинации входящих данных, сервер может вести себя некорректно.

Целью QA в данном случае будет являться проверить что все api ведут себя так, как было описано в спецификации к ним и/или по общепринятым стандартам (например, если api на корректный запрос присылает код 4xx - это некорректное поведение).

То есть отправили запрос с определенный набором параметров - проверили, что ответ соответствует ожиданию.


Mobile-тестирование - это проверка того, как работает мобильное приложение. Можно провести параллель с веб-тестирование, только клиентом в данном случае будет приложение, работающее под мобильным устройством. Тут есть (и очень много) подводные камни, потому что важной частью любого приложения является удобство использования (кнопка, требующая частого нажатия в левом верхнем углу приложения точно не будет отличной идеей - сами попробуйте туда дотянуться), либо, к примеру, такая вещь как обновление приложения - у разных пользователей могут оказаться разные версии приложения, но все они должны работать так, как изначально задумывалось.

На примере postman, запрос к google.com/ будет выглядеть так

Что такое web, mobile, api тестирование IT, Программирование, Полезное, Обучение, QA, Тестирование, Тестирование по, Мобильное тестирование, API, Длиннопост
Показать полностью 1
[моё] IT Программирование Полезное Обучение QA Тестирование Тестирование по Мобильное тестирование API Длиннопост
0
sbis.tensor
sbis.tensor
2 года назад

Как мы роботизировали документооборот ВкусВилла⁠⁠

Как мы роботизировали документооборот ВкусВилла Бизнес, Торговля, Программирование, Малый бизнес, Российское производство, Сбис, ЭДО, Электронная подпись, API, 1С

ВкусВилл — бренд полезных продуктов для здорового питания, сеть магазинов и сервис бесплатной доставки.

В цифрах ВВ — это:

● 29 760 сотрудников

● Более 1500 поставщиков

● 1300+ магазинов и 120 + дарксторов по всей России

Какие задачи решали

ВкусВилл ведет учет в 1C, а внутренний документооборот — в Synerdocs. Когда Synerdocs ушел с рынка, ВкусВиллу потребовалось срочно найти аналогичное решение. Обратились в Тензор. И в кратчайшие сроки наши инженеры не только внедрили ЭДО, но и роботизировали его — фактически разработали в СБИС модифицированную RPA-технологию.

Что такое роботизация и как мы это сделали

У ВкусВилла большие объемы внутренних документов — 30 000 в сутки, и их количество будет только расти. Большой объем документов — это внутреннее перемещение товаров между складами и магазинами. И 14 000 подписантов-сотрудников, ответственных за перемещения. Они должны подписывать накладную, когда товар, например, с одного склада перевозится в магазин. Но при таких объемах сложно контролировать весь процесс.


Выход был найден — роботизировать подписание документов, т.е. сделать так, чтобы вместо сотрудника подписание выполнял робот. Такая схема юридически законна и для системы действия робота ничем не отличаются от действий человека. Конечно, сотрудник дает письменное согласие на подписание документов от его лица и без его участия. Сам он не имеет доступа в систему. Бизнес-процесс выглядит так:


1. Отправитель формирует форму с необходимыми подписантами в 1С. Далее они поступают в СБИС по API.

2. Робот в цикле делает все сам: методами API создает документ и выполняет подписание за сотрудников.

3. Затем полностью подписанный документ со штампом ЭП выгружается в 1С и перемещается в архив.


Т.е. мы прописали робота-исполнителя команд «загрузи — подпиши одним сотрудником — подпиши другим — выгрузи». Для скорости обработки документов отправитель в 1С запускает сразу несколько очередей запросов параллельно. Такая схема позволяет вносить изменения в автоматизированные бизнес-процессы и добавлять новые в кратчайшие сроки.

Итоги и цифры

● Реализовали подписание 30 000 документов в сутки.

● Клиент использует НЭП вместо ПЭП — это дает большую юридическую защиту.

● Выполнили все работы за 1,5 месяца. Точно уложились в сроки по договору.

Показать полностью
[моё] Бизнес Торговля Программирование Малый бизнес Российское производство Сбис ЭДО Электронная подпись API 1С
9
11
eaborovkov
eaborovkov
2 года назад
IT News

Война Meta* против поставщиков серого API WhatsApp. Или что делать, если вы хотели перехитрить корпорацию⁠⁠

Спустя три года после выхода WABA (WhatsApp Business Api), разработчикам серых API начали прилетать иски и угрозы. Разбираемся что делать, если у вас есть действующий WhatsApp бот или вы поставщик серого API для WhatsApp. Инсайдерская информация, советы и прогнозы на будущее.

Война Meta* против поставщиков серого API WhatsApp. Или что делать, если вы хотели перехитрить корпорацию WhatsApp, API, Чат-бот, Бизнес, Интеграция, Viber, Telegram, Facebook, ВКонтакте, Meta, Длиннопост

Предыстория


WhatsApp появился в 2009 году. Белое официальное API (WABA) для него вышло только в 2018. И очевидно, что почти 10 лет миллионная аудитория мессенджера не могла оставаться без внимания. Предприниматели хотели взаимодействовать со своими клиентами в том мессенджере, который всем привычен.


Так появились поставщики серого API для WhatsApp.


Не смотря на то, что они хорошо работали (и зарабатывали) вплоть до 2022 года, в Facebook* (ныне Meta*) не сильно переживали про их существование. Иногда, со стороны Meta* были какие-то письма и попытки запугать серых разработчиков. Но, в большинстве своем, эти угрозы ничем не заканчивались. До суда не доходило.


В 2019 году, с выходом белого API, в сторону WhatsApp посмотрели и крупные компании, которые до этого неохотно шли на сотрудничество с серыми решениями. Meta* брала деньги за каждое отправленное сообщение и по началу продавала только крупным покупателям с большими чеками. К 2022 году цены снизились, условия упростились, появилось больше партнеров и, наконец, даже небольшие компании могут себе позволить подключиться к WABA.

Рынок поменялся, но не полностью


В какой-то момент, в 2022 году, Meta* наконец решила давить серых поставщиков. То ли пришло осознание, что серое API до сих пор дешевле (там нет оплаты за каждое сообщение), то ли просто решили остаться единственными на этом поприще — не известно.


Факт остается фактом. В начале 2022 года, компаниям поставщикам серого API опять начали приходить письма от Meta*. Там были не абстрактные обещания обратиться в суд, а уже весьма конкретные повестки. Многие даже выходили на диалог с юристами Meta*, где объяснялось, что-то в стиле “мы все равно вас задавим, поэтому лучше по-хорошему отползите в сторону”.


Мы, в Botcreators занимаемся разработкой чат-ботов уже более 4 лет. И, в какой-то момент, к нам обратился клиент, который хотел чат-бота для WhatsApp. В поисках способов закрыть ему задачу, мы познакомились с Никитой К. Именно он и поделился своим взглядом на эти события.

Никита на тот момент был одним из сооснователей одного из крупнейших поставщиков серого API для WhatsApp. Полностью его имя и компанию мы не называем по просьбе самого Никиты.

Далее слова Никиты:


Мы начали делать наше API в 2015 году, когда про WABA (WhatsApp Business Api) и близко не было речи. Ее (WABA) презентовали в 2018 году. А более-менее доступной она стала в 2020.
Долгое время мы держались среди лидеров подобных решений благодаря широкой функциональности нашей реализации. С Facebook* мы долго не пересекались.
Далее, в 2021 году, мы получили письмо с претензиями от юристов головного офиса уже компании Meta*. После общения с юристами, мы поняли, нам нужно переходить на WABA, а в самом плохом случае за вменяемый нам Copyright Infringement в США даже может грозить реальный срок до 5 лет.
Мы любили наш продукт, но выбора нам не оставили. Никакие условия и детали переговоров я не могу озвучивать. Но обернуться могло все сильно хуже. Нам оставили единственный выход: переход на WABA.
Какие выводы я могу сделать сейчас? Во-первых, Meta* основательно берется за этот растущий рынок. И сейчас все серые игроки на мушке. Нам точно известно, что списки серых провайдеров у них есть. Во-вторых, есть компании, которые за лояльность Meta* готовы приносить им информацию о неофициальных провайдерах. В-третьих, советую всем читать все обновления правил пользования WhatsApp и законодательство в области Copyright infringement, потому что многим кажется, что они ничего не нарушают.
Технически, неофициальное API может существовать дальше, но только в условии реально серого бизнеса, но Meta* будет давить юридически и технически. И я не уверен, что игра с такой корпорацией стоит свеч.

Конец цитаты.

Почему выбирали и выбирают WhatsApp, а не Telegram, VK или Viber?


Все просто: в WhatsApp можно чтобы бот “писал первым”. С этим есть куча нюансов в виде блокировок номера, ограничение на количество отправляемых сообщений и т.д. Но “ключевая особенность” именно в холодной рассылке.


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


В Telegram такая возможность появилась сравнительно недавно. И то, совсем “в холодную” чат-боты писать по прежнему не могут (надеюсь и не смогут). Чтобы бот написал якобы первым, надо, чтобы пользователь подписался на канал и как бы одновременно фоном стартанул бота (а то и не одного). А бот сразу удалил сообщение о старте и пропал в списке чатов, чтобы у пользователя в будущем сложилось ощущение, что бот ему пишет “в холодную”. И я сейчас не говорю про холодную рассылку с помощью Telegram API. Я про Telegram Bot API. Кому интересно подробнее, у нас была статья на эту тему.


Про VK, думаю, пояснять не надо. Чтобы бот мог тебе что-либо прислать, ты должен или на группу подписаться или сам начать с ним диалог. Исключение, разве что, только всякие hh.ru или Cdek, которые шлют уведомление в VK даже если ты на них не подписывался. У них договоры с VK.


Вот и получается, что когда вы сходили в салон красоты, то просьба об оценке визита вам приходит именно в WhatsApp. А не в Viber или Telegram или VK. При том, что записывались вы не через WhatsApp.

Будущее Meta* и WhatsApp Business API


В период с 2009 по 2022 год многие себе успели заказать чат-ботов для WhatsApp, либо слепить их на конструкторах. Если вы из их числа, то вот, что вам надо понять или выяснить:


- Как работает ваша интеграция? Через серое API или через белое? Спросите вашего поставщика услуг или коллег, кто этим занимался.


- WABA и серые решения устроены принципиально по разному. Если у Meta* интеграция сделана понятно где (в ядре), то серые поставщики API делают интеграцию в обход, часто через жуткие костыли. Поэтому переехать по щелчку пальцев с серого решения на белое, скорее всего, не получится.


- Скоро не останется серых поставщиков. Даже в условиях нашего рынка. Хотя бы потому, что им закроют техническую возможность поддерживать свои продукты. Ну или потому, что в Meta* очень плотно следят за всеми, кто пытается создать что-либо на базе их продуктов. И это инсайд, а не конспирология. Думать, что именно про вас в Meta* еще не слышали — большое заблуждение. Бояться их? Решать вам.


- Если вы собираетесь заказать себе WhatsApp бота, то внимательно смотрите, что вам предлагают. Цены на белое API очень разные у разных поставщиков. Публиковать я их тут не буду. Из понятных метрик скажу лишь, что у белого API не бывает бесплатной отправки сообщений. Они тарифицируют каждое отправленное сообщение.


Если вам предлагают сделать бота на WABA, то просите документы, подтверждающие, что они действительно используют WABA, а не делают вид, что используют.


Кстати, за 2021 и 2022 год цены на WABA снижаются. Рынок уплотняется и сама Meta* тоже снижает планку для провайдеров. Глядишь, к 2024 году цены будут адекватными и для микро бизнеса.

*Meta (ранее Facebook) запрещенная в РФ организация.

А еще у нас есть канал про чат-ботов https://t.me/botcreatorsru

Показать полностью 1
[моё] WhatsApp API Чат-бот Бизнес Интеграция Viber Telegram Facebook ВКонтакте Meta Длиннопост
3
zavlast
zavlast
3 года назад

Сила пикабу!⁠⁠

Ребят, помогите пожалуйста с ключом API GOOGLE translation, у меня сайт отслеживания грузит через api забугорного сайта на английском языке, а в модуле можно динамически переводить но только через google. В день максимум запросов 30. Российские карты не принимает билинг.
Без рейтинга.

[моё] API Google Санкции Без рейтинга Помощь Текст
2
552
Immortalique
Immortalique
3 года назад
Типичный программист

Хэй, Джейсон!⁠⁠

Хэй, Джейсон! Программирование, Json, IT юмор, Программист, AJAX, API, Юмор, Джейсон Вурхис, Картинка с текстом
Показать полностью 1
[моё] Программирование Json IT юмор Программист AJAX API Юмор Джейсон Вурхис Картинка с текстом
13
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии