php – Отправка смс с кодом при авторизации – Stack Overflow на русском

5 Примеры значений, которые возвращает параметр state_text (текстовое описание статусов)

Значение state_textТипКакой при этом будет stateКомментарий
Ожидает отправкуString, другая более детальная расшифровка промежуточного состояния SMSstate=0Сообщение отправляется, т.е. находится в очереди на отправку.
644 Сбой на стороне оператора {Название оператора/операторов}. Сообщения будут отправлены после устранения сбояString, другая более детальная расшифровка промежуточного состояния SMSstate=0Для Вас фактически сообщение еще отправляется (при этом значение state=0)
ОтправленоString, основное состояниеstate=0Сообщение отправлено оператору.
ДоставленоString, основное состояниеstate=1Сообщение доставлено абоненту.
Не доставленоString, основное состояниеstate=2Сообщение не доставлено абоненту.
Не доставлено в SMSCString, основное состояниеstate=16Сообщение не доставлено абоненту.
Не доставлено (просрочено)String, основное состояниеstate=34Сообщение не доставлено абоненту, срок “жизни” СМС истек.
645 ОтклоненоString, другая более детальная расшифровка конечного состояния SMSstate=2Сообщение не доставлено абоненту. Причину необходимо уточнить у службы поддержки сервиса.
643 Отправка в указанный Регион – запрещена, обратитесь в поддержку.String, другая более детальная расшифровка конечного состояния SMSstate=2Сообщение не доставлено абоненту. Запрещена отправка в указанный регион. По умолчанию для отправки SMS доступны все регионы Российской Федерации. Эта ошибка будет только в том случае, если
Вы просили доставку SMS только в конкретный регион, при этом отправку осуществляете в регионы, которые у Вас отключены.

1 автоматическое получение статусов на ваш сервер

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

Похожее:  Должностная инструкция ведущего специалиста по информационным технологиям

Как это работает?

3 Примеры ответа сервера (при успешном запросе)

Пример XML ответа, в случае успешного запроса



	/* XML */
	<response><msg><err_code>0</err_code><text>OK</text><type>message</type></msg><data><id>23138764</id><sender_name>BrandName</sender_name> /* Отправитель с которым передалась SMS */
			<text>Текст отправленный SMS</text><phone>79032920834</phone> /* номер Абонента */
			<type>1</type> /* Тип сообщения ("0" - flash SMS, "1" - cтандартная SMS) */
			<n_raw_sms>2</n_raw_sms> /* Количество сегментов SMS */
			<start_time>2022-09-15 18:28:54</start_time> /* Время отправки SMS */
			<last_update>2022-09-15 18:29:00</last_update> /* Время доставки SMS абоненту */
			<id_tarifs_group>3</id_tarifs_group> /* id тарифной группы, как правило совпадает с id Оператора связи, список id можно запросить в Поддержке */
			<state>1</state> /* 1 - 'Доставлено', 2 - 'Не доставлено', 16 - 'Не доставлено в SMSC', 34 - 'Не доставлено (просрочено)', 0 - 'Отправлено'  */
			<credits>2.190</credits> /* стоимости одного сегмента */
			<state_text>Доставлено</state_text> /* 'Доставлено', 'Не доставлено', 'Не доставлено в SMSC', 'Не доставлено (просрочено)', 'Отправлено' */
		</data></response>

Пример JSON ответа, в случае успешного запроса


	/* JSON */

	{
	 "response":{
		"msg":{
				"err_code":"0",
				"text":"OK",
				"type":"message"
		},
		"data":{
				"id":"23138764",
				"sender_name":"SSMS.SU",
				"text":"Текст отправленной SMS",
				"phone":"79032920834",
				"type":"1",
				"n_raw_sms":"2",
				"start_time":"2022-09-15 18:28:04",
				"last_update":"2022-09-15 18:29:00",
				"id_tarifs_group":"3", /* id тарифной группы, как правило совпадает с id Оператора связи, список id можно запросить в Поддержке */
				"state":"1", /* 1 - 'Доставлено', 2 - 'Не доставлено', 16 - 'Не доставлено в SMSC', 34 - 'Не доставлено (просрочено)', 0 - 'Отправлено'  */
				"credits":"2.190",
				"state_text":"Доставлено" /* 'Доставлено', 'Не доставлено', 'Не доставлено в SMSC', 'Не доставлено (просрочено)', 'Отправлено' */
				}
		}
	}

Важное замечание по параметрам state и state_text

Похожее:  Lizaonair. Как выбрать поделителя в конкурсах Инстаграм

параметр state – выдает всегда цифровой код (0,1,2,16,34) обозначающий основное состояние SMS сообщения, для основных состояний SMS (Отправлено, Доставлено, Не доставлено в SMSC, Не доставлено (просрочено) или Не доставлено).

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

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

Например,

Вы отправили SMS, и сразу же

моментально

запросили статус, при этом Вы получите

state = 0

(“Отправлено”, т.к. фактически для Вас эта СМС отправлена), но параметр

state_text

выдаст “Ожидает отправку” (более детальная расшифровка). Это означает что, сообщение еще находится в нашей очереди на отправку и будет отправлено в течение ~1 секунды.


При следующем запросе (например, через 1-5 секунд) Вы можете получить также

state = 0

(“Отправлено”), при этом

state_text

будет содержать текстовое описание “Отправлено” (что соответствует основному состоянию SMS)

Обратите внимание, что сообщения как правило доставляются за 1-2-3 секунды, при этом статусы поступают от оператора в течение 10-20, иногда 30 секунды после факта доставки SMS. Скорость доставки статусов различная и зависит от оператора, а также от канала отправки.

state_text

также может принимать и другие

текстовые значение (описания), при этом

stateвсегда

будет равна (0,1,2,16 или 32).

Приведем еще один пример.Вы отправили СМС сообщение, например, на Билайн. Запрашиваете статус, при этом получаете state = 0 (“Отправлено”), при этом state_text может быть равна “644 Сбой на стороне оператора Билайн.

Сообщения будут отправлены после устранения сбоя.”
В данном примере сообщение считается Отправленным, но фактически, если у оператора наблюдается сбой, оно не может быть доставлено сразу. В данном примере, сообщение сохраняется на нашей стороне до момента устранения сбоя, после чего будет Доставлено.
В данном примере, необходимо будет запросить статус повторно, т.к. state = 0 (“Отправлено”) не является конечным статусом.

Подведем итог.Старайтесь настроить интервалы запроса статусов с разумной периодичностью, в зависимости от того, какие статусы Вы хотите получить “Конечные” или “Не конечные” (промежуточные).
Если Вы хотите в основном получать конечные статусы (Доставлено), запрашивайте статус не сразу после отправки.

4 Коды статусов, которые возвращает параметр state (статусы SMS)

Код статусаТипОписаниеКомментарий
0IntegerОтправленоНе конечный, нужно сделать запрос повторно.

Важно! Этот статус будет конечным, если он не поменялся за 25 часов с момента отправик СМС.

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

Важно! Максимальное время “жизни” СМС коммерческих рассылок – 24 часа. Служба коротких текстовых сообщений не идеальна, может так случиться, что статус по СМС не поступит даже после истечения срока “жизни” СМС. Поэтому запрашивать статус спустя 25 часов просто нет смысла, он точно не измениться. Если спустя 25 часов state=0, это означает что сообщение Отправлено, оно возможно даже Доставлено или Не доставлено, но статус не вернулся от оператора. Поэтому спустя 25 часов этот статус считается конечным. И запрашивать его повторно не нужно, т.к. больше он точно не измениться.

1IntegerДоставленоКонечныйСообщение доставлено абоненту. Это конечный статус.
2IntegerНе доставленоКонечныйСообщение абоненту не доставлено. Это конечный статус.
16IntegerНе доставлено в SMSCКонечныйСообщение абоненту не доставлено. Это конечный статус. SMSC (Short Message Service Centre) – это оборудование, которое отвечает за работу службы коротких сообщений сети мобильной связи. Обычно такой статус может поступить в случае если Вы отправите два и более сообщения с одним и темже текстом на один и тотже номер в короткий промежуток времени. У операторов в данном примере может сработать система защиты от зависания и рассылки дублирующих СМС (защита от флуда).
34IntegerНе доставлено (просрочено)КонечныйСообщение абоненту не доставлено. Это конечный статус. Такой статус может поступить, в случае, если абонент был не в сети, при этом время доставки СМС (время “жизни” СМС) истекло.

6 Коды ошибок, которые возвращает параметр err_code (если ошибка запроса)

Параметр err_code возвращает ошибку, в случае, если запрос на получения статусов по SMS не прошел (например, если API на уккаунте отключено.)

7 Примеры ответа сервера (если ошибка запроса)

Пример XML ответа, в случае ошибки


	/* XML */
	<response><msg><err_code>5</err_code><text>Неизвестный метод</text><type>error</type></msg><data/></response>

Пример JSON ответа, в случае ошибки


	/* JSON */
	{
	  "response": {
		"msg":{
		   "err_code":"5",
		   "text":"Неизвестный метод",
		   "type":"error"
		},
		"data":null
	  }
	}

Html форма валидации телефона

Создадим HTML форму для валидации телефона пользователя: модальное окно, поля для ввода и проверки данных (примерный вид как на скрине выше). Для этого создадим файл index.php c содержимым:

Sms регистрация и авторизация

По порядку:

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

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

Да и если человек сразу не активирует, а потом через часа 2-3
попробует снова создать профиль, то регистрация будет выдавать ошибку
о существовании данного номера в базе.

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

Как сделать чтобы код жил определенное время, скажем 1-3 минуты?

Добавляем поле: время регистрации (когда была создана наша запись в БД), потом при подтверждении сравниваем текущее время и из бд, смотрим разницу.

Как защитить себя от злоумышленников, которые захотят “сжечь” весь
баланс путем отправки “холостых” смс?

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

Не знаю в какую сторону копать, делать сессии или писать в базу? если
в базу, то как привязать к чему-либо, если аккаунт ещё не создан?

Однозначно в БД

Авторизация по смс бесплатно через сервис в москве

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

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

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

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

Верификация телефона по sms

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

Форма для подтверждения телефона по SMS (которую мы сегодня сделаем собственноручно) выглядит примерно следующим образом:

Форма для подтверждения телефона по SMS
Форма для верификации телефона по одноразовому SMS

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

Первое что мы сделаем, определим структуру база данных. Без нее, при наших потребностях никак. Использовать будем MySQL.

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

Приступим к созданию БД и создание таблицЯ буду использовать несколько таблиц для:

Структура БД – дамп таблиц

# Дамп таблицы users
# ------------------------------------------------------------

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(10) NOT NULL,
  `login` varchar(50) NOT NULL,
  `password` varchar(32) NOT NULL,
  `comment` varchar(200) NOT NULL,
  `status` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# Дамп таблицы smsc_gateway
# ------------------------------------------------------------

CREATE TABLE `smsc_gateway` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `gw_phone` varchar(11) NOT NULL DEFAULT '',
  `uuid` varchar(10) NOT NULL,
  `host` varchar(15) NOT NULL DEFAULT '',
  `port` varchar(5) NOT NULL,
  `password` varchar(12) DEFAULT '',
  `maxcount` varchar(6) NOT NULL,
  `status` int(1) NOT NULL,
  `gateway_id` int(2) DEFAULT NULL,
  `state` varchar(11) DEFAULT NULL,
  `comment` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# Дамп таблицы gateway_smscount
# ------------------------------------------------------------

CREATE TABLE `gateway_smscount` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `gw_phone` varchar(11) NOT NULL DEFAULT '',
  `date` varchar(10) NOT NULL,
  `count` int(6) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# Дамп таблицы sms_queue
# ------------------------------------------------------------

CREATE TABLE `sms_queue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(11) NOT NULL DEFAULT '',
  `dateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `status` varchar(10) DEFAULT NULL,
  `data` varchar(500) NOT NULL DEFAULT '',
  `phone` varchar(11) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# Дамп таблицы sms_archive
# ------------------------------------------------------------

CREATE TABLE `sms_archive` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gateway_id` varchar(11) DEFAULT NULL,
  `dateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `data` varchar(500) DEFAULT NULL,
  `status` varchar(11) DEFAULT NULL,
  `phone` varchar(11) DEFAULT NULL,
  `uuid` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Стоит подробнее остановиться на таблице с данными шлюза и используемых полей – smsc_gateway. Здесь мы используем:

Классов будет всего 5:

Кульминация

Как Вы уже, наверное, догадались, в один прекрасный день, запросив SMS-пароль, я его не получил. Когда и повторная попытка не принесла ожидаемого результата, я решил проверить не блокирует ли доставку SMS какое-либо приложение на смартфоне. Воткнув SIM-карту в обычную «звонилку» я запросил новый код подтверждения, но чуда не произошло.

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

Следующим этапом стало обращение в службу поддержки сервиса. Меня уверили, что исправно отправляют все уведомления и даже прислали лог всех транзакций с момента крайнего полученного уведомления. Лог был заверен печатью сторонней организации (SMS-провайдера), у которой сервис приобретал услуги по рассылке уведомлений. Как можно видеть, у всех уведомлений, который я не получил, наблюдался статус «В пути»:

Отправка смс с кодом при авторизации

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

Следовательно, самостоятельно отправлять SMS с номера с названием вашего сервиса не получится, хотя вы можете отправлять с собственного телефона, но это будет еще дороже.

Указанные расходы – это накладные расходы и отправка SMS всегда была дорогим способом регистрации пользователя.

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

P.S Все сервисы терпят указанные расходы, как думаете, почему некоторые сервисы переходят на всякие push-уведомления, а смс оповещения стоят сколько-то рублей в месяц? 🙂

Получение статусов отправленных sms сообщений

Для быстрого перехода используйте содержание:

1. Автоматическое получение статусов на Ваш сервер.

Постановка задачи


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

На чем будем писать backendТут все просто, что умеем, на том и пишем, поэтому в моем случае – PHP

АвторизацияКонечно. Сервис будет смотреть в интернет, поэтому авторизация обязательна.

Прелюдия

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

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

Здесь нужно сказать, что у ростовских нотариусов существует какой-то картельный сговор. Они все как один утверждали, что не могут заверить подлинность моей подписи под набранным мною текстом на листе А4 (хотя в их прайсах присутствовала такая услуга, стоимостью в 100 рублей), а просто таки обязаны оформить этот текст на гербовой бумаге за 1000 рублей.

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

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

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

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

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

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

Принцип работы

Основная цель данного скрипта – проверить введенный пользователем одноразовый пароль, отправленный по SMS на его номер телефона. Если пользователь вводит правильный проверочный код, телефон считается верифицированным, и администратор сайта может продолжить выполнение скриптов. Схематически проверка номера телефона выглядит так:

  1. Пользователь указывает имя и номер телефона;
  2. После нажатия кнопки “Выслать код“, на указанный номер телефона SMS-шлюз высылает сгенерированный числовой пароль – код подтверждения (пароль генерируется исходя из суммы секретной фразы и номера телефона и состоит из 5 цифр);
  3. Скрипт ожидает ввода пользователем кода подтверждения. Скрипт успешно продолжает работу, если пользователь вводит правильный код;

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

Развязка

image

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

Итак, что мы имеем: юридическое лицо отказывает мне в оказании услуги на основании того, что другое юридическое лицо, привлекаемое им в качестве исполнителя, не хочет оказывать мне какие-либо услуги, ввиду того, что ранее я сообщал в ФАС о случаях нарушениях законодательства о рекламе, в которых, как оказалось, принимало участие это третье лицо.

В первую очередь на ум пришли положения ст. 426 ГК РФ, в частности:

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

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

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

https://www.youtube.com/watch?v=XFdNPvN8V6w

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *