Как наследуется группа крови?
Кровь состоит из жидкой части — плазмы и различных клеток кpoви (форменных элементов). Плазма содержит белки, минеральные вещества. Форменные элементы крови — эритроциты, лейкоциты, тромбоциты. Объем кpoви составляет 6—8% от массы тела — это около 5 литров. Кровь выполняет ряд важных функций: транспортирует кислород, углекислый газ и питательные вещества; распределяет тепло по всему организму; обеспечивает водно-солевой обмен; доставляет гормоны и другие регулирующие вещества к различным органам; несет защитную (иммунную) функцию.
Различия между людьми по группам крови — это различия по составу определенных антигенов и антител.
Существование групп крови стало известно лишь в начале прошлого века, в 1900-1902 годах, когда австрийский ученый Карл Ландштейнер установил, что при смешивании крови двух разных людей в одних случаях эритроциты склеиваются, в других – нет. Значит, кровь не у всех одинакова, и есть группы крови совместимые и несовместимые. Это открытие имело огромное значение, так как оно подсказало способ безопасного переливания крови: надо только определить ее совместимость.
Еще через 20 с лишним лет стало известно, что группы крови передаются по наследству и что наследование происходит в строгом соответствии с законами генетики.
Любой наследственный признак контролируется по меньшей мере парой генов, один из которых ребенок получает от матери, другой от отца. И в этом случае тоже родители передают ребенку не «готовую» группу крови, а по одному гену, ответственному за ее формирование. От взаимодействия этих генов и зависит, какая будет группа крови у ребенка: такая, как у отца, такая, как у матери, или же в результате комбинации генов возникнет третий вариант.
Изучая строение красных клеток крови, Ландштайнер обнаружил особые вещества. Он поделил их на две категории, А и В, выделив третью, куда отнес клетки, в которых их не было. Позже, его ученики обнаружили эритроциты, содержащие маркеры А- и В-типа одновременно.
В результате исследований возникла система деления по группам крови, которая получила название АВО (читается а, б, ноль), в которой различают четыре группы. Этой системой мы пользуемся до сих пор.
- I (0) – группа крови характеризуется отсутствием антигенов А и В;
- II (А) – устанавливается при наличии антигена А;
- III (В) – устанавливается при наличии антигенов В;
- IV (АВ) – устанавливается при наличии антигенов А и В.
I группу называют нулевой и обозначают ее – 00, что указывает на наличие двух одинаковых генов, определивших признак группы, — один ноль получен от отца, другой – от матери.
Если у ребенка выявлена I группа крови, это значит, что и у отца, и у матери обязательно есть ген 0, но совсем не значит, что у них тоже I группа, так как их вторые гены могли быть иными.
Ген II группы обозначается буквой А. И если ребенок получит от обоих родителей по такому гену, то у него, конечно, будет II группа крови (АА). Но такая же группа будет у него и если он получит от одного из родителей ген 0, а от другого – А, так как у гена 0 есть одна особенность — он не может проявить себя в присутствии гена А.
Ген III группы крови обозначают буквой В. Эта группа также образуется у тех, кто получил от родителей два одинаковых гена ВВ или два разных – В и 0, ибо и в этом сочетании ген 0 себя не проявляет.
А что будет, если от одного из родителей ребенок унаследует ген А, а от другого – ген В? По отношению друг к другу они терпимы, один другого не подавляет, и их сочетание приводит к появлению нового признака – IV группы крови (АВ).
Таблица наследования группы крови ребенком в зависимости от групп крови отца и матери
| Мама + Папа | Группа крови ребенка: Возможные варианты (в %) | |||
| I+ I | I (100%) | — | — | — |
| I + II | I (50%) | II (50%) | — | — |
| I + III | I (50%) | — | III (50%) | — |
| I + IV | — | II (50%) | III (50%) | — |
| II + II | I (25%) | II (75%) | — | — |
| II + III | I (25%) | II (25%) | III (25%) | IV (25%) |
| II + IV | — | II (50%) | III (25%) | IV (25%) |
| III + III | I (25%) | — | III (75%) | — |
| III + IV | — | II (25%) | III (50%) | IV (25%) |
| IV + IV | — | II (25%) | III (25%) | IV (50%) |
Наследование резус-фактора
Рождение ребенка с отрицательным резус-фактором в семье с резус- положительными родителями в лучшем случае вызывает глубокое недоумение, в худшем – недоверие. Упреки и сомнения в верности супруги. Как ни странно, ничего исключительного в этой ситуации нет. Существует простое объяснение такой щекотливой проблемы.
Резус-фактор представляет собой антиген (белок), который находится на поверхности красных кровяных телец ( эритроцитов). Он обнаружен в 1919 г в крови обезьян, а позже — и у людей. Примерно 80-85% людей имеют его и соответственно являются резус-положительными. Те же, у кого его нет (оставшиеся 15%) – резус-отрицательными. Учитывается и при переливании крови.
Эти показатели обозначаются латинскими буквами Rh со знаком «плюс» или «минус» соответственно.
Наследование группы крови и резус-фактора происходят независимо друг от друга. Если оба родители имеют положительный резус, у ребенка будет положительный. Если оба родителя имеют отрицательный. – ребёнок наследует чаще — отрицательный. Если же один из родителей резус-положительный, а другой резус-отрицательный – то вероятность peзус- принадлежности малыша определяется 50% на 50%. Есть вероятность наследования резуса через несколько поколений (случай, когда у отца и матери положительный резус, а у родившегося ребёнка — отрицательный резус). Поэтому при планировании семьи обязательны исследования родителей на совместимость – необходимо определить группы крови и резус крови. Женщины с рeзус-отрицательной кровью — гpуппа риска.
Положительный резус-фактор у женщины и отрицательный — у мужчины не представляют никакого повода для беспокойства. Если же у женщины окажется резус-отрицательная кровь, а у ее мужа — резус-положительная, то во время беременности возможно развитие резус-конфликта, поэтому женщине рекомендуется до беременности сделать анализ крови на антитела к резус-фактору. Дело в том, что если женщина до беременности перенесла хирургическую операцию (в т.ч. аборт) или переливание крови, либо если беременность не первая, то существует вероятность образования в ее кpoви специфических антител. У резус-отрицательной женщины с резус-положительным плодом возможны иммунные осложнения (гемолитическая болезнь новорожденных и др.) и особенно — со второй-третьей беременности. Для предупреждения осложнений вводят антирезус-гамма-глобулин. Надо регулярно исследовать кровь на резус-антитела в динамике.
Наследование признаков
Веками родители только гадали, каким будет их ребенок. Сегодня есть возможность заглянуть в прекрасное далеко. Благодаря УЗИ можно узнать пол и некоторые особенности анатомии и физиологии младенца.
Генетика позволяет определить вероятный цвет глаз и волос, и даже наличие музыкального слуха у малыша. Все эти признаки наследуются по законам Менделя и делятся на доминантные и рецессивные. Доминантный ген обозначается заглавной буквой латинского алфавита, и в его присутствии рецессивный ген, как правило, не проявляет свои свойства. Рецессивный ген обозначается прописной буквой латинского алфавита. Если по какому-то признаку организм содержит два одинаковых гена (два рецессивных, либо два доминантных), то он называется гомозиготой по данному признаку. Если же организм содержит один доминантный и один рецессивный ген, то он называется гетерозиготным по данному признаку и при этом проявляются те свойства признака, которые кодируются доминантным геном.
А — доминантный ген, определяющий карий цвет глаз
а — рецессивный ген, определяющий голубой цвет глаз
Возможные варианты генотипа:
АА — гомозигота, карие глаза
Аа — гетерозигота, карие глаза
aа — гомозигота, голубые глаза
Карий цвет глаз, волосы с мелкими завитками и даже способность свертывать язык трубочкой являются признаками доминантными. Скорее всего, ребенок их унаследует.
К сожалению, к доминантным признакам также относятся склонность к раннему облысению и поседению, близорукость и щель между передними зубами.
К рецессивным причисляют серые и голубые глаза, прямые волосы, светлую кожу, посредственный музыкальный слух. Проявление этих признаков менее вероятно.
Группа крови и риск развития некоторых заболеваний
Существует закономерность между группой крови и риском развития некоторых заболеваний (предрасположенность). Австралийские ученые установили, что люди с группой крови 0 (I) гораздо реже страдают шизофренией. У обладателей крови группы B (III) выше, чем у остальных, риск тяжелого заболевания нервной системы — болезни Паркинсона. Конечно, сама по себе группа крови не означает, что человек обязательно будет страдать «характерной» для нее болезнью. Здесь задействовано множество факторов, и группа крови — лишь один из них.
Группа крови и характер человека
Группа крови 0 (I). Энергичны, общительны, крепкое здоровье, сильная воля. Стремление к лидерству. Суетливы, амбициозны.
Группа крови A (II). Старательны и обязательны. Любят гармонию и порядок. Их недостаток — упрямство.
Группа крови B (III). Деликатные, впечатлительные, спокойные. Повышенные требования к самим себе и к окружающим. Индивидуалисты. Легко ко всему адаптируются. Властные и творческие личности.
Группа крови AB (IV). Эмоции и чувства берут верх над здравым смыслом и расчётом. Они мыслители. С трудом принимают решения. Уравновешены, но иногда бывают резки. Больше всего конфликтуют сами с собой.
Сдать анализ крови на определение группы крови и резус-фактора Вы можете круглосуточно. Лаборатория Адамант Медицинской Клиники сообщит результат уже в тот же день.
Дополнительную информацию Вы можете получить по телефону +7 (812) 740-20-90.
WhatsApp чат-боты
Автоматизация общения с клиентами от первого касания до закрытия сделки
Используйте WhatsApp рассылки для разных бизнес задач:
Повышайте
конверсию
Подписчики открывают триггерные сообщения лучше, чем массовые рассылки и охотно вовлекаются в диалог.
Плавно подводите к сделке
Превращайте потенциальных клиентов в покупателей, используя цепочки сообщений с полезным контентом.
Получайте отзывы клиентов
Просите клиентов оставить отзыв после покупки и оценить работу компании. Тем самым вы сможете улучшить сервис.
клиентская поддержка
Создавайте чат поддержки, чтобы консультировать и оказывать помощь клиентам 24/7.
Все необходимое для создания и отправки рассылок в WhatsApp
Пользуйтесь инструментами, которые помогут эффективно вести переписку в мессенджере

Сбор базы подписчиков
Разместите на сайте виджет для подписки и собирайте свою аудиторию WhatsApp мессенджера. В сервисе вы также можете отправить email или SMS по существующей базе с предложением подписаться на WhatsApp рассылку.


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

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

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

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

API
SendPulse предоставляет публичный API, с помощью которого можно интегрировать WhatsApp канал в свою инфраструктуру, СRM или систему аналитики.


Подключите искусственный интеллект к своему чат-боту
Благодаря прямой интеграции с языковой моделью ChatGPT от OpenAI ваш бот может взаимодействовать с подписчиками языком живого общения.
Официальный WhatsApp Business API — для компаний с обширной клиентской базой, нацеленных на масштабирование бизнеса
Компании общаются с клиентами в Whatsapp несколькими способами: через простой клиент WhatsApp, приложение WhatsApp Business или интеграцию WhatsApp Business API. Перед подключением взвешивайте все за и против, изучив основные отличия.
Простой клиент WhatsApp или WhatsApp Business
Общение с клиентами через приложение на мобильном или ПК
Привязка к одному устройству
Невозможна командная работа с перепиской
Без массовых рассылок, только автоответы
Нет интеграций
Интеграция с WhatsApp Business API через SendPulse
Общение через чаты SendPulse или интеграции с вашей системой
Нет привязки к одному устройству
Коллективная работа с перепиской в WhatsApp
Массовые и триггерные рассылки
Настройка интеграций напрямую
Подключитесь к WhatsApp Business API через SendPulse, чтобы собрать базу подписчиков и отправлять сообщения чат-бота
SendPulse — официальный провайдер WhatsApp Business API
Подключение к WhatsApp Business API через SendPulse
Официально WhatsApp открывает доступ к своему API только через партнеров. SendPulse предоставляет API для рассылки в WhatsApp через официальный канал. Подключите WhatsApp Business API через SendPulse и пользуйтесь бесперебойным сервисом. Мы предоставляем следующие условия:
Поддержка в подключении
Чтобы подключиться к WhatsApp Business API, необходимо пройти верификацию WhatsApp. Для этого вам нужно зарегистрировать страницу компании в Facebook, добавить ее в Facebook Business Manager и собрать все необходимые документы — мы предоставляем консультацию и помощь на каждом этапе подключения.
Официальный метод подключения
WhatsApp блокирует пользователей, которые подключаются через «серые схемы». Подключение через официальный канал исключает беспричинные блокировки. Главное — получить согласие на рассылку от пользователей и строго следовать требованиям WhatsApp к контенту и оформлению сообщений.
Бесплатное подключение номера
Подключение полностью бесплатно, вы оплачиваете только количество отправленных сообщений.
Мультиканальная отправка сообщений
Используйте WhatsApp в связке с другими мессенджерами. В SendPulse вы можете комплексно настроить мессенджер-маркетинг: подключать ботов и отправлять сообщения в Instagram, WhatsApp, Viber, Facebook и Telegram.

Управляйте чат-ботами со своего смартфона
Установите приложение, чтобы оперативно отвечать на сообщения из WhatsApp, Facebook, Instagram, Viber и Telegram, работать с данными подписчиков и анализировать статистику.
Выгодные тарифы на сообщения в WhatsApp




24-часовые сессии, которые начинает пользователь
24-часовые сессии, которые начинает бизнес
Бесплатный пакет сессий
FAQ
Как подключиться к WhatsApp Business API бесплатно и создать бота
С помощью SendPulse, вы можете бесплатно подключиться к WhatsApp Business API на 7 дней. Если у вас нет аккаунта, зарегистрируйтесь на платформе SendPulse и подключитесь к платному тарифу. Затем создайте бизнес-аккаунты в Facebook и WhatsApp и подключите ваш номер к WhatsApp Business API. Читайте подробнее, как подключиться к WhatsApp Business API бесплатно всего за несколько минут.
Как перейти в SendPulse с других провайдеров WhatsApp
Если вы использовали номер с WhatsApp Business API, вы можете перенести номер и сменить поставщика (BSP) для создания чат-ботов в конструкторе. Для успешной миграции номера следуйте инструкции.
Какому количеству получателей можно отправить сообщение в течение 24 часов
В политике WhatsApp существуют лимиты на количество получателей сообщений в течение 24 часов, которые зависят от уровня отправителя.
На первом уровне разрешается отправлять сообщения 500 уникальным пользователям. Читайте больше о том, как работают лимиты на отправку сообщений WhatsApp.
Как создать автоматическую цепочку для WhatsApp чат-бота
Используйте конструктор, чтобы создать цепочку сообщений для вашего WhatsApp бота. Разработайте структуру бота, укажите ключевые слова и настройте автоответы. Читайте подробнее о том, как настроить цепочку сообщений для WhatsApp бота.
Как создать рассылку WhatsApp
Выберите подключенного бота и получателей, заполните содержимое сообщения и определите время отправки. После отправки можно проверить, сколько сообщений было доставлено и сколько подписчиков взаимодействовали с рассылкой. Читайте пошаговую инструкцию о том, как создать рассылку в WhatsApp.
Что такое рассылка по шаблону и как создать свои шаблоны для рассылок WhatsApp
Рассылка сообщений с одинаковым контентом по всем подписчикам возможна по одобренному шаблону. Такой шаблон можно использовать только для транзакционных и триггерных рассылок без рекламного контента. Создать свои шаблоны вы сможете в разделе «Чат-боты», во вкладке «Шаблоны». Каждый шаблон проходит модерацию WhatsApp. После того как шаблон получит статус «Подтвержден», вы сможете начать отправку рассылок по шаблону.
Хакаем WhatsApp, чтобы следить за активностью контактов
TL;DR: можно защититься от этого хака, изменив настройки конфиденциальности аккаунта. По умолчанию WhatsApp делится вашим статусом с другими людьми. Но так как в наши дни никто не меняет настройки, этот хак срабатывает практически всегда.
Дисклеймер: эта статья является proof of concept, призванной привлечь внимание к проблеме, а также попрактиковать свои технические навыки. Не используйте код для слежки за людьми.

WhatsApp на Android
Эксплойт функции
Я хочу создать эксплойт этой функции для слежения за пользователями (ради научного исследования, конечно). Возникает первый вопрос: как она работает?
Чтобы разобраться, я использую https://web.whatsapp.com/ в веб-браузере ноутбука вместо приложения в Android-смартфоне. То есть для создания эксплойта мне придётся иметь дело с обычным реверс-инжинирингом веб-приложения. Реверс-инжиниринг приложения для Android я оставлю на потом.
Я выбрал друга из контактов телефона, чтобы посмотреть, как ведёт себя его статус на моей стороне.
Изначально статус имеет значение Offline, и в этом случае WhatsApp передаёт вам абсолютную дату вида last seen 16/03/2020 at 15:40 .

Разблокирую телефон друга и открываю приложение (не WhatsApp), занимаюсь этим минуту, на моей стороне ничего не происходит.
Ладно, теперь переключаемся на WhatsApp. 10 секунд спустя статус изменился на online . Я не перехожу в беседы, которые являются общими с этим телефоном/контактом, чтобы убедиться, что статус передаётся без этого условия.

Статус online сохраняется, пока я не выхожу из WhatsApp или не отключаю экран целевого телефона.
После этого приложение возвращается к новому last seen и состоянию offline.

- Мы не сможем следить за местоположением пользователя в мире при помощи его телефона (надеюсь!)
- Но мы можем отслеживать, пользуются ли WhatsApp те, кто находится в наших контактах
- Утекающая информация представляет собой дату last seen и статус online для каждого контакта
- Можно ожидать как минимум точность до минуты для даты last seen
- А статус online отображается, если WhatsApp был открыт хотя бы в течение 5-10 секунд
Технический анализ
Открываю отладчик Firefox, чтобы посмотреть, как фронтенд веб-приложения WhatsApp получает нужные данные.
Фронтенд использует для получения данных в реальном времени связь через веб-сокеты, примерно через каждые 10-15 секунд.

Если внимательно следить, то можно заметить, что фронтенд «пингует» сервер примерно каждые 15 секунд строкой . , и почти всегда за этим следует ответ ! . Что-то типа проверки активности соединения. Нам это неинтересно.

Когда статус контакта меняется, сервер передаёт фронтенду сообщение другого типа.


Частично скрытое мной значение id — это номер телефона, type — это флаг «доступен/недоступен», t — это временная метка даты last seen . Вся полезная нагрузка инкапсулирована в объект Presence , который легко можно распознать.
Временная метка совпадает с тем, что мы видим в UI.

Ограничения
Для получения событий presence от сервера через веб-сокеты, мы (фронтенд) подписываемся на конкретный номер телефона ( id ). Это срабатывает, когда мы выбираем другую беседу/контакт при помощи веб-интерфейса.

Итак, в этой концепции мы можем получать только события presence активного контакта. Другими словами, мы можем отслеживать одновременно только один контакт через веб-сокетное подключение. Очень жаль!
Также WhatsApp не позволяет нам открывать несколько параллельных экземпляров приложения (с одинаковыми куки). То есть мы никак не сможем одновременно открыть два канала веб-сокетов. Это было бы слишком просто!

И, наконец, это поведение вида «одна веб-сессия WhatsApp за раз» сохраняется при попытке создания двух независимых сессий (с разными куки). Новая сессия заставляет старую закрыться, в частности, на слое веб-сокетов.
Ещё одно ожидаемое ограничение: валидность сессии ограничена по времени. Срок моей истёк 22.10.2020, спустя шесть с лишним месяцев. Странно, что можно так получить подобную информацию на фронтенде. Возможно, я что-то не так понял.

Наивная реализация
Теперь, когда мы определили, в чём заключается функция status WhatsApp и как её можно злонамеренно использовать для слежения за пользователями, настало время писать код. Также мы взглянем на техническую реализацию и поищем возможные простые уязвимости безопасности.
Я мог бы заново написать код обмена данными через веб-сокеты, чтобы получать данные о статусе, но это будет сложно. Слишком сложно, если мы можем отслеживать одновременно только один контакт. Я начну с высокоуровневой технологии, учту известные нам пока ограничения, и посмотрю, к чему это может нас привести.
Мне хочется увидеть, чего можно добиться дешёвым хакингом, а уже потом приступать к более сложным вещам.
Я разобью proof of concept на три этапа:
- Получение данных
- Сохранение данных (легко)
- Визуализация данных (легко, но у меня вызовет сложности)
const puppeteer = require('puppeteer'); // The contact name to track (mind the case). const contactTarget = "Jean-Mich"; (async () => < const browser = await puppeteer.launch(< headless: false, // No headless to scan the QR code. userDataDir: 'data/userdata' // Persist the session. >); const page = await browser.newPage(); await page.goto('https://web.whatsapp.com/'); await page.waitFor(5000); console.log('Awaiting/Checking peering with WhatsApp phone'); await page.waitFor('#side', < timeout: 60000 >).then(() => < // Scan the QR code within the next minute. console.log('Connected !'); >).catch((res) => < console.log('Not connected !', res); return -1; >) await page.waitFor(1000); await page.focus('._2S1VP'); // Focus search input form. await page.keyboard.type(contactTarget, < delay: 100 >); await page.waitFor(6000); let contactElt = (await page.$x(`//*[@class="_25Ooe" and . = "$"]`))[0]; // Select the best result. contactElt.click(); await page.waitFor(5000); let statusElt = await page.$('.O90ur'); let status = await statusElt.evaluate(x => x.textContent); console.log(`Status for $ is '$'.`); // `last seen today at 13:15` format. await browser.close(); >)();
Мы реализовали базовую функциональность в 38 строках кода.
Чтобы двигаться дальше, нам нужно спарсить формат last seen today at 13:15 в формат даты. Для этого я использую замечательный npm-пакет chrono-node .
const chrono = require('chrono-node'); // . let status = await statusElt.evaluate(x => x.textContent); // `last seen today at 13:15` format. let lastSeenDate = chrono.parseDate(status); // .
Наконец, я реализовал в коде цикл, постоянно сканирующий статус и сохраняющий его в InfluxDB 2.0.
InfluxDB — это база данных временных рядов (time-series database). Она идеально нам подходит.
На основании даты last seen я запишу UInteger в переменную offline since . Это будет счётчик секунд, прошедших после даты last seen .
Если статус online , то offline since будет иметь значение 0 .
Извлечение наших данных — это превращение данных событий в данные временных рядов.
Такая структура лучше подходит для InfluxDB и особенно для Grafana, которая будет отображать наши данные. К тому же она не хранит состояния, мне это нравится.
Для сохранения данных в InfluxDB 2.0 я использую клиент Node.js с форматом line protocol базы данных InfluxDB.
measurementName,tagKey=tagValue fieldKey="fieldValue" 1465839830100400200 --------------- --------------- --------------------- ------------------- | | | | Measurement Tag set Field set Timestamp
Сохраняемые данные выглядят так:
status,contactName=Toto offlineSince=8275u 1465839830100400200 status,contactName=Toto offlineSince=8280u 1465839830100400200 status,contactName=Toto offlineSince=0u 1465839830100400200 status,contactName=Tata offlineSince=0u 1465839830100400200 ------ --------------- ----------------- ------------------- | | | | Measurement Tag set Field set Timestamp
const < InfluxDB, FluxTableMetaData >= require('@influxdata/influxdb-client') let client = new InfluxDB(< url: 'http://localhost:9999', token: process.env.INFLUXDB_TOKEN >); const writeApi = client.getWriteApi(process.env.INFLUXDB_ORG, process.env.INFLUXDB_BUCKET); //. let offlineSince = (lastSeenDate === null) ? 0 : ((new Date().getTime() - lastSeenDate.getTime()) / 1000).toFixed(0); if (offlineSince < 0) offlineSince = 0; let data = `status,contactName=$offlineSince=$u`; writeApi.writeRecord(data);
Существует пограничный случай, который бы я хотел обрабатывать: иногда в WhatsApp статус вообще не отображается.
В таком случае мы не введём в базу данных значение offlineSince , потому что у нас его нет. Вместо этого мы при каждом сканировании статуса будем записывать значение statusAvailable (которое равно 0 или 1 ).
Теперь мы подключим Grafana к InfluxDB и создадим дэшборд для слежения за полученными данными.

Исходный код этого proof of concept можно найти здесь.
Часть 2. Отслеживаем 5000 случайных телефонов
В предыдущей части мы выяснили, что достаточно легко взломать онлайн-статус контакта WhatsApp. Простую информацию Online или last seen yesterday at 19:00 реверс-инжинирингом можно заставить выполнять утечку пользования телефоном с точностью в несколько секунд.
Но я ещё не сказал о гораздо более странной вещи: можно отслеживать любой мобильный телефон! Давайте поиграем и увеличим масштабы слежения до 5000 случайных номеров.
Как и в первой части, я делюсь исходным кодом как PROOF OF CONCEPT. Если вам больше интересны результаты, чем технические подробности, то можете сразу переходить в конец статьи. Мы снова будем использовать предыдущий код на основе Node.js, Puppeteer и Grafana.
Мои друзья, мои контакты
WhatsApp считывает контакты в телефоне и позволяет чатиться с теми, кто тоже добавлен в список. Поэтому мы можем свободно добавить в качестве контакта случайный номер и найти его в WhatsApp.

Хотя для добавления номера в список контактов не требуется, WhatsApp защищает пользователей, предлагая им согласиться на ответ или сообщить о спаме при первом обмене сообщениями. Безусловно, это помогает бороться с ботами.
Как ни удивительно, это не относится к статусу Last Seen.

Ой, а почему я вижу эти данные last seen ?
Как мы видели в первой части, существует препятствующая этому настройка конфиденциальности. По умолчанию она имеет значение Everyone , но никто его не меняет.

Если вы не хотите делиться своим статусом Last Seen , то WhatsApp отключает эту функцию в обоих направлениях
Экспериментируем с 5000 контактов
Мне стало любопытно, как далеко мы сможем зайти с этой уязвимостью. Я не хочу отслеживать конкретных людей и не буду спрашивать разрешения у 5000 людей, как мог это сделать в первом хаке.
Поэтому я усложню задачу, вычислю анонимную статистику и запишу данные. Давайте увеличим масштаб до 5000 телефонов.
Генерируем 5000 контактов
Чтобы расширить proof of concept до 5000 контактов, мне нужно будет зарегистрировать 5000 контактов в телефоне! И я не собираюсь делать это вручную.
Для этого я перешёл в свой аккаунт Google на десктопном веб-сайте, зашёл на страницу Contacts и нашёл там кнопку import a CSV .

Документация выглядит очень запутанной и длинной. Я не стал её изучать и экспортировал уже имеющиеся контакты, чтобы изучить модель данных. И она действительно оказалась сложной. После нескольких попыток мне удалось импортировать пару контактов с минимально возможным количеством заполненных полей.
Name,Given Name,Additional Name,Family Name,Yomi Name,Given Name Yomi,Additional Name Yomi,Family Name Yomi,Name Prefix,Name Suffix,Initials,Nickname,Short Name,Maiden Name,Birthday,Gender,Location,Billing Information,Directory Server,Mileage,Occupation,Hobby,Sensitivity,Priority,Subject,Notes,Language,Photo,Group Membership,Phone 1 - Type,Phone 1 - Value ContactA. Mobile,06 01 02 03 04 ContactB. Mobile,06 01 02 03 05 ContactC. Mobile,06 01 02 03 06
Additional Name Yomi ?

На случай, если вы больше привыкли к CSV в Excel…
Я написал скрипт для генерации CSV из 5000 контактов:
const fs = require("fs"); require("dotenv").config(); const startingNumber = process.env.STARTINGNUMBER; const fileName = "5000contacts.csv"; const csvHeader = "Name,Given Name,Additional Name,Family Name,Yomi Name,Given Name Yomi,Additional Name Yomi,Family Name Yomi,Name Prefix,Name Suffix,Initials,Nickname,Short Name,Maiden Name,Birthday,Gender,Location,Billing Information,Directory Server,Mileage,Occupation,Hobby,Sensitivity,Priority,Subject,Notes,Language,Photo,Group Membership,Phone 1 - Type,Phone 1 - Value"; fs.appendFileSync(fileName, csvHeader + "\n"); let numbers = startingNumber.split(" "); let counter2 = Number(numbers[2]); let counter3 = Number(numbers[3]); let counter4 = Number(numbers[4]); for (let index = 0; index < 5000; index++) < if (counter4 == 99) < counter4 = 0; counter3++; >if (counter3 == 99) < counter3 = 0; counter2++; >let number = `$ $ $ $ $`; let csvRow = `Unknown$. Mobile,$`; fs.appendFileSync(fileName, csvRow + "\n"); counter4++; console.log(`$ -> $`); > function twoDigit(number) < var twodigit = number >= 10 ? number : "0" + number.toString(); return twodigit; >

Набор из 5000 французских номеров
И импортировал их в Gmail.

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

Получение данных
Я модифицировал свой код так, чтобы он обходил в цикле все 5000 импортированных неизвестных контактов, и запустил его.
Оставил этот краулер на пару дней. (На самом деле на шесть дней, и это при помощи совершенно тупого кода! Серьёзно, здесь нет никакой защиты.) И вот какие получились красивые данные в дэшборде Grafana, взятом из предыдущего проекта.

Исходная выборка в 100 контактов. Каждое падение до 0 означает, что контакт пользовался смартфоном.
Также мы можем проверять, зарегистрирован ли номер в WhatsApp, выполняя запросы, как показано на скриншоте ниже.

Заключение
Мне удалось продолжать сканировать 5000 телефонов непрерывно в течение месяца при помощи простого кода скрейпинга.
Очевидно, WhatsApp не проверяет и не предупреждает злонамеренное использование этой функции. Мне удалось 15 000 раз использовать движок поиска для получения данных last seen за одну веб-сессию.
Для исследования я наскрейпил множество данных из 112 тысяч записей.
Моё исследование показало, что можно:
- Определить, зарегистрирован (или был ли зарегистрирован) номер телефона в WhatsApp
- Действителен (или был ли действителен) номер телефона и привязан ли он к телефонной сети
- Получать фото профиля пользователя WhatsApp (можно извлекать версию в большом размере)
- Получать сами данные last seen
Я использовал французский диапазон номеров 06xxxxxxxx (или 00336xxxxxxxx ), который переполнился 10 лет назад (поэтому тогда появился диапазон 07xxxxxxxx ). Поэтому, вероятно, можно допустить, что по крайней мере 80% номеров телефонов действительны.
Вот визуализация пользователей, сгруппированных по дате last seen , дающей представление о пользовании WhatsApp. Я собрал данные примерно в первую неделю февраля.

Снижение с 1357 активных пользователей в прошлом месяце до 281 на прошлой неделе довольно значительно, его можно связать с критикой WhatsApp в конце декабря 2020 года. Мне не очень интересно изучать эти данные подробнее, на этом всё, спасибо за внимание.
Messenger, Signal и Telegram (бонус)
(Facebook) Messenger не использует номеров телефонов контактов для поиска пользователей, потому что пользуется для этого аккаунтами Facebook. Совершенно иная структура, поскольку это социальная сеть и она меньше похожа на мобильный сервис VOIP. Думаю, множество похожих хаков с получением информации можно реализовать и в Messenger. Но это уже другая история, возможно, оставим её на следующий раз?
Signal и Telegram больше похожи на WhatsApp с точки зрения работы с контактами. Однако утечки там не так велики.
Данные last seen из Telegram менее доступны публично и менее подробны, например, они сообщают, что пользователь был онлайн около месяца назад . Движок поиска не имеет утечек, позволивших бы оценить количество пользователей во время моего исследования. Но теперь, спустя шесть недель, похоже, что это возможно. Меня это немного расстроило.
У Signal вообще нет функции last seen , здесь он чист. Однако посчитать пользователей было просто. Signal имеет уведомление is on Signal! , когда контакт начинает им пользоваться. Это помогает отслеживать переход пользователей на Signal.

В первый день исследования из 5000 пользователей 94 было в Signal, и каждый последующий день появлялось по 1-2 новичка. Никто не использует Signal во Франции, очевидно, влияние Илона Маска здесь не так велико.

Да, это картинка, чтобы за вами не могли следить.
На правах рекламы
VDSina предлагает безопасные серверы с посуточной оплатой. Возможно установить любую операционную систему, в том числе из своего образа. Каждый сервер подключён к интернет-каналу в 500 Мегабит и бесплатно защищён от DDoS-атак!
Приветственное сообщение в Ватсап: опыт, мнение, лайфхаки

На самом деле начать разговор всегда сложно, особенно первым, особенно с незнакомым человеком. Но еще сложнее сделать так, чтобы после первого же слова тебя не отправили отдыхать в черный список. Вот поэтому Ватсап и разработал специальный сервис «Приветственное сообщение». Оговоримся сразу, не обычный пользовательский мессенджер, а именно WhatsApp Business. Он дает возможность предпринимателю не быть отправленным на блокировку профиля после первой же рассылки.
Что за зверь такой приветственное сообщение в Ватсап?
Итак, новый термин в вашу и нашу копилочку «Приветственное сообщение в Ватсап». Это достаточно просто – автоматическая текстовая рассылка людям, впервые написавшим вашей компании в Ватсапе. Наиболее удобным вариантом использования приветственного сообщения в Ватсапе, как нам кажется, это подключение его на время отсутствия менеджеров в офисе, то есть на нерабочие часы, но можно и настроить на время кофе-брейков и обеденного часа, чтобы клиент чувствовал свою значимость для вас. А раз на его сообщение откликнулись, то скорее всего человек дождется менеджера и, вероятно, сможет стать вашим клиентом. Главное, чтобы приветственное сообщение было составлено так, чтобы подтолкнуть обратившегося к сотрудничеству в дальнейшем. А пока вы разбираетесь с основой основ приветственных сообщений в Ватсапе, мы подготовили для вас примеры и лайфхаки, которые точно помогут понять, под каким соусом подается блюдо под названием «Приветственное сообщение от Ватсапа»
Как создать свое приветственное сообщение в Ватсап?
Напоминаем, что для этого вам нужен абсолютно белый WhatsApp Business. Так как функционал обычной пользовательской версии не предусматривает таких автоматических рассылок.
Включите нужную программу. А затем выполните ряд несложных действий-шагов:
- Откройте Ватсап и нажмите значок многоточия в углу экрана.
- Выберите в выпадающем окне строчку «Инструменты для бизнеса».
- Выберите «Приветственное сообщение», после этого вам откроются настройки данной опции для Ватсап
- Перемещаем бегунок возле строки «Отправить приветственное сообщение» вправо, функция становится активна.
- А теперь самое главное. Нажимаем иконку карандаша и создаем свое приветственное сообщение в Ватсапе. Здесь очень важно и меру соблюсти, и заинтересовать, и дать представление о вашей компании. Помните, краткость – сестра таланта и мать всех ошибок. Приветственное сообщение в Ватсапе должно быть не столько кратким, сколько понятным и приятным.
- Обязательно укажите группы получателей. Например, можно выбрать позицию «Все», и если вы в оффлайне, то все и получат ваш привет. Можно выбрать «Все, кто не внесен в адресную книгу», тогда если человек связывается с вами впервые или с нового номера телефона, приветственное сообщение в Ватсап он получит. Наконец, есть два весьма интересных варианта «Всем, кроме» и «Отправлять только», в первом случае вы ограничиваете круг лиц от получения «Привета из Ватсапа», а во втором – наоборот, только определенный список адресатов его получает.
- Ну и самое главное, нажимаем «Сохранить»
Вот в принципе и все, что нужно знать о настройке приветственного сообщения в Ватсапе. Единственное, хотелось бы отметить еще один маленький и приятный бонус. Если клиент не выходил на связь более 2х недель, то автоматически ему будет приходить ваша приветственная рассылка – как напоминание.
Несколько лайфхаков для создания приветственного сообщения в Ватсапе
Неважно, какой у вас бизнес. Приветственное сообщение в Ватсапе одинаково необходимо и магазину, и кафетерию, и медицинскому центру. Ведь клиенты любят внимание, а быть все время в готовности отвечать на вопросы просто невозможно. Поэтому дадим несколько советов, как грамотно составить приветственное сообщение для Ватсапа:
- Сообщение должно быть понятным, приятным и не допускающим вариантов прочтения. Кстати к нему можно прикрепить полезные кнопки, например, Часы работы, Наиболее часто задаваемые вопросы, Контактные телефоны руководителей определенных отделов по работе с клиентами.
- Обязательно включайте автоответчик с Приветственным сообщением на то время, когда вы не работаете.
- Мы обязательно предложим вам примеры. Но помните, нельзя быть одинаковым, меняйтесь сами и меняйте свое приветственное сообщение.
- Эмоджи привлекают внимание и снимают лишнее напряжение.
Варианты Приветственных сообщений для Ватсапа
А вот такие примеры мы предлагаем использовать вам, единственное – не забывайте, что тут примеры общие, и проявите при обработке свою креативность:
- Добрый день! В ближайшее время наш менеджер свяжется с вами. Пожалуйста, дождитесь ответа.
- Здравствуйте! Сейчас мы, к сожалению, не работаем, но будем рады связаться с вами в ближайшее время.
- Приветствуем! Благодарим за проявленный интерес к нашей компании. Первый же освободившийся менеджер ответит вам.
- Доброго дня! Просим вас подождать, в течение нескольких минут наш сотрудник ответит вам.
В общем-то на этом и все. Мы же, Wazzup, всегда готовы поддержать вас советами и умными идеями.
А как всегда оставаться на связи с клиентом в WhatsApp читайте в нашей статье
