Русский
Русский
English
Статистика
Реклама

Мессенджеры

Перевод История ретранслируемого интернет-чата (IRC)

20.04.2021 16:13:49 | Автор: admin


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

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

Начало


IRC зародился летом 1988 года, когда Яркко Wiz Оикаринен написал первый IRC-клиент и сервер в университете Оулу, Финляндия, где он трудился в научном отделе по обработке информации.

Яркко намеревался расширить возможности BBS (электронной доски объявлений), которую он администрировал на tolsun.oulu.fi, чтобы добавить в нее новости в формате Usenet, диалоги в реальном времени и прочие возможности. Первым делом он реализовал чат, для чего использовал код, написанный его друзьями Юрки Куоппала и Юккой Пихль. Изначально эта разработка была протестирована на одной машине. Яркко об этом первом пуске позже говорил так: День рождения IRC пришелся на август 1988. Точная дата неизвестна, но где-то в конце месяца. Первый IRC-сервер получил имя tolsun.oulu.fi.

Юрки Куоппала подтолкнул Яркко обратиться к университету Оулу с просьбой разрешить использовать код IRC за его пределами. Руководство университета не возражало, и после итогового релиза Юрки сразу же настроил сервер, который позже получил адрес irc.cs.hut.fi. Так родилась первая сеть IRC.

Ари Леммке впоследствии вспоминал: Когда Юрки устанавливал ircd, я находился в том же помещении. Мне как раз нечем было заняться, поэтому я решил взломать tolsun (Sun машина irc-сервера в Оулу) и, естественно проник через новую дыру в sendmail. Хотя все же в то время Юрки был лучшим известным мне взломщиком

У Яркко были кое-какие друзья в университетах Тампере и Хельсинки, которые помогли запустить дополнительные IRC-сервера, когда число пользователей начало расти.
Вскоре за ними последовали и другие ВУЗы. Маркку Ярвинен помог с доработкой клиента, и в тот момент Яркко понял, что остальная часть функционала BBS в его программу может не войти.

Он связался с ребятами из Университета Денвера и Университета штата Орегон. У них также функционировала IRC-сеть (программу они получили от одного из друзей Яркко, Виджая Субраманьям первого не финна, использовавшего IRC), и они хотели подключиться к основной финской ветке. Рост IRC продолжился, и использовать его начали уже по всей национальной сети Финляндии, Funet, после чего произошло дальнейшее расширение и подключение к скандинавской Nordunet. В ноябре 1988 года IRC распространился уже по всей мировой паутине.

  • К середине 1989 года чат насчитывал 40 серверов по всей планете.
  • В этом же году Майклом Сандорфом был выпущен ircII.
  • В июле 1990 года IRC насчитывал в среднем 12 пользователей в день на 38 серверах.
  • В 1990 году была настроена новая сеть для разработки обновленной версии ircd (2.6). Эта сеть получила название ChNet и насчитывала около 25 серверов. Правда, просуществовала она всего несколько месяцев, пока разногласия между разработчиками не привели к ее распаду.

EFnet


В августе 1990 года в мире IRC произошел первый серьезный раскол. Сеть Anarchy (A-net) подключила сервер с адресом eris.berkeley.edu. Он был полностью открыт, не требовал паролей и не устанавливал ограничений на количество подключений. Как пояснял Грег Wumpus Линдхаль: Эта сеть использовала линию общей маской подключений (wildcard server line), в результате чего люди подключали серверы, и возникали повсеместные коллизии никнеймов.

В результате путем установки карантина для eris.berkley.edu была организована EFnet (сеть без Eris), о чем Wumpus рассказывал так: Администраторы Eris отказались удалять эту линию, и в ответ я сформировал EFnet. Особой борьбы не было. Я просто объединил хабы, и практически все подключились ко мне. В итоге ANet включала в свой состав серверы Eris, а EFNet представляла оставшуюся часть сети. Как показывает история, большинство серверов и пользователей предпочли лагерь EFnet. Тем не менее вскоре ANet распалась, и EFnet стала вновь единой IRC-сетью.

Следующей отколовшейся сетью стала TubNet, созданная группой людей из канала #hottub, которым надоели постоянные отключения узлов (netsplits). Состояла она из 5 серверов и около 100 пользователей. Закончилось ее существование в сентябре того же года.

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

Undernet


Еще одно ответвление, которое первым внесло существенные и долгосрочные изменения, было инициировано Wildthang в США в октябре 1992 года (он создал ответвление от EFnet ircd v. 2.8.10). Изначально эта сеть отделялась как тестовая и предназначалась для разработки ботов, но очень быстро переросла в сеть для друзей и их друзей. Попутно с этим в Европе и Канаде над новой сетью работали _dl и WIZZARD. В итоге в декабре французские серверы подключились к канадским, и в конце месяца эта сеть объединилась с сетью Wildthang в США. Позже эта новая сетевая коалиция получила имя The Undernet.

Ее пользователи хотели продолжить развитие ircd, желая избавить сеть от проблем с пропускной способностью и разобраться с беспорядком в работе каналов (постоянными отключениями и захватами), от которого начинала страдать EFnet. Для решения проблемы с каналами в Undernet реализовали временные метки, новый вид маршрутизации и предложили CService программу, которая позволяла пользователям регистрировать каналы и в последствии защищала их от злоумышленников. (В некоторой степени это был глобальный защитный бот). В самый первый список серверов, объявленный 15 февраля 1993 года, вошли серверы из США, Канады, Хорватии и Японии. Спустя полгода, 15 августа было зарегистрировано новое рекордное число пользователей, составившее 57 человек.

RFC


В мае 1993 года для протокола IRC выходит документ RFC (Request for Comments) под номером 1459. В дальнейшем его спецификация неоднократно нарушалась и дополнялась. Стоит отметить, что части CTCP (протокол Client-to-Client) и другие составляющие, такие как цвета и форматы, в спецификацию включены не были, равно как и кодировка символов.

Dalnet


Летом 1994 года (в некоторых источниках отмечается июль) ответвление происходит уже от самой Undernet. На этот раз новая сеть получает имя Dalnet в честь своего основателя, dalvenjah. Новая сеть предлагала повышенное качество сервиса и еще более улучшенную защиту каналов и пользователей. Одно из основных начальных изменений Dalnet состояло в использовании более длинных никнеймов (в оригинальном ircd длина ограничивалась 9 символами). Все соответствующие модификации были внесены Алексеем Lefler Косутом.

Таким образом Dalnet базировалась на ircd-сервере Undernet, хотя первыми в нее пришли те, кто в свое время покинул EFnet из-за недовольства. Джеймс Нг говорил, что: Первыми пользователями Dalnet стали операторы из канала #StarTrek, уставшие от постоянных сплитов, лагов, захватов и т.п.

Эта сеть почти сразу предложила глобальные WallOps (сообщения IRCop, доступные для просмотра пользователями +w (/mode NickName +w)), более длинные никнеймы, недопустимые (q-lined) никнеймы (например, ChanServ, IRCorp, NickServ и т.п.), глобальные k-line (бан человека или всего домена на сервере или по всей сети), коммуникации только в IRCorp: GlobOps, режим +H, показывающий, что IRCorp является helpop и т.д.

Многие из новых функций Dalnet были написаны в начале 1995 года Брайаном Morpher Смитом. Они позволяли пользователям владеть никнеймами и каналами, отправлять памятки, а также предоставляли ряд других возможностей.

oz.org


Очередное ответвление произошло в марте 1996 года, когда одинокий австралийский сервер отключился от Undernet из-за сложностей со связью через транс-тихоокеанское подключение между США и Австралией. Первые несколько месяцев существования oz.org были пробной попыткой отключения от Undernet из-за невозможности поддержки соединения в пиковые часы нагрузок. Один из двух разработчиков (chaos и seks) изначального chanserv (сервиса каналов) X и W в Undernet был австралийцем, поэтому для создания Z (название chanserv) в Oz.org использовался тот же код. В июне 2001 года пиковое количество пользователей oz.org достигло 4 000.

IRCnet


В июле 1996 года, спустя месяцы пламенных сражений и обсуждений в списках рассылки, произошло еще одно отделение, вызванное несогласием в стратегии развития ircd. В частности, европейская сторона, позже назвавшая себя IRCnet, отстаивала задержку ников и каналов, в то время как сторона EFnet выступала за использование временных меток. Большая часть серверов IRCnet находились в Европе, а большинство серверов EFnet базировались в США. Во многих IRC-сообществах это событие еще назвали The Great Split (великим разделением). С тех пор (август 1998 года) EFnet продолжала расширяться, и ее размер превысил показатели до ответвления IRCnet. А осенью 2000 года число пользователей в EFnet было уже выше 50 000, а в IRCnet даже перевалило за 70 000.

Freenode Open Projects Network


Еще одна IRC-сеть была запущена в 1998 году под названием Open Projects Network (сеть открытых проектов). В том году число ее пользователей приблизилось к 100, а количество каналов к 20. В конце 2001 года населенность сети составила уже около 4 000 человек и более 1 300 каналов. Первые пару лет OPN работала на ircu, после чего перешла на IRCD-сервер Dancer.
Позже сеть была переименована во Freenode.

В 2011 году ее рост достиг 65 000 пользователей и 40 000 каналов.

Другие сети


Конечно же, с ростом популярности интернета рос и спрос на IRC. В 2010-е годы существовали сотни независимых IRC-сетей, включая amiganet, linuxnet, galaxynet, bestnet, NewNet, AnotherNet, ChatNet, UpperNet, ZAnet, X-Net, GammaNet, SuperChat, IceNet и др. Однако среди огромного их числа явно выделялись всего четыре основных, продолжавшие развивать собственную версию программного обеспечения ircd-сервера.

Дальнейшие шаги по стандартизации


В январе 1998 года возникла инициатива IETF-IRCUP для сбора всех специфических особенностей IRC и документирования нового RFC с последующей установкой стандарта, которому бы следовали все сети. Реализация этой инициативы так и не состоялась.

Годом ранее Бьорн Рииз начал другой проект, CTCP/2, желая разработать и стандартизировать протокол Client-to-Client, который никогда не был частью RFC. Было известно, что клиенты расширяли и изменяли изначальный протокол CTC, не позволяя несоответствующим ему клиентам фильтровать новые коды. CTCP/2 же должен был определять способ ввода кодов, в особенности новых, которые бы позволили старым клиентам продолжать функционировать. Он также должен был решать проблемы с IPv6, которые отмечались в последовательности инициирования DCC. Финальной стадии этот проект тоже так и не достиг.

Популярность IRC


Согласно данным irc.netsplit.de, начиная с 2004/05 годов IRC, количество пользователей IRC начало постепенно убывать. В те годы каждой из 4 крупнейших сетей, а именно Quakenet, Undernet, IRCnet и EFnet, ежедневно пользовались более 100 000 человек. Лидировала в этом списке Quakenet, состоявшая из более, чем 200 000 пользователей.

Примечание ред.: сложно сказать, существуют ли еще активные интернет-чаты в 2021 году. Большинство людей перешли к использованию более удобных мессенджеров, таких как Telegram, WhatsApp и др.

Другие статьи по истории IRC (англ.).

Подробнее..

Мессенджер в почтовой корове? Дайте два

20.05.2021 12:07:50 | Автор: admin

Рано или поздно очередной исследователь бюджетных альтернатив MS Exchange сталкивается с почтовым сервером из Германии mailcow. Кто-то, не замечая, проносится мимо, кто-то, притормаживая, знакомится ближе. Находятся и те, кто идёт дальше и разворачивает данное почтовое решение в своей ИТ-инфраструктуре. Например я, который в середине 2020 года мигрируя с сервисов Google, внедрил почтовую корову у себя, разместив основную и резервную площадки на виртуальных вычислительных ресурсах географически разнесённых .

Базируемый на программном обеспечении с открытым исходным кодом и разворачиваемый в докер-контейнерах, этот почтовый сервер обладает функционалом, сопоставимыми с возможностями MS Exchange. Почта с антивирусом и антиспамом, календари, задачи, контакты, мультидоменность и мультиарендность всего лишь малая часть того, о чём бы стоило рассказать. Но учитывая тот факт, что в сети уже предостаточно материала о mailcow, как о решении для обмена электронной почтой, в этой статье расскажу о нём, как о решении для мгновенного обмена сообщениями.

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

Эта востребованность, однажды, настигла в моей деятельности и меня, поставив перед выбором: Какой мессенджер использовать?

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

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

- ejabberd


Первый мессенджер, о котором хочу рассказать, построен на базе свободного (GNU GPL), распределённого и устойчивого к отказам MQTT, SIP и XMPP-сервера.

Да-Да! На базе сервера, который использует тот самый Джаббер (англ. Jabber болтовня, трёп, тарабарщина), теперь известный как XMPP (англ. eXtensible Messaging and Presence Protocol) открытый, основанный на XML, свободный для использования протокол для мгновенного обмена сообщениями и информацией о присутствии в режиме, близком к режиму реального времени. Спроектированный легко расширяемым, протокол, помимо передачи текстовых сообщений, поддерживает передачу голоса, видео и файлов по сети.

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


Настройка


По умолчанию ejabbberd в mailcow отключён. Для того, чтобы его активировать, необходимо включить поддержку XMPP для выбранного домена в панели управления (mailcow UI).

image


Указанный префикс домена используется в адресе авторизации XMPP (JabberID). Например, JID для пользователя почтового ящика cowboy@example.org будет таким cowboy@im.example.org. Пароль же совпадает с почтовым.

Перед включением поддержки XMPP для домена не не забудьте добавить две необходимые для получения сертификата записи CNAME в DNS в следующем формате:

# CNAMES# Name              Type       Valuexmpp_prefix         IN CNAME   mail.example.org. (ваш ${MAILCOW_HOSTNAME})*.xmpp_prefix       IN CNAME   mail.example.org. (ваш ${MAILCOW_HOSTNAME})


где, xmpp_prefix в нашем примере это im

Правильность добавления можно проверить с помощью инструмента анализа DNS-записей в панели управления mailcow.

image


Если вы сначала включили XMPP, а затем добавили записи DNS не беда. Нужно дождаться, пока ejabberd автоматически получит сертификаты, или вручную перезапустить docker-контейнер ejabberd-mailcow с помощью команды:

$ docker-compose restart ejabberd-mailcow

После включения ejabberd вы можете повторно запустить анализ DNS-записей в панели управления mailcow, где вы найдете еще две SRV-записи.

image

# SRV records# Name                            Type       Value_xmpp-client._tcp.xmpp_prefix     IN SRV     10 1 5222 mail.example.org. (ваш ${MAILCOW_HOSTNAME})_xmpp-server._tcp.xmpp_prefix     IN SRV     10 1 5269 mail.example.org. (ваш ${MAILCOW_HOSTNAME})


Эти записи необходимы для автоконфигурации клиентов XMPP и межсерверных соединений. Добавить их можно в любое время без перезагрузки ejabberd.

Управление доступом


image


Проверка сертификатов


Когда все настроено, убедитесь, что ejabberd смог получить сертификаты:

Если вы видите сообщение, похожее на это

ejabberd-mailcow_1   | 2021-02-13 14:40:19.507956+01:00 [error] Failed to request certificate for im.example.org, pubsub.im.example.org and 3 more hosts: Challenge failed for domain conference.im.example.org: ACME server reported: DNS problem: NXDOMAIN looking up A for conference.im.example.org - check that a DNS record exists for this domain (error type: dns


возможно, вам потребуется перепроверить конфигурацию DNS или перезапустить docker-контейнер ejabberd-mailcow для возобновления процесса в случае медленного обновления DNS

Открытие

https:/xmpp_prefix.domain.tld:5443/upload 


должно направить вас на страницу 404 с действующим сертификатом.

На этом активацию и основную настройку XMPP на сервере mailcow можно считать завершённой. Подбирайте удобный jabber-клиент и общайтесь с родственниками, друзьями, коллегами, клиентами с глазу на глаз или в групповых чатах, в том числе c использованием end-to-end шифрования.

- DeltaChat


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

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

В итоге


Почтовая корова приросла функциями и при использовании универсальных mail-клиентов, таких как или , стала средством унифицированных коммуникаций. Почти


Подробнее..

Signal Взлом Cellebrite с атакованного устройства

25.04.2021 02:04:46 | Автор: admin

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

В список их клиентов входят авторитарные режимы в Беларуси, России, Венесуэле и Китае; отряды смерти в Бангладаше; военные хунты в Мьянме; а также те, кто жаждет насилия и гнёта в Турции, ОАЭ и других странах.

Несколько месяцев назад они объявили, что добавили в своё программное обеспечение поддержку Signal.

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

Предыстория

Во-первых, всё, что касается Cellebrite, начинается с того, что кто-то другой уже держит ваше устройство в руках. Cellebrite не осуществляет перехвата данных или удалённого наблюдения. Их основных программных продукта два (и оба для Windows): UFED и Physical Analyzer (физический анализатор).

UFED создаёт резервную копию вашего устройства на машине под управлением Windows (по сути, это фронтенд для adb backup на Android и резервной копией от iTunes на iPhone, с извлечением некоторых дополнительных данных). После создания резервной копии, Physical Analyzer затем разбирает файлы из резервной копии, чтобы отобразить данные в обозримом виде.

Когда компания Сellebrite объявила, что они добавили поддержку мессенджера Signal, это на самом деле означало то, что в Physical Analyzer они добавили поддержку для форматов файлов, используемых Signal. Это позволяет Physical Analyzer отображать данные мессенджера, которые были извлечены из разблокированного устройства, находящегося в физическом владении пользователя Cellebrite.

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

В нужное время, в нужном месте...

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

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

Кейс Cellebrite на обочине дороги.Кейс Cellebrite на обочине дороги.

Программное обеспечение

Любой, кто знаком с программной безопасностью, сразу поймёт, что основно задачей программного обеспечения Cellebrite является анализ "ненадёжных" ("untrusted") данных из самых разных форматов, используемых различными приложениями. То есть, данные, которые программное обеспечение Cellebrite должно извлекать и отображать, в конечном счёте, генерируются и контролируются приложениями на устройстве, а не "доверенным" источником, поэтому Cellebrite не может делать никаких предположений о "правильности" упорядоченных данных, которые он получает. Вот в этом месте возникают практически все уязвимости в безопасности.

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

Однако, глядя на UFED и Physical Analyzer, мы были удивлены, обнаружив, что, кажется, очень мало заботы было уделено безопасности собственного программного обеспечения Сellebrite. Отраслевые стандарты защиты от эксплойтов отсутствуют, и есть много разных возможностей для эксплуатации.

В качестве лишь одного примера (не связанного с тем, что следует далее), их программное обеспечение укомплектовано с библиотеками FFmpeg, которые были скомпилированы ещё в 2012 году, и в дальнейшем не менялись. За это время было выпущено более ста обновлений безопасности для FFmpeg, ни одно из которых не было применено в Сellebrite.

Уязвимости в FFmpeg по годам.Уязвимости в FFmpeg по годам.

Уязвимости

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

Например, таким образом можно выполнить код, который модифицирует не только созданный в этом сканировании отчёт Сellebrite, но и все предыдущие и будущие отчёты Cellebrite со всех ранее отсканированных устройств, а также со всех будущих устройств любым произвольным способом (вставляя или удаляя текст, электронную почту, фотографии, контакты, файлы или любые другие данные), без каких-либо обнаруживаемых изменений временных меток или сбоях в проверках контрольных сумм. Это даже может быть сделано случайным образом, что серьёзно подставит под сомнение целостность данных в отчётах Cellebrite.

Любое приложение может содержать такой файл, и до тех пор, пока Cellebrite не сможет точечно устранить все уязвимости в своём программном обеспечении, с чрезвычайно высокой степенью уверенности можно сказать, что единственное средство, которое есть у пользователя Cellebrite - это не сканировать устройства. Cellebrite может снизить риск для своих пользователей, обновив их программное обеспечение, чтобы прекратить сканирование приложений, которые Сellebrite посчитает очень рискованными для такого типа проблем целостности данных, но даже это не является гарантией.

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

Ниже приведён пример видео эксплойта для UFED (аналогичные эксплойты существуют и для Physical Analyzer). В видео, UFED достигает файла, который выполняет произвольный код на машине Cellebrite. Этот эксплойт использует MessageBox в Windows API, чтобы отобразить диалоговое окно с сообщением. Это делается в демонстрационных целях; можно выполнить любой код, и реальный эксплойт, скорее всего, попытается скрытным образом изменить предыдущие отчёты, подорвать целостность будущих отчётов (возможно, случайным образом!) или извлечь данные с машины Cellebrite.

Авторское право

Ещё, из интересного, установщик для Physical Analyzer содержит два пакета установщиков MSI под названием AppleApplicationsSupport64.msi и AppleMobileDeviceSupport6464.msi. Эти два пакета MSI имеют цифровую подпись Apple и, кажется, были извлечены из установщика для Windows программы iTunes версии 12.9.0.167.

MSI-пакеты.MSI-пакеты.

Программа установки Physical Analyzer устанавливает эти MSI-пакеты на C:\Program Files\Common Files\Apple. Они содержат библиотеки (DLL), реализующие тот функционал, который iTunes использует для взаимодействия с iOS устройствами.

DLL-библиотеки, установленные в систему.DLL-библиотеки, установленные в систему.

Cellebrite iOS Advanced Logical Tool загружает эти библиотеки Apple и использует их функциональность для извлечения данных с мобильных устройств на базе iOS. На скриншоте ниже показано, что библиотеки от Apple загружаются в процесс UFED iPhone Logical.exe, который является именем для процесса iOS Advanced Logical Tool.

DLL-библиотеки, загруженные в процесс.DLL-библиотеки, загруженные в процесс.

Нам кажется маловероятным, что Apple предоставила Сellebrite лицензию на повторное распространение и включение собственных библиотек в продукты Cellebrite, так что этот факт может понести за собой определённые юридические риски для Сellebrite и их пользователей.

Совершенно не связанное

По странному совпадению, будущие версии мессенджера Signal будут периодически загружать файлы для размещения в хранилище приложения (App Storage). Эти файлы никогда не используются ни для чего внутри Signal и никогда не взаимодействуют с самим мессенджером или данными, но они просто выглядят эстетично, а эстетика в программном обеспечении важна.

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

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

Подробнее..

Перевод Хакаем WhatsApp, чтобы следить за активностью контактов

26.04.2021 10:24:01 | Автор: admin
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 секунд строкой ?,,, и почти всегда за этим следует ответ !{timestamp}. Что-то типа проверки активности соединения. Нам это неинтересно.


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



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

Временная метка совпадает с тем, что мы видим в UI.


Преобразовано с помощью www.epochconverter.com

Ограничения


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


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

Также WhatsApp не позволяет нам открывать несколько параллельных экземпляров приложения (с одинаковыми куки). То есть мы никак не сможем одновременно открыть два канала веб-сокетов. Это было бы слишком просто!


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

Ещё одно ожидаемое ограничение: валидность сессии ограничена по времени. Срок моей истёк 22.10.2020, спустя шесть с лишним месяцев. Странно, что можно так получить подобную информацию на фронтенде. Возможно, я что-то не так понял.


Наивная реализация


Теперь, когда мы определили, в чём заключается функция status WhatsApp и как её можно злонамеренно использовать для слежения за пользователями, настало время писать код. Также мы взглянем на техническую реализацию и поищем возможные простые уязвимости безопасности.

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

Мне хочется увидеть, чего можно добиться дешёвым хакингом, а уже потом приступать к более сложным вещам.

Я разобью proof of concept на три этапа:

  • Получение данных
  • Сохранение данных (легко)
  • Визуализация данных (легко, но у меня вызовет сложности)

Скрейпить данные я буду с помощью Node.js и Puppeteer; Puppeteer позволяет нам управлять браузером и взаимодействовать также, как это бы делал пользователь с мышью и клавиатурой. Это позволяет нам избежать сложного реверс-инжиниринга на уровне веб-сокетов, и именно поэтому я выбрал этот способ. Вообще я больше привык работать с Selenium + C#. Это мой первый эксперимент с Puppeteer, так что не судите строго.

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 . = "${contactTarget}"]`))[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 ${contactTarget} is '${status}'.`); // `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 1465839830100400200status,contactName=Toto offlineSince=8280u 1465839830100400200status,contactName=Toto offlineSince=0u 1465839830100400200status,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=${contactTarget} offlineSince=${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 - ValueContactA,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Mobile,06 01 02 03 04ContactB,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Mobile,06 01 02 03 05ContactC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,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 = `${numbers[0]} ${numbers[1]} ${twoDigit(counter2)} ${twoDigit(    counter3  )} ${twoDigit(counter4)}`;  let csvRow = `Unknown${index},,,,,,,,,,,,,,,,,,,,,,,,,,,,,Mobile,${number}`;  fs.appendFileSync(fileName, csvRow + "\n");  counter4++;  console.log(`${index} -> ${number}`);}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

Важно указать, что я не знаю, какие из 5000 контактов действительны.

Я использовал французский диапазон номеров 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 имеет уведомление {x} is on Signal!, когда контакт начинает им пользоваться. Это помогает отслеживать переход пользователей на Signal.


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


Да, это картинка, чтобы за вами не могли следить.



На правах рекламы


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

Подробнее..

Пиринговые мессенджеры враг государства?

24.05.2021 12:21:25 | Автор: admin


В случае полного отключения интернета одна из главных проблем общение с товарищами и родственниками. Опыт Гонконга показывает, что для этого хорошо подходят децентрализованные P2P-мессенджеры, которые работают без интернета, используя mesh-сеть по протоколам Wi-Fi Direct, Bluetooth, Apple Multipeer Connectivity Framework, ANT+, LoRa и др.

Для эффективной коммуникации приложение нужно скачать максимальному количеству человек до начала блокады интернета. Иначе придётся искать файлы после блокады. Человек с нужными файлами станет настоящим авторитетом в офисе или в классе (как это было в Беларуси в августе 2020 года за файлами Psiphon люди реально приезжали из других микрорайонов города).

Вообще, вся история сетей wireless mesh намекает на то, что эта технология крайне не нравится правоохранительным органам.

Mesh-сети


Приложения типа FireChat создают mesh-сеть, используя Bluetooth и прямые подключения через Wi-Fi. Они обеспечивают обмен сообщениями и фотографиями в офлайне между устройствами, находящимися друг от друга на расстоянии примерно до 60 метров.

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

Другими словами, вам достаточно приблизиться на 60 метров к ближайшему пользователю и вы можете отправить сообщение кому угодно. Каждый юзер нода в сети. Без интернета.

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

Если какой-нибудь узел mesh-сети вдруг выйдет в интернет, то сообщения пакетом от всех пользователей уйдут получателям по всему миру.

Особенно удобно, если каналы или комнаты в мессенджере создаются автоматически и объединяют людей, которые находятся рядом с друг другом (многоквартирный дом, стадион, концертный зал).

Для передачи текстовых сообщений можно приспособить практически любую mesh-сеть, даже сеть из геометок Apple AirTag, которые вообще-то предназначены не для общения людей, а для поиска утерянных вещей. В мае 2021 года хакерам удалось расшифровать трафик AirTag и передать по сети Apple Find My произвольный текст под видом оригинальных зашифрованных сообщений с GPS-координатами. Скорость передачи составила 3байта в секунду. Задержка в сети от 1 до 60 минут.



Подобные mesh-сети есть также у Samsung (Smart Things) и Amazon (Sidewalk) на протоколе LoRa. В принципе, можно использовать эту инфраструктуру для пирингового обмена сообщениями, а также для съёма данных с устройств вне зоны доступа в интернет.

Трагедия FireСhat


FireChat проприетарное приложение от американской компании Open Garden. Эта фирма прекратила дальнейшую разработку, не открыв исходники.

Последняя версия приложения: 9.0.14 (копия на 4pda) вышла полтора года назад (примечание: доступ к сайту 4pda затруднён с территории РФ).


FireChat

Первая версия FireChat появилась в марте 2014 года под iOS, в апреле под Android. Среди сооснователей Open Garden и разработчиков программы Станислав Шалунов и Грег Хазел из компании BitTorrent, где они делали торрент-клиент uTorrent (200 млн пользователей). Там и познакомились.

Вероятно, предприниматели рассчитывали, что FireСhat станет настолько же успешным, как файлоообменные P2P-приложения. Если представить себе эту картину, то весь мир может объединиться в mesh-сеть, а интернет становится практически не нужен! Даже хостинг сайтов теоретически можно размазать в распределённой сети. Такая фантазия.

Очень быстро FireСhat приобрёл популярность в Ираке после того, как местное правительство ввело ограничения на использование интернета, а затем то же самое произошло в Гонконге, во время массовых протестов 2014 года.


Главной проблемой FireСhat во время массовых протестов в Гонконге стала безопасность. Сама архитектура открытой mesh-сети предполагает, что все пользователи приложения светятся как радиомаячки на расстоянии 60 метров, а то и больше. Так что полиции отловить их было очень просто. Наличие программы на телефоне однозначно доказывало вину. Можно предположить, что сотни или тысячи пользователей были арестованы благодаря FireСhat. К тому же, в приложении не использовалось шифрование, так что никакие сообщения не были действительно приватными.

Возможно, критика от специалистов по ИБ повлияла на решение американской компании Open Garden прекратить разработку и не публиковать исходники. Ну или ребята увидели, что всемирная популярность торрентов им не светит, а развитие программы пошло совсем не по тому пути.

Когда появился FireСhat, это была единственная программа такого рода, которая позволяла пользователям создавать mеsh-сети в офлайновом режиме (без интернета) и обмениваться сообщениями1.

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


Фото из статьи FireChat мессенджер, на котором работают протесты в Гонконге, The Guardian

Тем более обидно, если FireСhat создавали специально для Гонконга, как разработку аналогичного приложения Commotion Wireless в 2011 году профинансировал госдепартамент США в преддверии Арабской весны. Хотели как лучше, а получилось как всегда

После FireСhat фирма Open Garden торговала электронными сим-картами (eSIM), продвигала свою криптовалюту, но в последние годы про неё ничего не слышно.

Вообще, приложение FireСhat было не очень качественным. Во-первых, закрытый код. Во-вторых, для регистрации обязательно (!) был нужен доступ в интернет, хотя потом оно работало в офлайне. Короче, странная программа. Может и хорошо, что разработчики её похоронили.

Рация Zello


Близкой по логике функционирования является интернет-рация Zello, которая заблокирована в Российской Федерации в апреле 2017 года.

Радио работает по принципу уоки-токи или push-to-talk. Основное преимущество возможность слушать голосовые сообщения по громкой связи в реал-тайме, вообще не притрагиваясь к смартфону и в то же время быть на связи с большим количеством пользователей.

Хотя здесь передаётся не текст/картинки, а звук, но принцип работы такой же через mesh-сеть, без интернета. Близкие друг к другу пользователи соединяются друг с другом напрямую и передают сообщения дальше, по цепочке. Что важно, здесь используется сквозное шифрование (E2E).

В России приложение получило особую популярность среди дальнобойщиков и других автомобилистов, поскольку очень удобно (и приятно) беседовать с попутчиками, которые едут по той же трассе. Они подскажут о радаре в кустах, о ДТП на дороге и т.д. Репрессии со стороны государства начались после массовых протестов дальнобойщиков в связи с введением обязательной платы миллиардеру Игорю Ротенбергу за проезд тяжёлых грузовиков по дорогам России (система Платон). Координация протестов осуществлялась через Zello, поэтому программу решили заблокировать.

Это был первый прецедент, когда власти попытались сломать мессенджер, работающий по VPN. Понадобился целый год, чтобы заблокировать свыше 4тыс. IP-адресов из облака AWS, что не принесло успеха. Тогда РКН пошёл на шантаж компании Amazon, угрожая заблокировать 26 подсетей AWS, в сумме 13,5млн адресов.

Компания Amazon оказалась не готова к войне и отказалась предоставлять услуги Zello. Лишившийся облачной инфраструктуры сервис было легко заблокировать.

После успеха с блокировкой облачной VPN-инфраструктуры Zello, в 2018 году власти решили, что смогут успешно заблокировать такую же облачную инфраструктуру мессенджера Telegram. Но здесь нашла коса на камень: Павел Дуров инвестировал миллионы долларов в покупку всё новых и новых инстансов AWS, его брат Николай с коллегами запрограммировал систему обхода блокировок через прокси, а компании Amazon и Google выдержали блокировку своих подсетей в РФ. В итоге властям пришлось заблокировать 18 миллионов IP-адресов AWS и Google Cloud, что нарушило работу крупных ритейл-компаний, банков из топ-20, частных клиник и тысяч бизнесов в России. После двух лет выматывающей борьбы государство сдалось: руководителя Роскомнадзора уволили, Telegram разблокировали, а IP-адреса облачных сервисов удалили из чёрного списка.

Криптомессенджер Briar


Четыре года назад, в июле 2017 года, вышла первая публичная бета-версия мессенджера Briar, который работает через Tor или в офлайне, через пиринг. Его разработка продолжалась аж три года. Но продукт вышел на редкость качественный.

Это уже честный опенсорс. Приложение можно собрать из исходников (пошаговая инструкция для Android Studio). Оно доступно в каталогах приложений (например, Google Play) и отлично поддерживается: последняя версия 1.2.20 от 2апреля 2021года. Реализована стойкая криптография, сквозное шифрование.


По умолчанию мессенджер работает через интернет по протоколу Tor (луковичная маршрутизация). В этом случае программа создаёт на устройстве пользователя скрытый сервис Tor и соединяется со скрытыми сервисами Tor других людей из списка контактов. В случае отсутствия интернета она переходит на peer-to-peer коммуникации через Wi-Fi Direct, локальную сеть или Bluetooth.

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

Поддерживает передачу сообщений (но не файлов), приватные группы, блоги/статусы и импорт RSS. Есть несколько полезных функций, таких как блокировка приложения (по PIN-коду).

Система относительно защищена от посторонних: добавление новых контактов производится по QR-коду с другого телефона (подразумевается физическое присутствие лица) или через обмен контактами, или по уникальной ссылке. Таким образом, в контакты не должен попасть человек, с которым никто не знаком.



Briar Project некоммерческий проект, который сейчас ведут шесть добровольцев. Код на 97,7% написан на Java (+немного Kotlin, Python и Ruby) и поставляется под GPLv3. Вскоре после первого релиза код прошёл независимый аудит безопасности от компании Cure53. Она известна своим аудитом проектов SecureDrop, Cryptocat и Dovecot. Так что Briar действительно надёжный вариант для пиринговых коммуникаций.

Единственный минус, что приложение выпущено только в версии под Android. Официальной версии для iOS нет и не будет, потому что эта платформа накладывает жёсткие ограничения на разработчиков, не позволяющие реализовать некоторые идеи P2P, и является закрытым проприетарным продуктом.

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


Matrix, Riot, Element


Официальный клиент Element (бывший Riot) для относительно децентрализованной сети Matrix не поддерживает пиринговые коммуникации в офлайн-режиме и формирование mesh-сети.

В последнее время этот клиент получил некоторую известность. Сейчас количество пользователей Matrix/Element сравнимо с Briar или больше. У него есть сквозное шифрование, мосты в IRC, Slack, Telegram, Jitsi Meet и др. Но именно пиринга в офлайне нет.

См. также:


Secure Scuttlebutt p2p социальная сеть, работающая и в офлайне (есть клиент Manyverse для Android и iOS)

P. S. Кроме FireСhat, протестующие в Гонконге использовали малоизвестное мексиканское приложение Bridgefy, которое тоже умеет формировать mesh-сеть и передавать сообщения в офлайне. В октябре 2020 года приложение перешло на криптографический протокол Signal.

1 На самом деле ещё раньше были другие приложения, такие как Serval Mesh от проекта Serval Project или древний Commotion Wireless от Open Technology Initiative (с финансированием госдепа), но все эти разработки давно прекращены [вернуться]




На правах рекламы


Мощные виртуальные серверы на базе процессоров AMD EPYC для любых целей, в том числе для установки VPN.

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

Свой криптографический протокол опасная идея

01.06.2021 12:20:22 | Автор: admin

Разработка своей криптографии в чём-то сравнима с созданием собственного авиадвигателя, говорит эксперт по безопасности Руна Сандвик. Фото: Виталий Кузьмин

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

Казалось бы, почему не использовать открытые стандарты типа WebSocket и JSON, зачем собственный закрытый протокол? На это обычно приводят ряд причин. Во-первых, для безопасности, чтобы его было сложнее отреверсить и никто не понял, какие данные вы передаёте. Во-вторых, для эффективности. У нас ведь уникальный случай использования, поэтому стандартные решения не самые оптимальные. Наш собственный протокол будет работать с меньшими задержками, потреблять меньше трафика и меньше расходовать батарею (на мобильных устройствах). И третья причина функции. В своём протоколе специально для нашего приложения мы реализуем уникальные возможности, каких нет ни в открытом стандарте, ни у конкурентов.

Это распространённые причины, из-за которых разрабатывают проприетарные протоколы.

Безопасность


Поговорим о безопасности.

Любой безопасник скажет, что протокол должен быть закрытым. Это важно для защиты от конкурентов. И от клиентов тоже. Чем меньше клиент знает о протоколе тем меньше он контролирует систему, приложение. Вся власть остаётся в руках разработчика. Система полностью под контролем производителя, то есть вас. Соответственно, клиент навечно привязан к вам по обслуживанию, он не сможет ничего поломать в аппаратуре или софте. Он вообще побоится туда сунуться, потому что там ничего не понятно. Всё обфусцировано, зашифровано и написано на непонятном языке. Классика.

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

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

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

В общем, проприетарный протокол кажется очень выгодным для фирмы.

Но жизнь иногда показывает обратное. А именно:

  1. Принцип безопасность через неясность не работает. Любой протокол можно отреверсить.
  2. Проприетарная реализация шифрования это очень рискованно.
  3. Никто не поможет закрыть критические дыры в закрытом софте.

Принцип безопасность через неясность не работает в криптографии


Принцип безопасность через неясность (security through obscurity) заключается в том, чтобы скрыть внутреннее устройство системы или реализацию для обеспечения безопасности.

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

Сравните с опенсорсными системами, где разработчик специально открывает код, чтобы независимые сторонние эксперты помогли выявить и исправить эти недостатки.

В итоге получается, что собственный проприетарный протокол, максимально закрытый от посторонних глаз и обфусцированный, вовсе не увеличивает безопасность системы, а уменьшает её!


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

Голландский криптограф Огюст Керкгоффс изложил правила проектирования военных шифров в книге Военная криптография (1883). Основная идея была в том, что попадание системы в руки врага не должно причинять неудобств. Поэтому ничего, кроме ключа, не должно быть секретным.

Собственная криптография


Вопрос Почему не разработать собственную криптографию? чем-то похож на вопрос Почему не спроектировать авиадвигатель?, говорит Руна Сандвик, исследователь по безопасности. Конечно, теоретически мы можем это сделать. Но это чрезвычайно сложно. Гораздо более простой и надёжный вариант выбрать готовое решение, проверенные и надёжные протоколы и алгоритмы.

Поэтому в сообществе информационной безопасности вызывает большое подозрение, если какая-то компания реализует собственный проприетарный протокол. Например, проприетарный протокол MTProto в Telegram поначалу вызвал массу критических отзывов. Взлом MTProto1.0 стал одной из самых популярных статей на Хабре в 2013 году: Безопасен ли Telegram? Или как я искал закладку в MTProto (спойлер: глупые ошибки в проприетарной криптографии).

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

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

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

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

Конечно, в опенсорсе есть свои специфические риски. Например, проблемы с сотнями зависимостей, которые вы не контролируете. Например, 20% багов в проектах на GitHub явно внесены в проекты специально, со злым умыслом. То есть вредоносными контрибуторами, которые действовали умышленно. Ещё не забыта история c мейнтейнером ESLint, который 12 июля 2018 года опубликовал вредоносные версии пакетов eslint-scope и eslint-config-eslint в репозитории npm.

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


Поэтому иногда соглашаются продать свой проект (такая же история с расширениями для браузеров). А этот проект уже внедрён в качестве зависимости в тысячи других.

Но все проблемы безопасности решаемы. Независимый аудит открытого кода профессиональными экспертами лучшая гарантия его надёжности.

Кстати, в 2013 году проприетарный софт впервые обогнал опенсорсные проекты по среднему количеству багов на 1000 строк кода.


Источник: Coverity Scan Open Source Report

В прошлом веке считалось, что проприетарный софт пишут профессионалы, а Open Source любители. Сегодня же профессиональный уровень опенсорсных программ вовсе не уступает проприетарным. Может, даже превосходит их.

Возвращаясь к примеру Telegram. 5 декабря 2020 года двое итальянских математиков Марино Микулан и Никола Витоколонна опубликовали на сайте препринтов arXiv.org исследование Автоматическая символическая проверка протокола MTProto 2.0 в Telegram (вторая версия опубликована 30 апреля 2021 года, arXiv:2012.03141v1). Оно подтверждает безопасность обновлённой версии фирменного протокола MTProto 2.0.


Набор протоколов MTProto 2.0 (в голубой рамке) и область покрытия данной научной работы (светло-зелёным цветом). Схема из научной статьи Марино Микулана и Никола Витоколонны, arXiv:2012.03141v1

Статья содержит полностью автоматизированное доказательство надёжности аутентификации MTProto 2.0, обычного чата, зашифрованного end-to-end чата и механизмов повторного ввода ключей в отношении нескольких свойств безопасности, включая аутентификацию, целостность, конфиденциальность и совершенную прямую секретность, а также доказывает формальную корректность MTProto 2.0.


Протокол аутентификации MTProto 2.0. Здесь $\{m\}_{pk}$ означает асимметричное шифрование $m$ открытым ключом $pk$. В свою очередь, $\{m\}_{(k,iv)}$ означает симметричное шифрование общим ключом $k$ с вектором инициализации $iv$. Схема из научной статьи


Слегка упрощённая версия протокола MTProto 2.0 для секретных чатов. Все сообщения перенаправляются через сервер $S$: каждое сообщение между $X \in \{A, B \}$ и $S$ шифруется с использованием ключа авторизации $X$ (здесь не показан). Обратите внимание, что $g_{ab}$, $k$ и $iv$ не известны серверу $S$. Схема из научной статьи



Эта математическая работа чуть ослабила озабоченность экспертов по поводу проприетарного протокола MTProto2.0. Редкий случай, когда собственная нестандартная криптографическая система (пока) работает надёжно. В ней ещё не нашли таких фатальных уязвимостей, как в MTProto 1.0.

Неужели разработчики Telegram всё-таки научились и смогли сделать уникальный авиадвигатель без ошибок? Можно только порадоваться за них, ведь все пользователи Telegram участвовали в этом обучении как бета-тестеры. В каком-то смысле это наш общий успех.



На правах рекламы


Наша компания предлагает серверы с Linux или Windows. Не экономим на железе только современное оборудование и одни из лучших дата-центров в России и ЕС. Поспешите проверить!

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

Австралия и ФБР несколько лет распространяли среди криминала защищенное приложение, а потом арестовали 800 человек

08.06.2021 20:05:53 | Автор: admin

На Хабре не стоит объяснять, что любой смартфон, купленный в магазине потенциальный жучок, который могут прослушивать в любой момент. С какой целью это делается второй вопрос, но сейчас это и не столь важно. Тема статьи интереснейшая операция австралийской полиции и ФБР, связанная с криминалом, защищенными телефонами и шифрованием.

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

Что за компания такая?



Она, как и несколько других, продавали телефоны, чаще всего BlackBerry, у которых, кроме уже названных элементов, удалялись GPS-модули, браузеры, мессенджеры и т.п. Вместо этого устанавливались закрытые аналоги ПО Pretty Good Privacy (PGP) и клиент для передачи зашифрованных сообщений. При необходимости телефон можно было очистить от любых данных, причем удаленно.

Компания работала несколько лет, после чего ее все же закрыли, арестовав руководство и изъяв активы. После этого руководство отдали под суд. В материалах дела говорилось о том, что продукция компания использовалась, например, представителями наркокартеля Синалоа, а также разными криминальными группировками Южной Америки, Азии и других регионов.

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

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

Ну хорошо, а что там сейчас?


Сразу после того, как закрыли указанную компанию, а с ней сервисы обмена зашифрованными сообщениями EncroChat и Sky ECC криминальные группировки стали искать альтернативу.

Полиция Австралии снова ввела в работу агентов под прикрытием. Один из них, торговец наркотиками, стал раздавать устройства, модифицированные телефоны с безопасным ПО своим сообщникам. Главным средством общения служило приложение AN0M (или ANOM), которое позиционировалось как абсолютно безопасное.


Беспроволочный телеграф работал, телефоны с AN0M становились все более востребованными. Волна популярности настигла эти устройства со специализированным ПО на них в марте 2021 года. Полиция закрыла чрезвычайно популярный среди криминала сервис Sky ECC в марте 2021, и преступникам пришлось искать ему замену уже срочно.

Обычным путем распространить троянские телефоны не получилось бы, поскольку для того, чтобы приобрести устройство, покупателя должен был знать кто-то из владельцев такого девайса. В общем, нечто вроде круговой поруки, что крайне сложно преодолеть. Телефон позволял обмениваться сообщениями лишь единственным способом в том самом приложении. Все мессенджеры, почта и т.п. были удалены.

Развязка


Непонятно, как все это удалось сохранить втайне, но телефоны действительно распространились по всему миру. Ими пользовались представители 300 преступных группировок со 100 стран мира. Всего было куплено 12 тысяч телефонов. Их получили мафия, разного рода наркокартели, азиатские группировки и даже байкеры.


В один прекрасный момент полиция решила, что пора действовать. Австралийцы, ФБР и представители правоохранителей из 16 других стран мира получили результаты анализа переписок преступников. Кстати, всего полиция изучила около 27 миллионов сообщений. Все эти данные были тщательно изучены, составлены планы захвата. Конечно, переписку изучали не два дня, на это ушло полтора года кропотливой работы.

За последние несколько дней правоохранители провели около 1000 обысков, в результате которых изъяли тонны наркотиков, тысячи единиц оружия, десятки единиц модифицированного транспорта, включая роскошные авто, а также десятки миллионов долларов США как в фиате, так и в криптовалютах.

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

Подробнее..

Оплата в телеграм боте Платежи 2.0 Сбербанк Telegraf Node.js

02.05.2021 10:10:12 | Автор: admin

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



И в этом туториале мы создадим простого бота с Node.js на фреймворке Telegraf.js, который сможет принимать деньги с клиента и отправлять их на ваш счет через Сбербанк.


Платежи 2.0


Платежи 2.0


Платёжные боты существуют в Telegram с 2017 года. С их помощью можно безопасно оплачивать товары и услуги вроде доставки пиццы, не покидая приложения.


С сегодняшнего дня продавцы могут принимать платежи кредитными картами с помощью 8-ми встроенных платёжных систем в любом чате, включая группы и каналы.


На данный момент поддерживаются платежи из более чем 200 стран через следующие платежные системы:


Платежи 2.0


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


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


Создаём бота в Telegram


Бот в Telegram создается при помощи другого бота под названием @BotFather. Отправляем ему команду /newbot, выбираем имя, которое будет отображаться в списке контактов, и адрес. Например, Оплата в Telegram боте с адресом sber_pay_test_bot.


newbot


Если адрес не занят, а имя введено правильно, BotFather пришлет в ответ сообщение с токеном ключом для доступа к созданному боту.


ВНИМАНИЕ! Его нужно сохранить и никому не показывать.


Создаем проект Node.js


Далее создадим новый проект. Создаем папку.


Вводим в консоле:


mkdir sber_pay_test_bot && cd sber_pay_test_bot

Затем:


npm init 

Программа задаёт вам разные вопросы и создает package.json, который определяет настройки проекта, зависимости, скрипты, название и прочее. Для примера можно везде нажать enter


и добавим файл index.js в котором будет разрабатываться наш бот.


touch index.js    

Telegraf.js


Cтавим telegraf.js это один из популярных фреймворков для создания телеграм бота.


npm install telegraf@3.38 

Ставим библиотеку dotenv это модуль, который загружает переменные среды из файла .env в process.env., а также заодно поставим nodemon инструмент, который помогает разрабатывать приложения на основе node.js путем автоматического перезапуска приложения node при обнаружении изменений файлов в каталоге.


npm install dotenv nodemon

Добавляем скрипт запуска в package.json


"scripts": {    "start": "nodemon index"}

Из документации telegraf.js, копируем в наш проект первоначальную настройку бота.


const { Telegraf } = require('telegraf')require('dotenv').config()const bot = new Telegraf(process.env.BOT_TOKEN) //сюда помещается токен, который дал botFatherbot.start((ctx) => ctx.reply('Welcome')) //ответ бота на команду /startbot.help((ctx) => ctx.reply('Send me a sticker')) //ответ бота на команду /helpbot.on('sticker', (ctx) => ctx.reply('')) //bot.on это обработчик введенного юзером сообщения, в данном случае он отслеживает стикер, можно использовать обработчик текста или голосового сообщенияbot.hears('hi', (ctx) => ctx.reply('Hey there')) // bot.hears это обработчик конкретного текста, данном случае это - "hi"bot.launch() // запуск бота

Создаем файл .env куда в переменную BOT_TOKEN кладем токен, который ранее нам выдал @BotFather


BOT_TOKEN='сюда'

Запускаем бот командой


npm run start

Проверяем работу бота


check bot


Получаем PROVIDER_TOKEN от @SberbankPaymentBot


Для получения PROVIDER_TOKEN вам необходимо получить merchantLogin в Сбербанке. Для этого необходимо подключить услугу интерент-эквайринг в Сбербанке.


После того как вы его получили переходим в @BotFather и вызываем команду /mybots, где выбираем вашего бота.


Далее Payments


Payments


Где выбираем Сбербанк


Payments


Выбираем Connect Сбербанк Live


Payments


После этого вас перекинет на @SberbankPaymentBot, где нужно ввести ваш merchantLogin, который необходимо вводить без всяких префиксов -api или -operator. Например так: P71XXXXXXX21. Из-за того что я этого не знал, у меня ушло на переписку с техподдержкой Сбербанка неделя времени.


SberbankPaymentBot


После @BotFather выдаст вам токен, который нужно вставить в переменную PROVIDER_TOKEN файла .env


PROVIDER_TOKEN='41018XXXX:LIVE:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

SberbankPaymentBot


Подключаем оплату в приложении


Пишем в index.js следующий код:


const { Telegraf } = require('telegraf')require('dotenv').config()const bot = new Telegraf(process.env.BOT_TOKEN) //сюда помещается токен, который дал botFatherconst getInvoice = (id) => {  const invoice = {    chat_id: id, // Уникальный идентификатор целевого чата или имя пользователя целевого канала    provider_token: process.env.PROVIDER_TOKEN, // токен выданный через бот @SberbankPaymentBot     start_parameter: 'get_access', //Уникальный параметр глубинных ссылок. Если оставить поле пустым, переадресованные копии отправленного сообщения будут иметь кнопку Оплатить, позволяющую нескольким пользователям производить оплату непосредственно из пересылаемого сообщения, используя один и тот же счет. Если не пусто, перенаправленные копии отправленного сообщения будут иметь кнопку URL с глубокой ссылкой на бота (вместо кнопки оплаты) со значением, используемым в качестве начального параметра.    title: 'InvoiceTitle', // Название продукта, 1-32 символа    description: 'InvoiceDescription', // Описание продукта, 1-255 знаков    currency: 'RUB', // Трехбуквенный код валюты ISO 4217    prices: [{ label: 'Invoice Title', amount: 100 * 100 }], // Разбивка цен, сериализованный список компонентов в формате JSON 100 копеек * 100 = 100 рублей    payload: { // Полезные данные счета-фактуры, определенные ботом, 1128 байт. Это не будет отображаться пользователю, используйте его для своих внутренних процессов.      unique_id: `${id}_${Number(new Date())}`,      provider_token: process.env.PROVIDER_TOKEN     }  }  return invoice}bot.use(Telegraf.log())bot.hears('pay', (ctx) => { . // это обработчик конкретного текста, данном случае это - "pay"  return ctx.replyWithInvoice(getInvoice(ctx.from.id)) //  метод replyWithInvoice для выставления счета  })bot.on('pre_checkout_query', (ctx) => ctx.answerPreCheckoutQuery(true)) // ответ на предварительный запрос по оплатеbot.on('successful_payment', async (ctx, next) => { // ответ в случае положительной оплаты  await ctx.reply('SuccessfulPayment')})bot.launch()

Метод Telegraf replyWithInvoice это метод telegram.sendInvoice.


Используйте этот метод для отправки счетов. В случае успеха отправленное сообщение возвращается.


Запускаем бот командой yarn start и проверяем проходит ли оплата.


Проверить как работает оплата можно в наших телеграм ботах JavaScript Bot это бот с тестовыми вопросами по нашим курсам JavaScript, React Native, TypeScript, а также проверить платежи можно боте по изучению английских слов по эмодзи Englishmoji


Проблемы или вопросы?


Задавайте их в телеграм сообществе Боты на Telegraf


Подписывайтесь на наши новости и социальные сети.


JavaScript Camp

Подробнее..

Читаем telegram-каналы в виде новостной ленты, часть вторая, с осмыслением

05.03.2021 10:06:07 | Автор: admin

В течение нескольких часов после публикации статьи о запуске Телегрегатора (http://personeltest.ru/aways/habr.com/ru/post/544414/) приходили сообщения с благодарностями и вопросами по нюансам работы.

Но недолго я радовался: потом пошел поток сообщений о том, что бот перестал добавлять в поток новые каналы либо вообще не работал.

Я это списывал на не слишком подробную инструкцию по запуску, сбои в работе самого бота (о множестве существующих лимитов я узнал из недавней статьи http://personeltest.ru/aways/habr.com/ru/post/543676/), возможные ошибки пользователей.

Путем общения с пользователями, чтением логов и раздумий пришел к выводу, что юзербот (а именно так, в соответствие со статьей выше, принято называть аккаунт телеграма, работающий в режиме бота) упёрся в лимит каналов (500 на аккаунт, спасибо @Slavenin999 за наводку). Я не уточнял, приватных или публичных, да это и не важно. Юзер бот упёрся в них за день.

У меня было в планах выложить код Телегрегатора в открытый доступ, но, перед этим, я хотел его хоть немного привести в подобающий вид. Однако, учитывая события с лимитом, решил не откладывать в долгий ящик, и публикую его на гитхабе (https://github.com/parotikov/telegregator), чтобы каждый желающий смог развернуть его для себя и не ждать решения с обходом лимитов, т.к. это может затянуться..

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

inb4: пинать за код не надо, питон только осваиваю. это прототип, который не взлетел.

Инициализация всего

from telethon import TelegramClient, events, sync, functions, types, utilsfrom telethon.tl.custom import Buttonimport asyncioimport osimport loggingfrom TelegramCommand import *from database import *import importlibfrom dotenv import load_dotenvload_dotenv()logger = logging.getLogger("tggt")logger.setLevel(logging.DEBUG)fh = logging.FileHandler("app.log")formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setFormatter(formatter)logger.addHandler(fh)api_id = os.getenv("API_ID")api_hash = os.getenv("API_HASH")master_account = os.getenv("MASTER_ACCOUNT")bot_token = os.getenv("BOT_TOKEN")client = TelegramClient('telegregator_session', api_id, api_hash)

В начале подключаем все необходимые библиотеки, настраиваю логгер, подключение самого telethon'а. Дальнейшее общение с телегой будет происходить через client и его декораторы.

Все действия Телегрегатора разделены на три группы: реакция на команды пользователя, реакция на новые сообщения в добавленных каналах и реакция на служебные события (бот добавлен в чат, написал новый пользователь и т.д.).

Команды

На все входящие сообщения от пользователя бот реагирует через декоратор @client.on(events.NewMessage):

@client.on(events.NewMessage)    async def my_event_handler(event):        logger.info("\r\n\r\n\r\n-------------Новое сообщение----------------")        ## Определяем кто к нам постучался        if event.message.from_id:            contact = await add_contact(event.message.from_id)        # личка бота        management = 0        handled = 0        if hasattr(event.message.to_id, 'channel_id'):            handled = 1            # logger.info('сообщение пришло в канал (тип channel_id), нужно обрабатывать для пересылки')            try:                chat = await client.get_input_entity(event.message.to_id)            except Exception as e:                logger.error(e)        if hasattr(event.message.to_id, 'user_id'):            if event.message.to_id.user_id == 887053090 or event.message.to_id.user_id == None:                logger.info("сообщение в личку телегрегатора, обрабатывать как управляющую команду")                management = 1                try:                    chat = await client.get_input_entity(event.message.from_id)                    await client.send_read_acknowledge(chat, event.message)                except Exception as e:                    logger.error(e)            else:                try:                    chat = await client.get_input_entity(event.message.to_id)                except Exception as e:                    logger.error(e)        if hasattr(event.message.to_id, 'chat_id'):            logger.info('сообщение в группу (chat_id) %s, нужно обрабатывать как команду' % event.message.to_id.chat_id)            try:                chat = await client.get_input_entity(event.message.to_id)            except Exception as e:                logger.error(e)        if hasattr(event.message.to_id, 'channel_id'):            logger.info('сообщение в канал (channel_id) %s, нужно обрабатывать как команду' % event.message.to_id.channel_id)            try:                chat = await client.get_input_entity(event.message.to_id)            except Exception as e:                logger.error(e)            # для отладки, пересылаем сообщение админу            await event.message.forward_to(master_account)        # mark message as read        await client.send_read_acknowledge(chat, event.message)        #Парсим команду.         command_handler = TelegramCommand()        command, command_arg = command_handler.parseMessage(event.message.message)        # если распознана команда        if command:            # помечаем сообщение прочитанным            await send_read(event.message.from_id, event.message)            chat_command = command            logger.info('Команда: {}, аргумент: {}'.format(chat_command, command_arg))            # на присоединение к каналу            if chat_command == 'help':                await call_command(module='helpmessage', answer_to=chat)            if chat_command == 'new':                await call_command(module='new', answer_to=chat, contact=contact, group_name = command_arg)            if chat_command == 'test':                await call_command(module='test')            if chat_command in ['join', 'add']:                channels_list = command_arg.split(' ')                for channel in channels_list:                    await call_command(module='join', answer_to=chat, channel_name=channel)            # на отписку от канала            if chat_command in ['leave', 'remove', 'delete']:                channels_list = command_arg.split(' ')                for channel in channels_list:                    await call_command(module='leave', answer_to=chat, channel_name=channel)            # на список подписанных каналов            if chat_command == 'list':                await call_command(module='listchannels', answer_to=chat, feed_id=event.message.to_id.chat_id)            ## Вкл/выкл поток            if chat_command in ['stop', 'pause']:                await call_command(module='stop', answer_to=chat)            if chat_command in ['start', 'resume']:                await call_command(module='start', answer_to=chat)            if chat_command in ['deleteall', 'exit']:                await call_command(module='deleteall', answer_to=chat)            ## Фильтры и стоп слова            if chat_command == 'filter':                await call_command(module='filter', answer_to=chat, word = command_arg, contact_id = contact.contact_id)            if chat_command == 'filterremove' or chat_command == 'removefilter' or chat_command == 'unfilter':                await call_command(module='unfilter', answer_to=chat, word = command_arg, contact_id = contact.contact_id)            if chat_command == 'filterlist':                await call_command(module='filterlist', answer_to=chat, contact_id = contact.contact_id)            if chat_command == 'filterclear' or chat_command == 'clearfilter':                await call_command(module='filterclear', answer_to=chat, contact_id = contact.contact_id)            if chat_command == 'filterstop' or chat_command == 'stopfilter':                await call_command(module='filterstop', answer_to=chat)            if chat_command == 'filterstart' or chat_command == 'sartfilter':                await call_command(module='filterstart', answer_to=chat)            if chat_command == 'message':                await call_command(module='message', message=command_arg)

Тут проверяются наличие необходимых полей во входящем сообщении event.message. Определяем, в личку, в канал или в чат написали., И, через кучу ifов, выбирается модуль с соответствующей командой. Они лежат в отдельных файлах, которые импортируются динамически. Это первый кандидат на рефакторинг, надо обертки написать, чтобы поменьше кода дублировалось.

Все команды /join, /filter и прочие обрабатываются здесь.

Как поток подписывается на новые каналы

Тот же самый декоратор @client.on(events.NewMessage)обрабатывает сообщения в группах и каналах (PeerChat и PeerChannel), если переслать в него сообщение из канала для подписки:

if event.message.fwd_from and event.message.fwd_from.channel_id and event.message.to_id.__class__.__name__ == 'PeerChat':            logger.info("Вижу репост канала в группу")            try:                channelInfo = await client.get_entity(event.message.fwd_from.channel_id)            except Exception as e:                logger.error(e)                logger.error("не можем получить channelInfo для канала %s" % event.message.fwd_from.channel_id)                channelInfo = None                await event.reply('не могу подписаться. Если канал закрытый, попробуйте по инвайту')            else:                channelEntity = await client.get_input_entity(event.message.fwd_from.channel_id)                logger.info("Репост канала {} (@{}), id {}".format(channelInfo.title, channelInfo.username, channelInfo.id))                await call_command(module='join', answer_to=chat, channel_name=channelInfo.username)

Пересылка постов из каналов в ленту

Ну и главный функционал, это пересылка всех постов из подписанных каналов в одну ленту (поток):

async def handle_message(event):    try:        logger.info('ищем в БД поток, где channel_id = %s' % event.message.to_id.channel_id)        forwards = Forward.select().where(Forward.channel_id == event.message.to_id.channel_id)    except Forward.DoesNotExist:        logger.info('Канала нет среди пересылаемых')        forwards = None        return    if not len(forwards):        logger.info('нет подписок на этот канал')        return    logger.info("Нашли следующие потоки, подписанные на канал channel_id %s" % event.message.to_id.channel_id)    logger.info(forwards)    chat = await client.get_input_entity(event.message.to_id)    await client.send_read_acknowledge(chat, event.message)    for forward in forwards:        # определяем надо ли пересылать        try:            feed = Feed.get(Feed.feed_id == forward.feed_id)        except Feed.DoesNotExist:            logger.info('Поток не найден')            feed = None            return        if not feed.is_enable:            logger.info("Поток был отключен, не пересылаем")            return        # logger.info('Определяем создателя потока, куда должен транслироваться канал, откуда пришло сообщение')        log_message = 'Сообщение пришло в канал {}'.format(event.message.to_id)        if hasattr(event.message.to_id, 'channel_id'):            feed_id = forward.feed_id            try:                owner = Contact.select().join(Feed, on=(Contact.contact_id == Feed.contact_id)).where(Feed.feed_id == feed_id).get()            except Contact.DoesNotExist:                log_message = log_message + ', владелец канала не определен'                owner = None            else:                log_message = log_message + ', id владельца канала: {}'.format(owner.contact_id)            logger.info(log_message)        else:            logger.error('нет параметра event.message.to_id.chat_id')        log_message = 'пробуем фильтровать.'        filterlist = []        # TODO получать для конкретного юзера. нужно будет поменять логику и порядок, перенести на 438 строку        try:            filters = Filter.select().where(Filter.contact_id == owner.contact_id)        except filterlist.DoesNotExist:            log_message = log_message + ' нет фильтров'            filters = []        else:            log_message = log_message + ' найдены фильтры для юзера'            filterlist = [filter.word.lower() for filter in filters]        blacklistword = filterlist + ['запрещенный', 'выиграй', 'удалю', 'читать продолжение', 'joinchat', 'подписаться', 'подписывайся', 'подпишитесь', 'переходи', 'перейти в канал', 'подписываемся', 'дамы и господа', 'автор канала']        message = event.message        message_text = message.message        if message.entities:            for entity in message.entities:                if entity.__class__.__name__ == 'MessageEntityTextUrl':                    message_text = message_text + entity.url        if message.reply_markup:            for row in message.reply_markup.rows:                for button in row.buttons:                    if hasattr(button, 'url'):                        message_text = message_text + button.url                    if hasattr(button, 'text'):                        message_text = message_text + button.text        if any([word in message_text.lower() for word in blacklistword]): # ищем стоп слова во всех текстах и ссылках            log_message = log_message + "Найдены стоп-слова, не пересылаем"            logger.info(log_message)            return        logger.info(log_message)        logger.info("Фильтры прошли, пересылаем из канала %s в поток %s" % (forward.channel_id, forward.feed_id))        await event.message.forward_to(forward.feed_id)

Здесь по id канала (event.message.to_id.channel_id), куда пришло сообщение определяется, в какие потоки его следует переслать, путем выборки из БД через пивотную таблицу Forward. Forward это many-to-many связь между Feed и Channel (структура будет ниже). Проверяется, активен ли поток (я иногда отключаю потоки, чтобы не флудили, когда нет желания ничего читать).

Сообщения фильтруются по стоп-словам во второй части приведенного кода.

Надо будет вытащить список стоп-слов из кода куда-нибудь в конфиг. Как это лучше сделать?

Ну и вообще, много текстовых переменных в коде, нужно прикрутить какой-нибудь i18n со словарями. Что обычно для такого юзают?

Структура БД для хранения подписок

from peewee import *db = SqliteDatabase('telegregator.db')class BaseModel(Model):    class Meta:        database = dbclass Contact(BaseModel):    contact_id = IntegerField(unique=True)    added_at = DateTimeField(default=datetime.datetime.now)class Channel(BaseModel):    channel_id = IntegerField(unique=True)    channel_name = CharField(default='')    channel_title = CharField(default='')class Feed(BaseModel):    feed_id = IntegerField(unique=True)    contact = ForeignKeyField(Contact, backref='contacts')    is_filter = BooleanField(default=True)    is_enable = BooleanField(default=True)    feed_title = CharField(default='')class Forward(BaseModel):    feed = ForeignKeyField(Feed, backref='feeds')    channel = ForeignKeyField(Channel, backref='channels')class Filter(BaseModel):    word = CharField(unique=True)    contact = ForeignKeyField(Contact, backref='contacts')

На этом, пожалуй, всё. Надеюсь, кому-то будет полезно. Хотелось бы обсудить, как вы решали схожие задачи (призываю @aav в комменты)

Я старался везде оставить отладочные сообщения логгера с комментариями, так что код не должен оказаться слишком запутанным. Еще раз ссылка на репу: https://github.com/parotikov/telegregator

Если будут какие-то вопросы, то можно писать в телегу @parotikov. Ну, и, перед работой с внешними сервисами и API, проверяйте их возможности и лимиты, чтобы не быть как я :)

Подробнее..

Как я заставил робота читать трейдерские и инвест-каналы вместо меня

08.05.2021 18:17:24 | Автор: admin

Всем привет! Хочу поделиться одной моей поделкой, возможно она будет полезна кому-то еще. Решил переписать свою статью под хабр, добавив примеры кода, из которых себе можно собрать такого робота. Кому интересно, добро пожаловать под кат.

Предыстория

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

Знакомство мое с этой темой происходило в нескольких направлениях.

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

Во-вторых, ежедневно начал разбирать биржевые термины, явления и взаимосвязи, и писать для себя заметки в телеге. Таких постов за полгода набралось 500.

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

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

Проблема бесконечного потока информации

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

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

Что я тогда сделал

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

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

Теперь про код

Из библиотек нам понадобится по большому счету только telethon

from telethon import TelegramClient, events, syncfrom telethon.tl.functions.channels import JoinChannelRequestimport re

Чтобы сделать робота, который будет подключаться к телеграму по API нам понадобится зарегистрировать свое приложение на странице https://my.telegram.org/, войти в аккаунт, нажать на "API development tools", заполнить первые 2 поля, в Platform выбрать Desktop.

Скопировать App api_id, App api_hash в соответствующие переменные ниже. А в переменную PHONE_NUMBER ввести номер телефона, который привязан к аккаунту телеграмм.

API_ID = 1234567 # вставье свой api_idAPI_HASH = 'your_hash'PHONE_NUMBER = '+7xxxxxxxxxx'  

Далее нужно прописать имена каналов, которые будут на входе алгоритма

 CHANNELS = (             'channel1_name',  # здесь вводятся имена каналов              'channel2_name',  # без https://t.me, @ или ссылок - просто имя    'channel3_name                 )  

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

# мэппингnames = {    'channel1_to_post': ['interesting_text1',                          'interesting_text2'],    'channel2_to_post': ['other_channel_interesting_text1',                          'other_channel_interesting_text2',                          'other_channel_interesting_text3'],}# "разворачивание" под другой формат хранения + приведение к низкому региструd = {}for name in names.keys():    for t in names[name]:        d[t.lower()] = name.lower()print(d)

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

client = TelegramClient('session', API_ID, API_HASH)client.start()for channel in CHANNELS:    client(JoinChannelRequest(channel))

Далее собственно ожидание нового сообщения, проверка по шаблон и принятие решения, куда делать репост

# Ожидание новых постов и пересылка@client.on(events.NewMessage(CHANNELS))async def handler(event):    print(f'received text: {event.message.message}')        for tmp in d.keys():      await client.forward_messages(d[tmp], event.message)client.run_until_disconnected()

В итоге получилась целая сетка телеграм каналов (в каждом из которых выходит по паре твитов в день, в отличие от 150 в исходных каналах)

t.me/tesla_twits- Tesla
t.me/apple_twits- Apple
t.me/amazon_twits- Amazon
t.me/moderna_twits- Moderna
t.me/pfizer_twits- Pfizer
t.me/google_twits- Google
t.me/facebook_twits- Facebook
t.me/microsoft_twits- Microsoft
t.me/yandex_twits- Яндекс
t.me/mailru_twits- Mail.ru
t.me/mts_twits- МТС
t.me/aeroflot_twits- Аэрофлот
t.me/rosneft_twits- Роснефть
t.me/sber_twits- Сбер
t.me/gazprom_twits- Газпром
t.me/afk_twits- АФК Система
t.me/nornickel_twits- Норникель
t.me/vtb_twits- ВТБ
t.me/rusal_twits- Русал
t.me/lukoil_twits- Лукойл

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

Всем добра!

Подробнее..

Твиттер Илона Маска в телеграме и с переводом на русский

16.06.2021 16:13:28 | Автор: admin

Хочу поделиться одной моей поделкой, возможно, кому-то она тоже будет полезна. В этой статье я поделюсь тем, что я сделал, чтобы читать Twitter-аккаунт Маска в удобном мне месте и имея под рукой перевод англоязычных твитов на русский.

Проблема

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

Идея

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

Подводные камни

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

Вторая проблема, отказ твиттера в выдаче доступа к API в описанных мной кейсах. То есть остается единственный вариант заниматься веб-скраппингом. Ну что ж.

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

Технологии

Я решил попробовать самостоятельно и начал гуглить что-то вроде "parsing twitter without API". Нашлось достаточно много решений, сразу скажу, что решениеtwint библиотека с открытым исходным кодом, которая вполне работоспособна и подошла под мою задачу.

Для того, чтобы перевести текст с английского на русский, я сначала было собирался использовать google translate, но понимал, что в нем ограниченное количество бесплатных переводов, решил что попробую использовать единственную известную мне нейросеть для перевода с английского на русскийfairseqот Facebook AI Research. Качество перевода показалось мне вполне приемлемым с точки зрения того, чтобы понять в чем суть твита, хотя оно и не было идеальным.

Все это я обернул в скрипт на языке программирования python и запустил на постоянную работу на своем сервере.

Примеры кода

Чтобы собрать данные из твиттера без использования выделенных девелоперских доступов, логинов, паролей и API, нужно сделать следующее:

Установить библиотеку twint

pip3 install twint

Запустить код формата

twint -u <name_of_twitter_user> -o output.csv --csv --since 2020-01-01 --retweets

Здесь есть важный момент, что запускается это все из-под bash, при том что у библиотеки есть python API (да и написана она на питоне), но при этом я потратил довольно много времени и оно ни в какую не заводилось. При этом если запускать из командной строки - все кроме автоматического перевода постов у меня работало.

Из функционала, который есть у библиотеки еще отмечу:

  • Возможность искать твиты пользователя по ключевому слову

twint -u username -s pineapple
  • Возможность находить твиты пользователя с указанием номеров телефонов и почт

twint -u username --email --phone
  • Поиск твитов вокруг определенной локации

twint -g="48.880048,2.385939,1km" -o file.csv --csv
  • Сохранение в Elasticsearch или SQLite

twint -u username -es localhost:9200twint -u username --database tweets.db
  • Сохранение фоловеров, подписок и избранных для пользователя

twint -u username --followerstwint -u username --followingtwint -u username --favorites

Данные сохраняются в csv файл, в котором присутствуют такие поля как (перечислю те, которые использовал сам, так как их много и большинство несут мало информации):

id - идентификатор сообщения

conversation_id - идентификатор беседы

created_at - дата создания сообщения

tweet - текст сообщения

mentions - упоминания пользователей твиттера ( список словарей)

urls - вставленные по правилам твиттера ссылки (например на youtube)

photos - ссылки на картинки

link - ссылка на твит

reply_to - список словарей с пользователямя, ответом на твиты которых является твит

У библиотеки есть также возможность перевода на другой язык, но она у меня совсем не заработала. Собственно по этой причине я искал другую возможность. Нашел я, как упоминал выше, открытую разработку Facebook AI Research - библиотеку fairseq, в которой можно скачать веса нейронки для перевода в частности из английского в русский и наоборот.

pip install hydra-core

Итого необходимо было установить:

pip install torch pip install hydra-core==1.0.0 omegaconf==2.0.1pip install fastBPE regex requests sacremoses subword_nmt 

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

import torch# Compare the results with English-Russian round-trip translation:en2ru = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.en-ru.single_model',                        tokenizer='moses', bpe='fastbpe')ru2en = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.ru-en.single_model',                        tokenizer='moses', bpe='fastbpe')paraphrase = ru2en.translate(  en2ru.translate('PyTorch Hub is an awesome interface!'))assert paraphrase == 'PyTorch is a great interface!'

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

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

Как пользоваться

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

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

1) читать новые и старые посты Илона Маска

2) видеть перевод текста на русский язык

3) перейти по ссылке на исходный пост в твиттере

И все это без регистрации и смс:)

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

Подробнее..

Недоумение про ещё один корпоративный чат или как сделать приятно всем

21.06.2021 12:17:59 | Автор: admin

На рынке мессенджеров сейчас есть примерно всё, как на Привозе. Есть решения на открытом коде, есть мессенджеры с миллиардом пользователей (или даже двумя). Но четкого понимания, что же взять с прилавка, чтоб все сотрудники огромного банка (и его 300+ дочек) с улыбкой открывали какой-то один и это всё проходило бы под требования по безопасности, у меня не сложилось.

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

Чтоб было безопасно. Т.е. чтоб не просто data scientist модный в шортиках из одной американской/китайской/российской компании не мог в рамках своих задач узнать что-то полезное, а даже рядовой админ банка не смог увидеть или унести переписку одного уважаемого человека с другим. Даже в качестве картинки. Даже на свой админский супер-защищённый комп. Следовательно, оно должно быть self-hosted разворачиваемо отдельно и полностью контролируется исключительно теми, кому положено следить и зарплату за это платят. Ещё нужно подключиться к системам, отвечающим за безопасность передаваемого контента. Ещё нужно иметь в руках команды сопровождения все возможные рычаги, чтобы нерадивого пользователя можно было ограничить в желании другому пользователю передавать то, что не положено.

Чтобы было удобно. Сейчас на дворе 2021 год. Но даже закачать справочник пользователей или синтегрить с корпоративной телефонией банка что-то это уже подвиг на грани фантастики. И удивлению моему не было предела тот же slack обладает пользовательским интерфейсом, который физически невозможно объяснить курьеру из доставки подавай ему пользовательский интерфейс ala telegram. И желательно с видео конференциями встроенными. И прям очень нужен голосовой виртуальный ассистент, голосом удобнее. Ещё невозможно объяснить человеку, у которого есть одновременно два телефона, планшет и два компьютера почему ему нужно выбрать, где же можно работать с этим мессенджером, а где остаться без мессенджера. Ну и зачем каждый раз свой номер телефона светить не ясно.

Чтобы было удобно для внутренних коммуникаций. Тут приходят умные люди из разных отделов, департаментов и цельных предприятий и говорят нам возможность узконаправленных рассылок нужна. Таргетированных, как это модно называть. По полу, по городу, по региону, по подразделению, по должности и т.д. И в этот момент все open-source решения для чатов (а их только на github больше 2100 штук) куда-то деваются. Остаются те, кто реально зарабатывает. Но первый пункт не выполняется.

Чтобы развитие продукта помогало бизнесу, а не мешало всем подряд. Удивительно, но с этой точки зрения почти никто не смотрит. Сколько времени сотрудник тратит на поиск телефона в адресной книге где-то там, потом нужно найти телефон, чтобы позвонить и на этом телефоне набрать 11 заветных цифр. И выяснить, например, что номер с ошибкой. Гораздо удобнее нашёл ФИО, посмотрел фото и сразу набрал. Нужно ещё двоих подключить аналогично набрал и добавил. И никакой музыки от абонента, которому кто-то в это время позвонил, портящей всем 114 остальным участникам совещания не только настроение. 2021 на дворе. И чтоб если нужно любой модуль за месяц прикрутить можно было. Ну хорошо, иногда за два

Отсутствие зависимости от вендора и его капризов. Если ты маленькая организация из 50 человек (а по статистике таких ох как много), тебе нужно решение готовое. Даже когда 3000 человек нужно обслужить вопрос даже не стоит идёшь и выбираешь решение. Можно даже покапризничать и тендер объявить. А если у тебя 400 000 сотрудников? А если миллион планируется? Тут и вендоров вечных с хорошим SLA мало, и возможности их контролировать тоже не велики. Или вендор маленький и может случайно помереть при очередном кризисе или принятии закона/уехать ему понадобится всей командой, или вендор большой, но его мало интересуют проблемы конкретного клиента у него самого может быть 40 000 сотрудников и 1000 таких же клиентов по миру.

Казалось бы каждое из этих пяти требований по отдельности легко покрывается тысячами продуктов. Если взять и выкинуть одно тоже есть десятки. А вот всё вместе и сразу можно только самим мучительно делать. Чем и занимаемся. И вас зовём.

Ну и на всякий случай сошлюсь на бородатые требования одного habrовода (http://personeltest.ru/aways/habr.com/ru/post/405887/ - их мы тоже учли и удовлетворили): кроссплатформенность. Чтоб я наконец-то мог сидя на обеде, или в транспорте, или в отпуске кому-то что-то написать с телефона, да и узнать, что мне кто-то написал. И чтоб мой коллега, у которого Линукс, не делал каждый раз печальное лицо при слове чат. заточенный под общение в компаниях. Чтоб у меня был чат, где есть все мои коллеги и только мои коллеги живой активный проект. Чтобы баги, как застывшие в янтаре насекомые, не висели в продукте до конца времён передача файлов. Ну зачем мне заливать эту картинку в общую папку, если я просто могу кинуть её через чат! нормальная синхронизация уведомлений / непрочитанного. Чтобы не как в Скайпе словил сообщение, и потом в течение 24 часов находишь уведомление о нём на каждом своём девайсе.

Продолжение следует.

Подробнее..

Recovery mode Социальный эксперимент порядок из хаоса

14.05.2021 08:04:13 | Автор: admin

Бывало ли такое, что вы вас ограничивали за ваши мысли, так, что вы больше не могли высказаться в ответ? Весьма досадное чувство, не так ли? Как выстрел завершает жизнь человека, так и набор минусов способен лишить вас права существования на площадке.
Что будет если попытаться устроить общение по новым принципам, без администраторов, модераторов, без системы кармы, и даже без владельцев хоста? Сохранить свободу высказываний и при этом оградиться от хаоса? Я убежден что благодаря техническому прогрессу это стало возможно уже сегодня, и предлагаю на деле убедиться в этом, поучаствовав в эксперименте!

В чем суть?

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

(Лао-цзы)

Представьте себе затерянный телеграм чат, где нет владельца, и никто не был назначен модератором. У всех участников чата в фоновом режиме майнится некая валюта, просто по факту присутствия в чате, без регистрации. Благодаря встроеному в чат UX, валютой можно обмениваться и передавать друг другу, быстрее чем перевод в банке.
Ее также можно потратить чтобы закрепить свое сообщение на определенное время... или чтобы заблокировать спамера. Блокировка не удаляет человека, а лишь убирает ему поле ввода на время, в зависимости от затраченной на блокировку валюты. Система была бы несовершена без возможности отменить блокировку пользователю, точно также потратив на это часть своей накопленной валюты.

Звучит интересно, в чем отличие от кармы?

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

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

  3. Каждый "из коробки" обладает банхаммером, но его мощность ограничивается накопленной (и полученной от других пользователей) валютой. Поэтому систему не получится использовать для злоумышленного канселинга.

  4. Каждый может разбанить любого другого если у него достаточно валюты. Нет тотальной отмены с глубоким минусом, нет минуса которого нельзя отменить (как -100 на Хабре), нет лимитов прощения, было бы только желание подождать немного или попросить любого пользователя помочь вернуться сразу!

В чем цели эксперимента?

Проверить возможны ли новые, горизонтальные подходы во взаимодействии пользователей? Возможен ли отказ от иерархии? Можно ли общаться в интернете без концепции владения хостом? Можно ли автоматизировать модерацию? Успех эксперимента может стать толчком к расцвету таких систем. Эксперимент абсолютно некоммерческий, нет никакой рекламы, нет механизма извлечения выгоды. Я делаю это ради интереса посмотреть что получиться (и удовольствия пронаблюдать вышеописанную механику в действии).

Как поучаствовать?

Зайти в чат где все это реализовано: t.me/habr_experimental
В чате нет владельцев и админов, а вместо них подлючена и ждет наплыва пользователей вышеописанная система. Полагаю что тематика обсуждений может быть любая, на интересные целевой аудитории Хабра темы, и помните что никто ни в чем не может ограничить вас, кроме вас самих и таких же как вы людей.

Исходный код чата

Эта статья о социальном эксперименте, однако она была бы не для Хабра без технических деталей. Поэтому для тех кому это интересно, подробные принципы работы валюты и UX описаны в этой статье: habr.com/ru/post/556292/
Исходный код системы доступен на GitHub: github.com/demidko/timecobot
Для бекенда использован один из лучших виданных мною языков - Kotlin, за что хочу сказать здесь спасибо его разработчикам.

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

Подробнее..

Распознавание команд

03.06.2021 20:19:56 | Автор: admin

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

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

/** Правило проверяет лексему на соответствие */typealias Rule = (String) -> Boolean/** Нормализованное семантическое представление */open class Semnorm(vararg val rules: Rule)/** Правило задает стемы для семантических представлений */fun stem(vararg stems: String): Rule = { stems.any(it::startsWith) }/** Правило задает точные соответствия для семантических представлений */fun word(vararg words: String): Rule = { words.any(it::equals) }/** Проверяем слово на соответствие семантике */fun String.matches(norm: Semnorm) = norm.rules.any { it(this) }

Теперь у нас появилась возможность задавать предопределенные нормализованные семантические представления в виде объектов:

object Day : Semnorm(stem("day", "суток", "сутк", "дня", "ден", "дне"))

Фреймворк ставит их в соответствие лексемам входящих фраз, и предложение начинает выглядеть, например так:

assertThat(  "забань васю на 5 минут".tokenize(),   equalTo(   listOf(     Token("забань", Ban),      Token("васю", null),     Token("на", null),      Token("5", Number),     Token("минут", Minute)   )  ))

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

object Help : ExecutableSemnorm(stem(  "помощ", "справк", "правил", "help",   "rule", "faq", "start", "старт",)) {  override fun execute(bot: Botm: Message) {    val faq = message.from.relatedFaq()    bot.sendMessage(m.chat.id, faq)  }}

Что насчет более сложного поведения, зависящего от различных слов в предложении? Оно тоже поддерживается, вот как, например, исполняется, уже известное из тестов предложение забанить Васю:

object Ban : DurableSemonrm(stem(  "ban", "block", "mute", "бан", "блок",  "забан", "завали", "замьют",)) {  override fun execute(    bot: Bot, attackerMessage: Message, duration: Duration) {    val victimMessage = attackerMessage.replyToMessage    val victimId = victimMessage.from.id    val untilSecond = now().epochSecond + duration.inWholeSeconds    bot.restrictChatMember(      attackerMessage.chat.id, victimId, untilSecond)  }}

Откуда это семантическое представление знает о своей продолжительности? Дело в том, что ему вовсе не обязательно парсить всю цепочку токенов целиком. Достаточно задать только минимально необходимое поведение для каждого представления, например для времени:

object Week : Semnorm(stem("week", "недел")) {  override fun toDuration(number: Long) =     days(number) * 7}

Или для любых команд, зависящих от времени:

class DurableSemnorm(vararg rules: Rule) : ExecutableSemnorm(*rules) {  final override fun execute(    token: Iterator<Token>, bot: Bot, m: Message) =       execute(bot, message, token.parseDuration())  abstract fun execute(bot: Bot, m: Message, duration: Duration)}

Благодаря такой архитектуре, нам больше не приходится думать о запутанной логике работы интерпретатора. Достаточно просто определить желаемые атрибуты для семантических представлений и наслаждаться результатом. Пример бота, использующего эту концепцию, можно посмотреть на Github: https://github.com/demidko/timecobot

Подробнее..

Telegram-бот на Python для создания задач в MS Outlook и заметок в Evernote

29.03.2021 10:21:19 | Автор: admin

В MS Outlook есть прекрасный раздел задач. Это удобно и быстро. Можно с утра (или с вечера) накидать себе задачек на день и постепенно расщёлкивать их. Вторым уровнем группируем задачи по матрице Эйзенхауера или используем любой другой удобный вам инструмент тайм-менеджмента. Одна проблема с этими задачами: для их создания надо заходить в Outlook, щёлкать, писать, нажимать Enter, двигать в нужную группу. Это всё долго и не всегда удобно. Но есть в Outlook также правила, позволяющие письма содержащие определённые слова в теме автоматически делать задачами. Ещё быстрее и проще получится, если такие письма отправляются прямо из Telegram. О простейших ботах помогающих создавать задачи в MS Outlook и заметки в Evernote без необходимости сложных интеграций.

Бот: Telegram + Python + Docker

Строго говоря ботов два. Пока не получилось совместить весь функционал в одном боте так, чтобы это было удобно как переслать/накидать сообщение и нажать на кнопку "Send". Немного о стеке. Python был выбран за простоту кода и доступность для менеджеров проектов без глубоких познаний в программировании. Docker удобно упаковать бота в контейнер и запускать в нём, без необходимости думать о версиях Linux на хостинге, настройках сервисов и так далее. В качестве хостера использовался DigitalOcean, в котором Docker-контейнеры разворачиваются легко и просто.

Конечно же использовался не чистый Telegram API, а удобный telebot. Для отправки писем вполне подошла стандартная библиотека smtplib. Для сокращения текста используется textwrap. А формированием сущности сообщения занимается тоже стандартная email.mime:

import osimport telebotimport smtplibimport textwrapfrom email.mime.text import MIMEText

Пароли в контейнер кладём аккуратно. Чтобы не хранить их открытым текстом в исходнике, используем переменные окружения:

#ConfigurationCFG_TOKEN = os.environ.get('CFG_TOKEN') #TELEGRAM_BOT_TOKENCFG_SMTP_LOGIN = os.environ.get('CFG_SMTP_LOGIN') #'%YOUR_SMTP_LOGIN_ON_YANDEX%'CFG_SMTP_PASS = os.environ.get('CFG_SMTP_PASS') #'%YOUR_SMTP_PASS_ON_YANDEX%'CFG_SMTP_FROM = os.environ.get('CFG_SMTP_FROM') #'%FROM_EMAIL_ADDRESS%'CFG_SMTP_TO = os.environ.get('CFG_SMTP_TO') #'%TO_EMAIL_ADDRESS%'

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

Бот частный. Он не предназначен для раздачи доступов всем подряд. Поэтому в самом начале проводим проверку отправителя. Мне было лень писать обработчик значений с разными типами, поэтому я написал обработчик исключения:

try:    CFG_OWNER_ID = int(os.environ.get('CFG_OWNER_ID')) #YOUR_USER_ID_IN_TELEGRAMexcept:    CFG_OWNER_ID = os.environ.get('CFG_OWNER_ID')

Собственно письмо формируем по следующему алгоритму. Если текста сообщения менее или равна 40 символам, то помещаем его целиком в тему письма, а в теле пишем стандартный текст. Если более - помещаем первые 40 символов, а остаток кладём в тело письма. Это точно позволяет обойти какие-то правила антиспам-фильтра Яндекса, который использовался для рассылки сообщений.

msg = MIMEText('')if len(txt) > 40:txt = textwrap.shorten(txt, width=40, placeholder="...") #Лишнее обрезаем тремя точками  msg = MIMEText(message.text)else:msg = MIMEText("Задача из Telegram")

Если пересылаем сообщение другого пользователя (например, начальника) и делаем его сообщение задачей, то подсвечиваем в теме письма имя нашего контакта:

if "forward_sender_name" in message.json:txt = f'[{message.json["forward_sender_name"]}] {txt}'elif "forward_from" in message.json:  txt = f'[{message.json["forward_from"]["first_name"]}] {txt}'

Метим наше сообщение в теме как "[TASK]", чтобы MS Outlook мог его отличить от обычных писем и обработать правилами:

msg['Subject'] = f'[TASK] {txt}'

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

try:server = smtplib.SMTP_SSL('smtp.yandex.ru:465')  server.login(CFG_SMTP_LOGIN, CFG_SMTP_PASS)  server.sendmail(CFG_SMTP_FROM, CFG_SMTP_TO, msg.as_string())   bot.send_message(message.from_user.id, "Задача отправлена в Outlook")  server.quit()except Exception as err:  bot.send_message(message.from_user.id, f"При отправке сообщения произошла ошибка: {str(err)}")

Полный код бота доступен здесь: https://github.com/nsuvorov83/sendtask-bot

Настройка MS Outlook

Правила MS Outlook настраиваются просто:

А как отправлять заметки в Evernote?

Для того, чтобы была возможность отправить сообщение в бота, которое автоматом станет заметкой в Evernote нужно написать код чуть по сложнее. Принцип тот же: отправляем сообщение, которое потом превращается в e-mail отправляемый на специальный адрес. Все письма поступающие по этому адресу становятся заметками.

Ключевой момент здесь - обработка типов сообщений и вложений. Определяем функции-обработчики для различных типов сообщений Telegram:

def _is_photo(message):        return message.photodef _is_document(message):        return message.documentdef _is_text(message):    return message.textdef _is_caption(message):    return message.caption  #А вот как определяется сам тип сообщения. Если тип некорректный, то вернётся Falseif _is_photo(message):#Photo handler  cached_files = getPhotoCached(message)  #Insert into e-mail  for f in cached_files:  with open(f, 'rb') as file:    msg.attach(MIMEImage(file.read()))

Пересылаемые фотографии и документы обязательно надо закешировать прежде чем их можно будет вложить в E-mail. Суть функции одна, поэтому привожу её только для фото:

def cachFile(file_info):    dt = datetime.datetime.now()    timestamp = dt.timestamp()    downloaded_file = bot.download_file(file_info.file_path)    ext = os.path.split(file_info.file_path)[1].split('.')[1]    cached_file_name = str(timestamp) + '.' + ext    src = tempfile.gettempdir() + os.path.sep + cached_file_name    with open(src, 'wb') as new_file:        new_file.write(downloaded_file)    return src  def getPhotoCached(message):    cached_files = []    ff = message.photo[-1]    file_info = bot.get_file(ff.file_id)    asrc = cachFile(file_info)    cached_files.append(asrc)    return cached_files  if _is_photo(message):        #Photo handler        cached_files = getPhotoCached(message)        #Attach into e-mail        for f in cached_files:            with open(f, 'rb') as file:                msg.attach(MIMEImage(file.read()))

Тему сообщения формируем аналогично, как для отправки задач, но можем добавить к ней стандартные теги. Мне удобно метить все сообщения из Telegram а также добавлять тег текущего года. Можно также предусмотреть ситуацию, когда текста сообщения нет и сформировать стандартный заголовок для таких заметок:

if len(txt) > 30:txt_subject = textwrap.shorten(txt, width=30, placeholder="...")elif len(txt) == 0:  #Стандартный заголовой для заметок без текста включает "Из Telegram", текущую дату и время  now = datetime.datetime.now()txt_subject = 'Из Telegram ' + str(now)else:txt_subject = txtmsg['Subject'] = f'{txt_subject} #{d.year} #из_telegram'

Процесс отправки e-mail стандартный и описан выше.

Полный код бота найдёте здесь: https://github.com/nsuvorov83/sendevn-bot

Подробнее..

Опенсорс-бот для трекинга SLA в хелпдеске

10.03.2021 12:22:46 | Автор: admin

Лебовски создавался для биллинга (отсюда и название), но быстро прижился везде, где была нужна простая статистика по хелпдескам.

Все началось в декабре 2019-го. Ко мне пришли проджекты и тестировщики из биллинга: Есть канал в Slack, куда мы кидаем обращения по проблемным платежам. Хотим вести по ним статистику: смотреть, какие типы обращений встречаются чаще, понимать, сколько времени заняло решение.

Slack не дает циферок, но многим их хочется. Поэтому есть вариант интегрироваться с Jira, затем строить графики в Redash или Grafana. Тут кажется, что нужна помощь аналитика но для простых случаев это как гвозди микроскопом забивать. Зацепившись за слово статистика, я подумал о таблицах: в них можно считать всякие метрики с помощью формул, а если понадобится что-то сложнее аналитики смогут настроить выгрузку данных.

Итак, мы можем подключить бота к каналу в Slack, сделать простой интерфейс со списками и лить данные в таблицу. Можно в свою базу данных, можно в Google Таблицы. Выбирая решение для прототипа, я остановился на последних: с ними умеют работать все, особенно менеджеры (мой основной заказчик), и у продукта есть готовое API.


Так за 4 часа ожидания пересадки в аэропорту Хельсинки появился MVP бота.

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

Благодаря таблицам мы стали быстро собирать фидбэк от заказчика, и вскоре бот оброс новыми фичами:

  • появились реакции: время попадания запроса в канал не равно старту работ по нему, поэтому саппорт ставил эмодзи, когда на самом деле брал обращение, и этот момент в формате дата-время тоже попадал в таблицу;
  • саппорт мог отметить, сколько времени занял непосредственно фикс проблемы, так у бота появилась вторая кнопка Залогировать время;
  • если задачу требовалось передать в другой отдел, то можно было указать, кому и в какой.

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

Как бот стал популярным и как я упрощал его поддержку


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

Лебовски быстро заметили в других проектах. И пришли с классическим: А напишите нам похожего. Мы уже шаблонизировали других популярных ботов в компании, чтобы не тратить ресурс разработки на типовые задачи, и пошли этим же путем тут.

  • Простая функциональность для раскатки на другие команды: каждый новый Slack-канал подключается простым добавлением пары ID (к какому каналу подключиться и куда отправлять данные) на GitHub. Завести бота для нового заказчика внутри компании буквально дописать 6 строк в один из файликов.
  • Добавление категорий без участия разработки: в табличке у каждого заказчика есть лист, на котором можно дописывать классы обращений, не привлекая нас. А оно передается в бот.
  • Поддержка Slack Workflows. Что любят люди, помимо таблиц? Формы. Поэтому Slack сделал нативное решение, которое их заменяет. Но т.к. формы реализованы на базе бота, а наш бот обучен не учитывать сообщения от других ботов и не отвечать на них (были забавные инциденты), пришлось чуть повозиться с тонкими настройками фильтра не реагируй на других ботов.

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

И решил, что пора его опенсорсить


Теперь вы можете поднять своего Лебовски на своем сервере (или в Heroku) и пользоваться им в своем рабочем Slack. Инструкции о том, как его развернуть, а также сами исходники бота лежат на нашем GitHub здесь.

Сейчас Лебовски работает так:

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



  • когда саппорт ставит сообщению определенный эмодзи (какой именно можно задать в конфиге), обращение помечается как В работе и дата/время установки эмодзи сохраняется в таблице (так вы можете отслеживать SLA);
  • саппорт может залогировать время, потраченное на обращение, с помощью кнопки Залогировать работу. Ворклоги сохраняются на отдельном листе в удобном формате;
  • как только саппорт закончил работу над тикетом, он нажимает на Закрыть обращение, после чего Лебовски спрашивает категорию и исполнителя обращения и складывает эти данные в таблицу.

С одной стороны может показаться, что этот бот делает не так уж и много, но в повседневной жизни этого достаточно, чтобы посчитать много полезных метрик, например AFRT (Average First Response Time) и ACRT (Average Case Resolution Time).

Но лучше 1 раз попробовать, чем 100 раз прочитать.

Что еще почитать про боты в Slack: 7 cмертных грехов Slack в большой компании (и как победить их автоматизацией).
Подробнее..

Интеграция Skype For Business с IP-АТС в крупной нефтехимической компании

18.05.2021 10:20:20 | Автор: admin
Использование программных продуктов для звонков, чатов и видеоконференций стало неотъемлемой частью работы практически любой компании. Всё чаще возникает ситуация, когда для связи между сотрудниками используются параллельно две системы IP-АТС и так называемая система объединенных коммуникаций (Skype for Business, Teams и другие). Возникает путаница: пользователям не всегда понятно, какой тип связи предпочтительнее использовать, где лучше организовать конференцию, куда приглашать внешних участников на встречу. В статье я расскажу об успешной интеграции телефонии и системы объединенных коммуникаций, реализованной ЛАНИТ-Интеграцией в крупной нефтехимической компании. И хотя кейс не является пошаговой инструкцией, уверен, он будет многим полезен.

Источник

О проекте


К нам за помощью обратилась крупная нефтехимическая компания с большим количеством офисов по всей стране. В офисах используются IP-АТС различных производителей, в основном Cisco и Avaya, при этом часть задач помогает решать Skype For Business (SFB). Нам предстояло провести интеграцию системы телефонной связи компании со Skype For Business так, чтобы пользователи SfB могли осуществлять вызовы на стационарные телефоны и наоборот. Отказываться от одного из каналов связи и целиком переходить на другой заказчик не планировал. Требовалось настроить работу системы таким образом, чтобы на каждый входящий звонок пользователь имел возможность ответить как ему удобнее с телефона или со SfB. Разумеется, решение должно быть отказоустойчивым.

Для тех, кто не знаком близко с работой SIP-телефонии, кратко опишу ее базовые принципы. При звонке между клиентами возникает передача двух видов сетевого трафика: трафика сигнализации (SIP Session Initiation Protocol) и медиатрафика (RTP Real-time Transport Protocol и SRTP Secure Real-time Transport Protocol). По SIP передается информация, необходимая для начала и завершения сеанса разговора. В пакетах SIP присутствуют данные, например, о номерах телефонов или информация, когда абонент ответил на вызов, когда завершил его. Медиатрафик включает в себя непосредственно звук (голос), сжатый кодеками.

При настройке интеграции SfB c IP-АТС есть два возможных сценария:

  • настройка SIP-транков (каналов связи между двумя системами) напрямую между IP-АТС и SfB;
  • настройка взаимодействия между системами через SBC (Session Border Controller).

В нашем проекте используется второй сценарий по нескольким причинам.

  1. На площадках заказчика большое количество IP-АТС различных производителей с различными версиями прошивок. Не со всеми из них была техническая возможность установки прямого SIP-транка со SfB.
  2. Решение должно быть типовым на всех площадках.
  3. Одно из требований минимизация изменений в конфигурациях IP-АТС.

Планирование


В качестве SBC мы использовали решение от компании AudioCodes. В линейке решений этого производителя есть AudioCodes Mediant Virtual Edition (VE). В нашем случае оно подходило лучше остальных, так как на площадках уже имелись хосты виртуализации с достаточным количеством свободных мощностей. Если на каждой площадке развернуть по две виртуальные машины и разместить их на разных хостах, то мы получим отказоустойчивое решение на уровне сервиса это нам и было нужно. Такое решение избавляло от необходимости приобретения и установки дополнительного оборудования.

В итоге схема построения SIP-транков и размещения SBC была такой:


Размещение SBC на каждой площадке обусловлено несколькими причинами:

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

Схема была согласована, и мы приступили к развертыванию стенда и тестированию.

Тестирование


При тестировании нам требовалось:

  • найти рабочую конфигурацию оборудования для построения SIP-транка с каждым типом и версией прошивки IP-АТС заказчика;
  • проверить работу требуемых сценариев звонков с каждым типом и версией прошивки IP-АТС;
  • описать требуемые изменения.

Была развернута тестовая инфраструктура cо Skype for Business, несколько IP-АТС нужных версий и пользовательские станции. Мы приступили к конфигурированию. Прямые звонки между клиентами SfB и каждой IP-АТС заработали без проблем после настройки маршрутизации звонков. Тонкие моменты обнаружили при тестировании форкинга звонка (когда при звонке на стационарный телефон у пользователя звонок приходит и на телефон, и в клиент SfB). Для лучшего понимания форкинга звонка приведу пример. У нас есть пользователь 1 с номером телефона 201 и пользователь 2, у которого есть телефон с номером 202. Есть учётная запись в Skype For Business с номером 5202. Пользователь 1 решил позвонить пользователю 2 и набрал на телефоне номер 202. Далее звонок должен идти следующим образом.

  1. IP-АТС ищет абонента с номером 202 и находит его. В настройках этого абонента стоит одновременный звонок на номер 5202.
  2. Звонок уходит на телефон 202 и срабатывает маршрутизация звонка в SIP-транк с SBC.
  3. SBC направляет звонок в SfB.
  4. SfB находит пользователь с номером 5202 и направляет звонок на клиент SfB этого пользователя.

В итоге у пользователя 2 звонит и телефон, и SfB, и он сам решает где ему удобнее ответить на вызов.

Схема звонка с форкингом:


Подводные камни


Есть четыре возможных сценария обработки входящего вызова:

  1. пользователь снимает трубку на телефоне;
  2. пользователь отвечает в SfB;
  3. пользователь нигде не снимает трубку и звонок сбрасывается по таймауту;
  4. звонящий кладёт трубку до того, как будет принят вызов или звонок сбросится по таймауту.

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

Пользователь снимает трубку на телефоне


Проблема: В SfB вызов может отмечаться как пропущенный в журнале вызовов. Почему так происходит? Дело в том, что при форкинге IP-АТС направляет звонок сразу на два номера: абоненту IP-АТС и в SIP-транк. И когда звонок снимается на телефоне абонента, IP-АТС отправляет SIP-запрос CANСEL в сторону SfB, как бы говоря, что звонить больше не надо.


IP-АТС может не вложить в запрос CANCEL информацию о том, что трубка снята в другом месте. В этом случает SfB думает, что это звонок, который сбросил сам звонящий, и помечает его как пропущенный, а это не является правдой. При детальном разборе логов звонков и изучении документации было найдено RFC, в котором описывается заголовок Reason для запросов CANCEL. Именно в этом заголовке должна содержаться информация о том, что звонок был принят в другом месте.

Ссылка на RFC: https://tools.ietf.org/html/rfc3326

Большая часть IP-АТС заказчика не поддерживала RFC 3326.

Решение: Выяснилось, что чаще всего в последних версиях прошивок IP-АТС включена поддержка RFC 3326. После обновления до последней версии проблема пропала.

Для тех же IP-АТС, в которых нет поддержки RFC 3326, найдено обходное решение: SBC Audiocodes позволяет модифицировать отправляемые SIPпакеты. В этом сценарии нам необходимо добавлять в запросы CANCEL заголовок с информацией о том, что звонок был принят в другом месте. В нашем случае для этого необходимо было в Audiocodes создать новый Message Manipulations, который добавляет заголовок Reason со значением'SIP;cause=200;text="Call completed elswhere";ms-acceptedby="sip:OnPBX@domain.local"' и привязать это правило на соответствующую IP Group.


Пользователь отвечает в SfB


В этом сценарии проблемы с отображением звонка как пропущенного не возникло.

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


Проблема: После сброса звонка по таймауту клиент SfB может продолжать звонить, хотя сессия звонящего с IP-АТС уже разорвана.

Это происходит потому, что при срабатывании таймаута на некоторых IP-АТС, они не отправляют никакую информацию в сторону SfB, и SfB не знает, что сессия уже завершена.

Решение: Изменить настройки так, чтобы время таймаута SfB было меньше, чем время таймаута на IP-АТС.В случае, если звонок завершается по таймауту со стороны SfB, звонок завершается и на телефоне. Информация о пропущенном звонке везде отображается корректно.

Звонящий кладёт трубку до того, как будет принят вызов или звонок сбросится по таймауту.


Проблема: Если звонящий положил трубку до ответа, и если звонок принят на телефоне IP-АТС без поддержки RFC 3326, то в сторону SfB отправляются абсолютно одинаковые SIP-запросы CANCEL. SBC обрабатывает эти запросы по правилу, которое было создано ранее, и на SfB звонок не появляется как пропущенный.

Решение: Использование IP-АТС с поддержкой RFC 3326.

В нашем проекте заказчик принял решение всё же временно использовать добавление заголовка Reason и в дальнейшем отказаться от использования IP-АТС без RFC 3326.

В итоге


Детальное предварительное тестирование решения со всеми видами IP-АТС позволило заранее узнать о большинстве тонких моментов. Внедрение прошло относительно быстро один-два дня на каждую площадку.

Хотя в статье был описан один кейс интеграции Skype For Business с телефонией, принципы и решения подходят для любых подобных интеграций. Например, аналогичные решения мы успешно применяли в проектах интеграции телефонии с Microsoft Teams. Надеюсь, описанные в статье решения помогут сэкономить вам время при внедрении.
Подробнее..

Как подключить официальный WhatsApp бизнес API через Gupshup и интегрировать с Битрикс24

02.04.2021 00:13:18 | Автор: admin
WhatsApp BusinessAPIWhatsApp BusinessAPI

В данной пошаговой инструкции мы подробно опишем весь процесс получения доступа к WhatsApp Business API через официального партнера Facebookсервис Gupshup и подключения WhatsApp к Открытым линиям Битрикс24 CRM. Данный сервис мы нашли для себя, для своих бизнес задач и хотим этим поделиться с вами.

Отличительные особенности сервисаGupshup

СервисGupshupСервисGupshup
  1. Можно подключать любые свои существующие номера телефонов (мобильные, стационарные, виртуальные). Количество подключаемых телефонных номеров не ограничено и не влияет на стоимость. То есть, можно организовать неограниченное количество каналов.

  2. Нет ежемесячной абонентской платы и платы за подключение. В рамках 24 часового сессионного окна оплачиваются только сессионные входящие и исходящие сообщения по цене $0.001 (~78 коп.) за одно сообщение. Пополнение баланса сервиса от $10 любой банковской картой. Время использования средств на балансе не ограничено. Нет ограничений по количеству диалогов и клиентов.

  3. Для возможности написать пользователю по истечению 24 часов с момента последнего сообщения от него, можно подготовить специальные шаблоны и получить их одобрение со стороны WhatsApp. Общая стоимость отправки шаблонного сообщения составит $0.001 (~78 коп.) + стоимость сообщения по тарифам WhatsApp (для России $0.0477 (~34 руб.)).

  4. При регистрации в сервисе, на баланс бесплатно зачисляется $1. Эти деньги можно расходовать на полноценное использование сервиса в начале работы. Если к примеру отправлять и получать только сессионные сообщения, то хватит на 1000 сообщений. Время использования пробного баланса не ограничено.

Основным условием Facebook для подключения к WhatsApp Business API является наличие зарегистрированного юридического лица, например ООО или ИП, на физическое лицо доступ получить не получится.

Итак, начнем двигаться по шагам.

1. Создание аккаунта в Facebook BusinessManager

Если у Вас уже есть аккаунт в Facebook Business Manager, то пропустите этот пункт и переходите к следующему.

Войдем в свой личный аккаунт в Facebook и создадим аккаунт Business Manager, для чего перейдем по ссылке https://business.facebook.com/overview и нажмем кнопку СОЗДАТЬ АККАУНТ, откроется окно для ввода данных компании.

Создание аккаунта Business Manager в FacebookСоздание аккаунта Business Manager в Facebook

Согласно подсказкам над полями, вводим название компании, имя и фамилию, e-mail и нажимаем кнопку Отправить.

В следующем окне введем информацию о компании и нажмем кнопку Отправить.

Добавление информации о компании при создании аккаунта в Facebook Business ManagerДобавление информации о компании при создании аккаунта в Facebook Business Manager

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

Необходимость подтверждения адреса электронной почты при создании аккаунта в Facebook Business ManagerНеобходимость подтверждения адреса электронной почты при создании аккаунта в Facebook Business Manager

Зайдем в почту и нажмем на кнопку Подтвердить из письма.

Подтверждение адреса электронной почты при создании аккаунта в Facebook Business ManagerПодтверждение адреса электронной почты при создании аккаунта в Facebook Business Manager

2. Активация кнопки Начать подтверждение в Facebook BusinessManager

Если у Вас эта кнопка уже активна или ваша компания уже подтверждена в Facebook Business Manager, то пропустите этот пункт и переходите к следующему.

По умолчанию, кнопка для начала подтверждения компании в Facebook Business Manager не активна. Для того, чтобы её сделать активной, нужно произвести описанные ниже действия.

Залогиньтесь в https://developers.facebook.com. Для этого нажмите в верхнем меню на пункт Начало работы.

Нажмите в верхнем меню на пункт Начало работыНажмите в верхнем меню на пункт Начало работы

В следующем окне нажмите кнопку Продолжить.

Нажмите кнопку ПродолжитьНажмите кнопку Продолжить

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

Нажмите кнопку Подтвердить электронный адресНажмите кнопку Подтвердить электронный адрес

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

Нажмите кнопку "Завершить регистрацию"Нажмите кнопку "Завершить регистрацию"

В следующем окне нажмите кнопку Создать приложение.

Нажмите кнопку "Создать приложение"Нажмите кнопку "Создать приложение"

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

Нажмите кнопку "Продолжить"Нажмите кнопку "Продолжить"

В следующем окне введите любое Отображаемое название приложения, выберите Назначение приложенияВы или принадлежащая вам компания, выберите ваш Аккаунт Business Manager и нажмите кнопку Создание приложения.

Нажмите кнопку Создание приложенияНажмите кнопку Создание приложения

3. Подтверждение компании в Facebook BusinessManager

Если ваша компания уже подтверждена в Facebook Business Manager, то пропустите этот пункт и переходите к следующему.

Перейдите в раздел Центр безопасности по ссылке https://business.facebook.com/settings/security. Кнопка Начать подтверждение стала активной. Нажмите ее для начала подтверждения.

Нажмите кнопку Начать подтверждениеНажмите кнопку Начать подтверждение

С официальной информацией от Facebook о подтверждении компании можно ознакомиться по ссылке: https://www.facebook.com/business/help/2058515294227817?id=180505742745347.

На первом шаге подтверждения введем данные нашей компании:

Юридическое название компанииназвание компании, как в указано в документах на регистрацию компании.

Странастрана регистрации компании.

Адрес (улица, дома)улица и номер дома юридического адреса компании, как в указано в документах на регистрацию компании.

Адрес 2/Населенный пунктвводим, если имеется.

Городгород юридического адреса компании, как в указано в документах на регистрацию компании.

Штат/провинция/регионрегион юридического адреса компании, как в указано в документах на регистрацию компании.

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

Номер телефона компанииномер телефона, который принадлежит данному юридическому лицу (должны быть подтверждающие документы: договор, счета на оплату за телефон и т.п.).

Сайтадрес веб-сайта компании (домен сайта должен совпадать с доменом электронного адреса компании).

Подтверждение компании в Facebook Business Manager. Шаг 1-ввод данных компании.Подтверждение компании в Facebook Business Manager. Шаг 1-ввод данных компании.

На втором шаге подтверждения компании необходимо подтвердить юридическое название компании.

Для этого нужно загрузить документы из списка:

  • Лицензия на ведение коммерческой деятельности (если имеется);

  • Свидетельства о регистрации или учредительные договоры (ОГРН или учредительный договор);

  • Свидетельство о регистрации налогоплательщика (ИНН).

Мы, когда это делали для себя, загружали сканы ОГРН и ИНН компании.

Подтверждение компании в Facebook Business Manager. Шаг 2-подтверждение юридического названия компании.Подтверждение компании в Facebook Business Manager. Шаг 2-подтверждение юридического названия компании.

На третьем шаге подтверждения компании необходимо подтвердить юридический адрес и номер телефона компании.

Для этого нужно загрузить документы из списка:

  • Счет за коммунальные услуги, например электроэнергию или телефон;

  • Справка из банка, на которой указан адрес;

  • Лицензия на ведение коммерческой деятельности с адресом или телефоном компании (если имеется).

Мы загрузили сканы: договора на аренду офисного помещения по юридическому адресу, информационного письма об учете в Статрегистре Росстата, счета на оплату за телефонный номер от оператора связи.

Подтверждение компании в Facebook Business Manager. Шаг 3-подтверждение юридического адреса и номера телефона компании.Подтверждение компании в Facebook Business Manager. Шаг 3-подтверждение юридического адреса и номера телефона компании.

На четвертом шаге необходимо получить и ввести код подтверждения.

Для этого нужно в разделе Выберите, как с вами связаться выбрать телефон и нажать кнопку Позвоните мне. Поле Мой рабочий электронный адрес оставляем пустым.

Подтверждение компании в Facebook Business Manager. Шаг 4-получение кода подтверждения по телефону.Подтверждение компании в Facebook Business Manager. Шаг 4-получение кода подтверждения по телефону.

Позвонит робот и продиктует цифры, которые нужно ввести в поле ввода кода подтверждения.

Вводим цифры кода подтверждения и нажимаем кнопку Отправить.

Ждем подтверждения от Facebook, это может занять 27 рабочих дней.

Мы получили подтверждение компании от Facebook в течении 1-го рабочего дня.

Письмо от Facebook с уведомлением, что компания успешно подтверждена.Письмо от Facebook с уведомлением, что компания успешно подтверждена.Сообщение в Facebook Business Manager, что компания успешно подтверждена.Сообщение в Facebook Business Manager, что компания успешно подтверждена.Зеленая иконка в Центре безопасности в Facebook Business Manager, что компания подтверждена.Зеленая иконка в Центре безопасности в Facebook Business Manager, что компания подтверждена.Зеленая галочка в Информации о компании в Facebook Business Manager, что компания подтверждена.Зеленая галочка в Информации о компании в Facebook Business Manager, что компания подтверждена.

4. Создание аккаунта в Gupshup и подключение своего телефонного номера к WhatsApp BusinessAPI

Чтобы создать аккаунт в Gupshup, достаточно просто войти в этот сервис через любой из ваших существующих аккаунтов в Google, Facebook или GitHub на странице https://www.gupshup.io/developer/whatsapp-api.

Залогиньтесь через любой из ваших существующих аккаунтов в Google, Facebook или GitHubЗалогиньтесь через любой из ваших существующих аккаунтов в Google, Facebook или GitHub

Сразу после входа, откроется Дашборд WhatsApp. Нажимаем там на кнопку Создайте ваше первое приложение.

Нажмите на кнопку Создайте ваше первое приложениеНажмите на кнопку Создайте ваше первое приложение

Далее нажимаем на кнопку API доступа.

Нажите на кнопку API доступаНажите на кнопку API доступа

Вводим любое свободное имя приложения, например TestApp555 и нажимаем кнопку Отправить.

Введите любое свободное имя приложенияВведите любое свободное имя приложенияНажмите на кнопку ОтправитьНажмите на кнопку Отправить

Откроется длинная страница, прокручиваем ее мышкой вниз и нажимаем внизу кнопку Следующее.

Нажмите на кнопку СледующееНажмите на кнопку Следующее

Далее ниже появится кнопка Перейти в дашборд нажимаем ее для перехода туда.

Нажмите на кнопку Перейти в дашбордНажмите на кнопку Перейти в дашборд

В дашборде https://www.gupshup.io/whatsapp/dashboard нажимаем на кнопку Стать онлайн в созданном приложении.

Нажмите на кнопку Стать онлайнНажмите на кнопку Стать онлайн

На следующем экране нажимаем на кнопку Я готов(а).

Нажмите на кнопку Я готов(а)Нажмите на кнопку Я готов(а)

На следующем экране выбираем свою страну из списка.

Выберите свою страну из спискаВыберите свою страну из списка

Затем прокручиваем фрейм вниз и нажимаем на кнопку Следующее.

Нажмите на кнопку СледующееНажмите на кнопку Следующее

На следующем экране заполняем форму данными о вашей компании согласно информации о вашей компании из Facebook Business Manager https://business.facebook.com/settings/info и нажимаем на кнопку Следующее.

Заполните форму и нажмите на кнопку СледующееЗаполните форму и нажмите на кнопку Следующее

На введеный в форму электронный адрес придет письмо от Gupshup с кнопкой для его подтверждения. Подтвердим этот email нажав кнопку Verify Now в тексте письма.

В письме нажмите на кнопку Verify NowВ письме нажмите на кнопку Verify Now

После успешного подтверждения откроется окно Email Verification Complete

Откроется окно Email Verification CompleteОткроется окно Email Verification Complete

и придет письмо, что email успешно верифицирован.

Письмо, что email успешно верифицированПисьмо, что email успешно верифицирован

Возвращаемся к окну с формой в Gupshup. Проверяем всю введенную информацию и нажимаем кнопку Подтвердить.

Проверьте всю введенную информацию и нажмите кнопку ПодтвердитьПроверьте всю введенную информацию и нажмите кнопку Подтвердить

На следующем экране вводим ID вашей верифицированной компании в Facebook Business Manager, который скопируем на странице https://business.facebook.com/settings/info, и нажимаем кнопку Сохранить.

Введите ID вашей верифицированной компании в Facebook Business ManagerВведите ID вашей верифицированной компании в Facebook Business ManagerНажмите на кнопку СохранитьНажмите на кнопку Сохранить

Если ваша компания еще не верифицирована, то появится ошибка: The Facebook Business Manager ID does not seem to be verified. Please try again with a verified ID.

Если ошибка: The Facebook Business Manager ID does not seem to be verified. Please try again with a verified ID.Если ошибка: The Facebook Business Manager ID does not seem to be verified. Please try again with a verified ID.

Если это так, то нужно будет сначала пройти верификацию вашей компании в Facebook Business Manager, и потом вернуться к данному шагу. Этот процесс подробно описан в 13 пунктах данной инструкции.

Если все в порядке и ваша компания подтверждена, то откроется следующий экран, где мы вводим свой номер телефона, который хотим использовать для WhatsApp Business API. Обязательно перед этим изучаем правила Facebook по выбору такого телефонного номера по ссылке http://developers.facebook.com/docs/whatsapp/guides/phone-number.

Выбираем код страны и вводим номер телефона, нажимаем кнопку Сохранить.

Выберите код страны, введите номер телефона и нажмите кнопку СохранитьВыберите код страны, введите номер телефона и нажмите кнопку Сохранить

Далее вводим отображаемое имя вашей компании в WhatsApp. Обязательно перед этим изучаем правила Facebook по выбору отображаемого имени по ссылке https://developers.facebook.com/docs/whatsapp/guides/display-name.

Вводим отображаемое имя и нажимаем кнопку Сохранить.

Введите отображаемое имя и нажмите на кнопку СохранитьВведите отображаемое имя и нажмите на кнопку Сохранить

Далее, нужно будет подтвердить на вашей странице в Facebook Business Manager привязку к Gupshup, для этого в новой вкладке браузера переходим по ссылке https://business.facebook.com/settings/requests или в Facebook Business Manager в меню слева выбираем пункт Запросы. Во вкладке Полученные будет полученный от Gupshup запрос, нажимаем на кнопку Одобрить.

Нажмите на кнопку ОдобритьНажмите на кнопку Одобрить

Возвращаемся к окну Gupshup и нажимаем кнопку Одобрил.

Нажмите на кнопку ОдобрилНажмите на кнопку Одобрил

Откроется окно с информацией о том, что Ваш запрос отправлен и ожидается его одобрение со стороны WhatsApp. Сообщается, что это займет от 2 до 7 рабочих дней. Часто все происходит быстрее, и возможно Вы получите ответ на ваш email уже в течении суток. Нажимаем на кнопку Перейти в Дашборд.

Нажмите на кнопку "Перейти в Дашборд"Нажмите на кнопку "Перейти в Дашборд"

Откроется основная страница Дашборда и в списке приложений в синей кнопке мы увидим текущий статус Ожидание подтверждения.

Текущий статус Ожидание подтвержденияТекущий статус Ожидание подтверждения

После подтверждения, получим на email соответствующее письмо от Gupshup и статус в синей кнопке изменится на Завершить верификацию.

Далее нужно будет подтвердить ваш номер телефона с помощью SMS или голосового вызова. Для этого нажимаем на кнопку Завершить верификацию.

Нажмите на кнопку Завершить верификациюНажмите на кнопку Завершить верификацию

В открывшемся окне нажимаем на кнопку Запросить код по СМС, если номер телефона мобильный, или Запросить код через голосовой вызов, если номер телефона не мобильный.

Нажмите на кнопку Запросить код по СМС, если номер телефона мобильный, или Запросить код через голосовой вызов, если номер телефона не мобильный.Нажмите на кнопку Запросить код по СМС, если номер телефона мобильный, или Запросить код через голосовой вызов, если номер телефона не мобильный.

Ждем автоматического обновления экрана и отправки кода подтверждения на ваш номер.

Ожидание отправки кода подтвержденияОжидание отправки кода подтвержденияОжидание отправки кода подтвержденияОжидание отправки кода подтверждения

После отправки кода на ваш номер, автоматически откроется следующий экран, где мы вводим полученный код и нажимаем кнопку Отправить.

Введите код подтверждения и нажмите на кнопку ОтправитьВведите код подтверждения и нажмите на кнопку Отправить

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

Нажмите на кнопку "Перейти в Дашборд"Нажмите на кнопку "Перейти в Дашборд"

Откроется основная страница Дашборда и в списке приложений мы увидим текущий зеленый статус LIVE. Теперь можно использовать ваш номер телефона в WhatsApp Business API.

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

Перейдите по ссылке Настройки профиляПерейдите по ссылке Настройки профиля

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

Введите данные профиля и нажмите на кнопку Сохранить измененияВведите данные профиля и нажмите на кнопку Сохранить изменения

После ввода данных профиля, нажимаем на кнопку Сохранить изменения.

5. Подключение WhatsApp Business API Gupshup к Битрикс24

Для того, чтобы начать получать и отправлять сообщения через ваш подключенный номер телефона к WhatsApp Business API Gupshup, подключим ваш аккаунт Gupshup к вашему порталу Битрикс24.

В Битрикс24 устанавливаем приложение WhatsApp Business API Gupshup из маркетплейса, для этого переходим по ссылке https://www.bitrix24.ru/apps/?app=aiappspro.whatsapp_business_api_gupshup_subscription и нажимаем на зеленую кнопку УСТАНОВИТЬ.

Нажмите на кнопку УСТАНОВИТЬНажмите на кнопку УСТАНОВИТЬ

Если Вы еще не залогинились в маркетплейсе Битрикс24, то откроется всплывающее окно с кнопкой ВХОД. Нажмите ее для входа под вашей учетной записью Битрикс24.

Нажмите на кнопку ВХОД или перейдите по ссылке СОЗДАЙТЕ ПРЯМО СЕЙЧАСНажмите на кнопку ВХОД или перейдите по ссылке СОЗДАЙТЕ ПРЯМО СЕЙЧАС

Если у Вас еще нет Битрикс24, то перейдите по ссылке СОЗДАЙТЕ ПРЯМО СЕЙЧАС в этом же всплывающем окне и зарегистрируйте себе Битрикс24 на свой адрес электронной почты или используя один из своих аккаунтов предложенных социальных сетей.

Регистрация Битрикс24Регистрация Битрикс24

После успешного входа в маркетплейс Битрикс24, в том же самом всплывающем окне, которое появилось после нажатия зеленой кнопки УСТАНОВИТЬ, выбираем из списка ваш портал Битрикс24.

В новой вкладке вашего браузера откроется ваш Битрикс24 с предложением установить приложение WhatsApp Business API Gupshup. Нажимаем синюю кнопку УСТАНОВИТЬ.

Нажмите на кнопку УСТАНОВИТЬНажмите на кнопку УСТАНОВИТЬ

Ознакамливаемся с лицензионным соглашением и политикой конфиденциальности по ссылкам и ставим галочки в случае согласия с условиями. Нажимаем зеленую кнопку УСТАНОВИТЬ.

Установите галочки и нажмите на кнопку УСТАНОВИТЬУстановите галочки и нажмите на кнопку УСТАНОВИТЬ

После успешной установки, в вашем Битрикс24 автоматически будет создан чат поддержки 24/7 приложения, в который Вы сможете писать в любое время, если будут возникать любые вопросы по работе с приложением.

После успешной установки, в вашем Битрикс24 автоматически будет создан чат поддержкиПосле успешной установки, в вашем Битрикс24 автоматически будет создан чат поддержкиЧат 24/7 поддержки приложенияЧат 24/7 поддержки приложения

Итак приложение установлено, переходим к активации коннектора для WhatsApp Business API в Контакт-центре Битрикс24.

Закрываем слайд установки приложение, переходим в Контакт-центр Битрикс24 и там кликаем по установленному коннектору WhatsApp Business API Gupshup.

Кликните по установленному коннектору WhatsApp Business API GupshupКликните по установленному коннектору WhatsApp Business API Gupshup

В открывшемся слайдере настроек коннектора, кликните по кнопке ПОДКЛЮЧИТЬ.

Нажмите на кнопку ПОДКЛЮЧИТЬНажмите на кнопку ПОДКЛЮЧИТЬ

Если в вашем Битрикс24 создано несколько Открытых линий, то ниже необходимо будет выбрать нужную Открытую линию, к которой Вы хотите подключить WhatsApp, и уже после выбора нажать кнопку ПОДКЛЮЧИТЬ.

Выберите нужную Открытую линию из спискаВыберите нужную Открытую линию из списка

В этом же самом слайдере откроется интерфейс настроек коннектора.

Интерфейс настроек коннектораИнтерфейс настроек коннектора

В новой вкладке браузера перейдите в ваш Дашборд Gupshup по ссылке https://www.gupshup.io/whatsapp/dashboard, кликните по иконке вашего профиля и во всплывающем окне скопируйте API Key.

Скопируйте API KeyСкопируйте API Key

Возвращаемся к окну настроек коннектора в Битрикс24 и в поле Gupshup API key вводим API Key, скопированный в вашем аккаунте Gupshup.

Введите Gupshup API keyВведите Gupshup API key

В новой вкладке браузера возвращаемся в ваш Дашборд Gupshup по ссылке https://www.gupshup.io/whatsapp/dashboard и копируем номер телефона для поля Gupshup sender, для чего переходим по ссылке Настройки в списке приложений в вашем аккаунте Gupshup.

Перейдите по ссылке НастройкиПерейдите по ссылке Настройки

Откроется интерфейс настроек приложения в Gupshup, прокручиваем страницу вниз до раздела Проверить API доступа и установить URL обратного вызова и копируем телефонный номер из поля Отправитель. Если ваш собственный номер телефона еще ожидает подтверждения, то в этом поле будет указан тестовый телефонный номер от Gupshup, который пока можно использовать для тестирования приложения.

Скопируйте телефонный номер из поля ОтправительСкопируйте телефонный номер из поля Отправитель

Не закрываем пока это окно настроек приложения в Gupshup, оно нам еще пригодится ниже. Возвращаемся к окну настроек коннектора в Битрикс24 и в поле Gupshup sender вводим скопированный номер телефона отправителя.

Введите скопированный номер телефона в поле "Gupshup sender"Введите скопированный номер телефона в поле "Gupshup sender"

Нажимаем кнопку Подключить. После успешного подключения появятся сообщения Коннектор успешно подключен и Скопируйте callback URL и введите его в настройках Gupshup. Копируем Gupshup callback URL нажатием кнопки Копировать.

Нажмите на кнопку КопироватьНажмите на кнопку Копировать

Возвращаемся в наше открытое окно настроек приложения в Gupshup, кликаем по вкладке URL обратного вызова / Свяжите со своим ботом, переключаем ползунок в положение ON.

Переключите ползунок в положение ONПереключите ползунок в положение ON

Устанавливаем ниже все галочки в разделе Выберите, какие события состояния сообщений вы хотите получать по URL-адресу обратного вызова. ведите для применения настроек.

Введите скопированный в настройках коннектора в Битрикс24 Gupshup callback URL и нажмите кнопку SetВведите скопированный в настройках коннектора в Битрикс24 Gupshup callback URL и нажмите кнопку Set

Коннектор WhatsApp Business API Gupshup готов к работе!

Если Вы еще ожидаете подтверждения вашего телефонного номера и хотите пока протестировать коннектор через тестовый телефонный номер от Gupshup, то прокрутите вверх страницу настроек приложения в Gupshup до раздела Смарт-механизмы для регистрации и вовлечения пользователей и кликните по иконке Нажать на ссылку. В новой вкладке откроется кнопка для подтверждения согласия на прием тестовых сообщений. Установите галочку I agree и нажмите кнопку Send Message. Откроется приложение WhatsApp для отправки предустановленного сообщения PROXY с вашего личного номера WhatsApp. Отправьте данное сообщение без изменения на тестовый номер Gupshup. Поступит ответ Welcome! Youre now chatting with. Теперь Вы можете отправлять тестовые сообщения, которые будут поступать в Открытую линию Битрикс24.

Далее приведем примеры отправки и приема сообщений через рабочий номер телефона.

Отправьте сообщение, например с Вашего личного номера WhatsApp на ваш номер телефона WhatsApp Business API, одобренный через сервис Gupshup.

Отправьте сообщение в WhatsAppОтправьте сообщение в WhatsApp

Примите сообщение в Открытой линии вашего Битрикс24 и напишите ответ.

Примите сообщение в Открытой линии Битрикс24Примите сообщение в Открытой линии Битрикс24

Поддерживаются любые типы сообщений: текстовые сообщения, изображения, видео, голосовые сообщения, файлы, координаты местоположения. Обработка сообщений производится в соответствии с настройками открытой линии.

6. Создание шаблонов исходящих сообщений

Для возможности написать пользователю по истечению 24 часов с момента последнего сообщения от него, необходимо подготовить специальные шаблоны и получить их одобрение со стороны WhatsApp. Сообщение не должно нести рекламный характер - WhatsApp одобряет только сервисные и транзакционные шаблоны. Шаблоны должны соответствовать правилам:Политика WhatsApp Business,Торговая политика WhatsApp.

Шаблоны нужно создавать в вашем аккаунте Gupshup. Для этого перейдите в Дашборд Gupshup по ссылке https://www.gupshup.io/whatsapp/dashboard, перейдите по ссылке Настройки в списке приложений Gupshup.

Перейдите по ссылке НастройкиПерейдите по ссылке Настройки

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

Перейдите по ссылке Посмотреть шаблоныПерейдите по ссылке Посмотреть шаблоны

В новой вкладке браузера откроется страница Список шаблонов. В открывшемся списке будут только шаблоны для отправки через тестовый номер Gupshup с пометкой Разрешено к использованию на тестовом сервере. Для вашего номера их не получится использовать, нужно будет создать свои шаблоны.

Для добавления своего шаблона нажмите на кнопку Добавить еще.

Нажмите на кнопку Добавить ещеНажмите на кнопку Добавить еще

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

Заполните все необходимые поля и нажмите кнопку Предварительный просмотр и отправкаЗаполните все необходимые поля и нажмите кнопку Предварительный просмотр и отправка

Проверьте все данные и нажмите кнопку Отправить.

Проверьте все данные и нажмите кнопку ОтправитьПроверьте все данные и нажмите кнопку Отправить

После отправки, ожидаем 12 рабочих дня одобрения шаблона со стороны WhatsApp. Писем при этом никаких не приходит, проверять изменение статусов отправленных шаблонов нужно самим в своем аккаунте Gupshup. В фильтре выберите "Утверждено" и откроется список всех ваших одобренных шаблонов.

В фильтре выберите "Утверждено" и откроется список всех ваших одобренных шаблоновВ фильтре выберите "Утверждено" и откроется список всех ваших одобренных шаблонов

Ниже на скриншоте приводим пример отправки шаблонного сообщения из Битрикс24.

Пример отправки шаблонного сообщения из Битрикс24Пример отправки шаблонного сообщения из Битрикс24

7. Отправка автоматических сообщений в WhatsApp из Битрикс24

Во время установки в Битрикс24, приложение WhatsApp Business API Gupshup автоматически создает нового SMS-провайдера [WhatsApp Business API Gupshup], только при этом отправляются не SMS, а сообщения в WhatsApp.

Отправка осуществляется как вручную, так и автоматически из любого места CRM: из роботов, бизнес-процессов, SMS и Мессенджер рассылок из раздела CRM-маркетинг, таймлайна Лидов, Сделок, Контактов и Компаний.

Приводим примеры отправки таких сообщений ниже на скриншотах.

Отправка сообщения из таймлайна сделкиОтправка сообщения из таймлайна сделкиОтправка сообщения из бизнес-процессаОтправка сообщения из бизнес-процессаОтправка сообщения из роботов CRMОтправка сообщения из роботов CRMСписок отправленных сообщений в истории сделкиСписок отправленных сообщений в истории сделкиОтправка сообщения из SMS рассылкиОтправка сообщения из SMS рассылкиОтправка сообщения из Мессенджер рассылкиОтправка сообщения из Мессенджер рассылки

Итог

Мы с нуля, полностью настроили популярный и востребованный для бизнеса канал WhatsApp через официальный WhatsApp Business API.

По сравнению с неофициальными (серыми) API, основными преимуществами официального подключения являются:

  • высокая стабильность и безопасность;

  • независимость от физического оборудования (нет необходимости держать постоянно включенным мобильный телефон с подключением к интернету);

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

  • широкие возможности по интеграции с внешними системами для автоматизации обработки сообщений.

Также, подключение WhatsApp Business API через официального партнера Facebookсервис Gupshup позволяет в несколько раз снизить затраты на данный канал по сравнению с другими поставщиками официального WhatsApp Business API. И даже часто получается выгоднее по сравнению с затратами на серые схемы подключения. К примеру многие подобные сервисы предлагают только пакеты сообщений или диалогов с ежемесячной оплатой. И еще огромный плюс, подключать через Gupshup можно неограниченное количество своих телефонных номеров для WhatsApp Business API, и это не влияет на стоимость.

Для примера рассчитаем расходы на подобный сервис с оплатой 1000 руб. в месяц в которые входят до 100 диалогов в месяц. Предположим, в среднем диалоги состоят из 10 сообщений (на практике бывает даже меньше, так как переписка с клиентом это чаще всего сжатый диалог из нескольких сообщений, а не переписка с другом). Получается в этом случае мы заплатим по факту 1000 руб. за 1000 сессионных сообщений (в рамках 24-часового окна), то есть в итоге 1 руб. за одно сообщение.

Теперь посчитаем сколько мы заплатим за 1000 сообщений в Gupshup. Одно сессионное сообщение стоит $0.001, это примерно 78 копеек. И нет никакой обязательной ежемесячной оплаты, и нет никаких ограничений по времени, по количеству диалогов и клиентов, по количеству каналов. Получается мы заплатим всего $1, то есть всего 7080 руб. И при этом нас никто не ограничивает по времени, в этом месяце возможно 1000 сообщений, в другом меньше, в третьем больше. За год вырисовывается просто невероятная экономия затрат для бизнеса. За те же 1000 руб. мы сможем принять и отправить через Gupshup более 12000 сессионных сообщений без каких-либо ограничений по времени, по количеству диалогов и клиентов и без ограничения по количеству каналов. Многие бизнесы и не генерируют столько за месяц.

Чтобы иметь возможность написать по истечению 24 часов с момента последнего сообщения от клиента, необходимы специальные шаблоны, стоимость их отправки во всех сервисах почти одинаковая, так как эту стоимость взимает сам WhatsApp. Для России на текущий момент она составляет $0.0477 (~34 руб.) за одно шаблонное сообщение. При отправке такого шаблонного сообщения через Gupshup его стоимость составит $0.001 + $0.0477 (78 копеек за сессионное сообщение + 34 руб. за шаблонное сообщение). После ответа клиента на шаблонное сообщение, все остальные сообщения в течении 24 часов с момента отправки клиентом последнего сообщения будут тарифицироваться только по $0.001 (78 копеек).

Подробнее..

Сможет ли RCS заменить SMS?

23.04.2021 12:19:27 | Автор: admin

Когда вы в последний раз переписывались по SMS? Если не считать смс-рассылок и уведомлений от вашего сотового оператора, то вы, скорей всего, давно не пользовались службой коротких сообщений. SMS-сервис безнадежно устарел и пользуется до сих пор по одной причине сотовым операторам невыгодно его отключать. SMS приносит немалый доход для операторов, в первую очередь от корпоративных клиентов. И несмотря на неудобство пользования этим сервисом (отсутствие чатов, голосовых сообщений, отправки файлов; ограниченность набора символов) и чертовски высокую цену по сравнению с мессенджерами, SMS все еще в обиходе. Эту ситуацию пытались исправить американские сотовые операторы, внедряя новый универсальный сервис текстовых сообщений Cross-Carrier Messaging Initiative (CCMI). Но не смогли (или не захотели).

SMS vs Мессенджеры


Изначально SMS был универсальным форматом общения на мобильных телефонах, но уже устарел пользователи постепенно перешли на мессенджеры: WhatsApp, Telegram, Facebook Messenger или iMessage на iPhone. Они не только позволяют отправлять собеседнику практически любые виды информации, но и в большинстве случаев стоят дешевле, так как обрабатываются онлайн.

Но универсального мессенджера нет: аудитория распределилась по нескольким сервисам, а для полноценного общения порой приходится устанавливать популярные приложения. И если на iOS есть встроенный iMessage, то после нескольких неудачных попыток выпустить свой мессенджер для Android-смартфонов Google планирует глобально изменить рынок текстовых сообщений.


Крупнейшие операторы сотовой связи США, в лице AT&T, Verizon, T-Mobile и Sprint, объявили в 2019 году, что они совместно запустят службу для обмена сообщениями Rich Communications Services (RCS) к 2020 году. Но в мае 2020 года представители Verizon заявили: Хотя мы не вправе выступать от имени CCMI, и дата запуска сервиса официально не объявлена, владельцы Cross Carrier Messaging Initiative решили прекратить совместное предприятие. Тем не менее, мы по-прежнему привержены делу улучшения качества обмена сообщениями для клиентов, включая повышение доступности RCS.

В таком положении дел нет ничего неожиданного.

RCS впервые появился в 2008 году, когда GSMA продавала его под брендом Joyn. Была надежда, что операторы Vodafone и Verizon будут использовать RCS для создания всевозможных совместимых мультимедийных функций, подобных WhatsApp от Facebook. И хотя технология получила некоторое распространение в развитых странах, например в Японии, в США она остается непопулярной.

В 2014 году компания Jibe разработала платформу, которая объединяла RCS-сети провайдеров. В 2015 году её приобрела Google и начала продвигать среди мобильных операторов. При поддержке Google ассоциация GSMA в ноябре 2016 года выпустила универсальный протокол, который стал первым шагом для объединения операторов, производителей устройств и разработчиков ПО.

Это согласованный в телеком-отрасли стандарт, который позволяет общаться абонентам различных операторов и стран. Он получил поддержку более 55 компаний и операторов связи, среди которых AT&T, Verizon, Samsung, LG, Microsoft, Google, Huawei. Российские операторы Билайн, МТС, Tele2, МегаФон также поддержали инициативу универсального протокола RCS.


Мы стремимся обеспечить совместимость RCS с другими провайдерами, заявили в T-Mobile. Клиенты T-Mobile с устройствами Android в настоящее время могут пользоваться сообщениями RCS в нашей сети, а также со многими другими клиентами по всему миру, взаимодействуя через Google.

T-Mobile единственный американский оператор, который добился каких-то положительных результатов от RCS с момента создания CCMI. Оператор впервые запустил RCS в 2015 году, а в 2020 году он объявил о сделке с Google по поставке RCS для своих предоплаченных клиентов. Затем, в марте 2021 года, T-Mobile заявил, что достиг соглашения с Google, чтобы сделать Google Messages (Сообщения) приложением для обмена сообщениями по умолчанию на всех своих устройствах Android. T-Mobile US является третьим по размеру американским оператором сотовой связи, а его клиентами считаются более 80 млн человек.

Google продолжает продвигать RCS в США и других странах, в надежде заработать на рекламе (кто бы сомневался) посредством этого сервиса. Это неудивительно, учитывая эффективность таких услуг в таких странах, как Япония. Согласно Synchronoss, японские потребители открывают около 85% сообщений RCS и кликают около 60% это значительно лучше, чем 0,001% пользователей, которые кликают на мобильные рекламные баннеры.

До отказа от Allo и перехода к стандартному приложению Сообщения у Google было сразу четыре приложения Hangouts, Allo, Duo и Сообщения, с беспорядком в которых нужно было ещё разобраться.

Если Hangouts переориентировали на корпоративный рынок для конкуренции со Slack, то Allo разрабатывали с нуля как новое приложение для общения с уникальными возможностями (интеграция Google Assistant).


Оно не смогло заинтересовать владельцев Android Allo установили в сотни раз меньше чем WhatsApp и Facebook Messenger. По словам представителей Google, пользователи устали от разнообразия мессенджеров, боялись отсутствия поддержки в долгосрочной перспективе и уходили к основным представителям амбассадорам мессенджеров на рынке.
iMessage, который Google в том числе рассматривала в качестве примера, был встроен в iPhone, WhatsApp позволял избежать платы за SMS и стал первым, кто воспользовался push-уведомлениями, а у Facebook Messenger огромная база пользователей соцсети.

У Allo не было стратегии по привлечению новых пользователей. Единственное, что реализовала Google, предложение скачать Allo через push-уведомление, если отправитель отправил сообщение через мессенджер.
Эксперимент с Allo не сработал, и в Google решили начать заново с чистого листа использовать SMS-приложение Сообщения, которое есть практически у всех пользователей Android, и обновить его до современного уровня. По его оценке, ежегодно отправляются 8 трлн SMS-сообщений это значительная аудитория людей, которая может перейти на более качественное общение через RCS.
В апреле 2018 года Google отменила разработку мессенджера Allo, чтобы сфокусироваться на Chat (по мнению Google, более удобное для пользователей название RCS) встроенном протоколе RCS в стандартном приложении Сообщения на Android.

Несмотря на то, что на телефонах Samsung установлено собственное приложение для SMS (которое также поддерживает RCS), к апрелю 2018 года каждый месяц прибавлялось до 100 млн новых пользователей Android, которые так или иначе пользуются SMS универсальным способом отправки сообщений любому владельцу смартфона.

План Google намного сложнее, чем запуск очередного мессенджера компании пришлось собрать более 40 операторов и около 10 производителей, чтобы разработать новый стандарт. Он должен был гарантировать, что чат будет везде работать одинаково и с одинаково большим набором функций. И большинство компаний в альянсе конкуренты между собой, которые не доверяют как друг другу, так и Google.

Но Google смогла объединить их (как показывает история, пока что безрезультатно): для SMS так или иначе найдётся замена, и либо операторы примут участие в замене технологии, либо будут продолжать наблюдать, как люди уходят в Apple, Facebook и к другим разработчикам мессенджеров.

RCS действительно важен для Google, однако RCS в США и других странах страдает от проблемы курицы и яйца, когда операторы не поддерживают услугу, потому что клиенты ее не используют, и наоборот.


Первая версия RCS была представлена в 2012 году, на её основе мобильные операторы США разработали проприетарную версию протокола, которая работала только между абонентами одной сети. Из-за этого RCS долгое время не могла стать популярной пользователи даже не знали, что вместо SMS появился новый формат, и не использовали его.

Конечно, есть еще одно серьёзное препятствие, с которым сталкивается RCS: Apple не поддерживает его, а Apple контролирует половину рынка смартфонов в США.

Тем не менее, услуга может получить поддержку 5G, которая требует от операторов установки технологии IMS (IP Multimedia Subsystem), которая упрощает взаимодействие с RCS.

После года ожидания Google в конце июня 2019 года начала самостоятельно предоставлять услугу RCS-сообщений в приложении, не дожидаясь действий CCMI. Google обошла колебания операторов и развернула приложение Google Messages, подключённое к его сети Jibe (хотя будет использована сеть оператора, если он совместим с универсальным профилем). Это шаг, который означает, что клиентам не нужно ждать, пока их операторы связи начнут работу, которую они должны были сделать пять лет назад. T-Mobile фактически передала бразды правления своим решением, приняв Messages в качестве SMS-приложения по умолчанию для всех телефонов T-Mobile, подключив всех своих клиентов к сети RCS от Google.

Универсальный мессенджер


RCS мертворождённая технология, но ее пытаются реанимировать. Попытка внедрить свое Messages на базе RCS, Google хочет конкурировать с Apple и его iMessages. Google высокотехнологичная и многогранная компания обладающая целым рядом интегрированных сервисов, для налаживания коммуникации, в то же время единой, многофункциональной платформы, как iMessage у них до сих пор нет.


Возьмем к примеру iMessage от Apple:

  • Работает на всех устройствах от iPhone до MacBook;
  • В случае, если у получателя нет iMessage, пользователь все равно увидит сообщение, но в форме СМС;
  • SMS от iMessage отличаются по цвету.
  • Интеграция с другими сервисами: с 2016-го в iMessage появились мини-приложения, с помощью них можно отправлять деньги, играть внеболбшие игры и т.д.;
  • Есть остальные функции, стандартные для современного мессенджера: видеозвонки, стикеры, аудиосообщения и др.
  • И конечно они предустановлены.

Попытки Google ворваться в игру:

  • 2005 Google Talk. До появления смартфонов был популярный чат для компьютеров. В Android также появилось приложение Google Talk, которое продержалось до 2011 года.
  • 2011 Google Plus. Компания сделала свою социальную сеть, которая также предустанавливалась на Android смартфоны. В ней для чата были доступны два приложения: Huddles для переписки и Hangouts для видеозвонков.
  • 2013 Google Hangouts. Компания отделяет Hangouts от Google Plus, и сосредотачивает переписку и звонки в одном приложении, добавив SMS на манер iMessage.
  • 2016 Google Allo/Duo. Hangouts из-за своей непопулярности (WhatsApp, iMessage и Facebook Messenger успели отхватить большую аудиторию) переделывают в корпоративный мессенджер а-ля Slack, а его место занимает Allo приложение для чата с искусственным интеллектом. Звонки переходят в Google Duo.
  • Настоящее время Allo также провалился, хотя Duo используют довольно часто, отмечая его простоту.

И это только самые известные. Были и менее популярные:

  • Meebo мессенджер, которые существовал с 2005 по 2012 годы, пока Google не выкупила его, чтобы слить команду с разработчиками Google+;
  • Google Buzz платформа для микроблоггинга и обмена сообщениями, который был интегрировал в Gmail. Проработал с февраля 2010 по декабрь 2011 года;
  • Google Spaces сервис для групповых чатов, в который были интегрироваы такие сервисы как Google Search и YouTube. Работал с мая 2016 по апрель 2017 года;
  • Google wave;
  • YouTube Messages небольшой мессенджер был встроен в приложение YouTube, где пользователи могли отправлять ссылки на ролики внутри хостинга и отправлять сообщения. Работал с 2017 по 2019 годы.

Чем RCS лучше SMS?


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

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



Зачем нужен RCS когда есть WhatsApp, Telegram и другие? И нужен ли?


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

В теории, при соблюдении ряда условий, протокол RCS может стать унифицированной платформой, которой уже четверть века успешно служит SMS. Функциональные, красочные, условно конфиденциальные но при этом разъединённые мессенджеры привносят некий дискомфорт и хаос в нашу жизнь. Конечно, продукт который увязал бы в единую, современную систему миллиарды пользователей мог бы легко прижиться. На практике же, позиция одного из ведущих игроков рынка корпорация Apple, который не заинтересован в усилении своего конкурента, скорее всего, будет неизменна. Apple и в дальнейшем не откажется от существующих SMS.

Однако пока не решён ряд проблем: слабая распространенность формата RCS и его вариативность, поскольку многие компании не пытаются придерживаться принятого международного стандарта (универсального профиля). Появление CCMI как раз решило бы эту проблему и сделала бы соблюдение универсального профиля выгодным. Но есть и другие минусы: RCS-формат не имеет сквозного шифрования, поэтому спецслужбы могут свободно требовать содержимое переписок.

Android работает на 75% смартфонов по всему миру, и на запланированный Google переход от SMS к RCS могут обратить внимание регуляторы. RCS-чаты в Сообщениях, которые обрабатываются компанией, а не операторами, станут ещё одним сервисом и приложением Google, попадающими под антимонопольное законодательство Европы.

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

Технически нет ничего, что могло бы ей помешать, но для этого компании снова придётся сотрудничать с GSMA и, возможно, конфликтовать с правительствами. Ведь многие спецслужбы будут недовольны, если стандартный способ обмена сообщениями на 75% телефонов в мире уйдёт в тень, как называет сквозное шифрование ФБР.

Если бы новость о массовом внедрении RCS, на смену устаревшей SMS, была бы озвучена во второй половине 2000-х, это могло бы стать действительно ярким событием, однако с тех пор прошло слишком много времени. Даже если RCS удастся заменить SMS, то вот заменить другие мессенджеры, вроде того же Telegram, вряд ли удастся. Однако единый протокол обмена будет полезен и остальному миру, так как убьет необходимость устанавливать несколько разных чатов для всех своих друзей и знакомых.



На правах рекламы


Быстрые серверы для любых целей это про наши эпичные серверы. Максимальная конфигурация 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe.

Подробнее..

Как я потратил 322 тысячи рублей на продвижение своего Telegram-канала о технологиях и бизнесе

30.04.2021 18:12:21 | Автор: admin

Осенью 2019 года я поспорил со своим другом, что смогу собрать больше подписчиков в Telegram, чем он. Чтобы не отставать, я потратил 322 786 рублей на контент и продвижение моего канала Репродуктор Белоусова, где я пишу о бизнесе и технологиях.

Пари закончилось предсказуемо. Давайте я расскажу, как провел эти пару месяцев и какие выводы сделал для себя. Анализ моих ошибок будет полезен, если вы задумываетесь запустить свой Telegram-канал.

Несколько слов о себе. Меня зовут Николай Белоусов. В 2013 году я основал Madrobots, один из первых магазинов гаджетов в России. В моем портфолио успешно запущенные бренды Биван и Zavtra. Моя команда привела на российский рынок стартапы Picooc и Chipolo, компанию XD Design.

До запуска канала я много писал в Фейсбуке, на Хабре, на vc. Так что у меня не было сомнений, что и Telegram мне покорится. Тем более, что мне понятен текстовый формат контента. В нем я разбираюсь лучше, чем в видео или фото.

With the little help from my friends

  • Потрачено: 62 000 рублей на создание контента и оплату работы редактора

  • Подписчиков: около 1 тысячи

Одной самоуверенности мало, поэтому я подошел к продвижению методично, как маркетолог. Для начала составил контент-план и подумал, откуда брать стартовую аудиторию. Рассуждал я так: подписчики придут ко мне от друзей и окружения. С этим мне повезло, многие мои знакомые ведут Telegram-каналы:

Первым делом я и написал всем людям из списка и договорился о том, чтобы они прорекламировали мой канал. Все согласились, за что им спасибо. Александр Горный попросил в обмен на упоминание в Стартапах дня написать статью. Так появился текст, которым я по сей день горжусь: Где брать деньги на бизнес. Недавно я обновил его с учетом реалий 2021 года.

Прирост аудитории, как и ожидалось, был устойчивым, но небольшим. Вот результаты после размещений рекламы в разных каналах по данным сервиса telemetr.me:

Киба у аппарата: +97
Торшина и На нашей фабричке: +474
Радиорубка Лихачёва: +46
The Edinorog: +251
Стартап дня: +224

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

Хождение по ботам

Потрачено: 260 тысяч рублей

Подписчиков: около 4 тысяч

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

Мастриды: +11
Groks: +162

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

Размещения у ботоводов. Пример 1: +79
Размещения у ботоводов. Пример 2: +260

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

Отзыв об авторе проекта PR_Hawks, предлагающего подписчиков массово

Следующим логичным шагом было продвижение через лидеров мнений. Я сразу пошел ва-банк и потратил 100 000 рублей на упоминание в канале Артемия Лебедева, теша себя надеждой, что сейчас придут подписчики. Результаты красноречивы:

Эффективность размещения в суперссылке Лебедева 1: +61
Эффективность размещения в суперссылке Лебедева 2: +131

Первый блин комом. Неудача с Лебедевым меня не подкосила. Я решил разместиться у Лены Миро, с которой давно и плодотворно сотрудничаю. Обошлось мне это по дружбе в 40 000 рублей.

Эффективность размещения у Лены Миро: +442

От Миро пришло почти 400 человек, что было уже достойным результатом на фоне остальных размещений.

Это интернет, детка

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

Этот скриншот я приберег напоследок.

Эффективность размещения в канале Продакты не нужны: +718

После одного упоминания в канале @Продакты не нужны на меня подписалось почти 700 человек. Но это не спасло меня, в конце декабря 2019 года я понял, что спор проигран и я ничего не могу поделать. Быстро достучаться до массовой аудитории не получается, как бы я не пытался продвигать себя.

Как именно я потратил 322 786 рублей? Львиную долю я потратил именно на продвижение, эффект от которого был гомеопатическим. Прикладываю разбивку расходов:

Расходы на Telegram-канал@ni404headРасходы на Telegram-канал@ni404head

Разочаровавшись, я почти на год забросил канал. Максимума число подписчиков достигло 06 января 2020 года, а дальше аудитория пошла на спад. Сейчас у меня около пяти тысяч подписчиков и я стал писать снова, пытаясь нарастить аудиторию органически, не пытаясь кого-то обогнать.

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

Динамика числа подписчиковДинамика числа подписчиков

Какие выводы можно сделать из моей истории?

  1. Платное продвижение канала в Telegram обходится дорого. Подписчик может стоить сотню рублей.

  2. В ТГ много ботоводов, которые под видом живой аудитории подсовывают ботов.

  3. Продвижение через лидеров мнений неоправданно дорого по сравнению с аудиторией, которую они приводят.

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

Возможно, у вас есть опыт относительно дешевого продвижения канала? Буду признателен за советы и здравую критику.

Если вам понравилась эта колонка, подпишитесь на мой канал @Репродуктор Белоусова.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru