- Бесплатная отправка SMS от своего мегафоновского номера с помощью python-скрипта
- Для чего это нужно?
- Выбор сервиса для отправки
- Анализ сайта Сервис-Гида
- Написание скрипта
- Подведение итогов
- Конвертация скрипта Bash в код С# для отправки СМС через usb модем HUAWEI E3372
- Свой личный SMS-шлюз. Часть 2 – создаём API и форму отправки
- Постановка задачи
- Задача на разработку поставлена, цель ясна, итак приступим
- API Отправки СМС сообщений (SMS API)
- SMS отправить
- Примеры
- SMS рассылка
- Пример скрипта СМС рассылки по mySQL базе с сохранением информации об отправленных СМС
- SMS стоимость
- SMS статус
- Примеры ответов:
- СМС ошибки
- СМС получить
- «Фишка» для перехода с других сервисов SMS рассылок
- СМС CallBack
- СМС Статус
- Отправка SMS на сайте
- Комментарии ( 5 ):
Бесплатная отправка SMS от своего мегафоновского номера с помощью python-скрипта
Для чего это нужно?
Обычное применение
Необычное применение
Выбор сервиса для отправки
Сразу спешу предупредить, что изначально всё делалось для себя, поэтому решение привязано к московскому мегафону, но для других регионов у мегафона тоже есть подобные сервисы, надеюсь и для других операторов.
Очевидно, что для бытового использования крайне необходимо отправлять сообщения со своего же номера и без рекламы, поэтому сервис sendsms.megafon.ru не подходит, тем более надо вводить капчу, да и как показывать её в консоли? А если вы так же любите фреймбуфер, как люблю его я? А если учесть недавний инцидент с проиндесированными смс-ками?
К счастью, у мегафона есть система самообслуживания абонентов «Сервис-Гид», которой я довольно давно пользовался именно для этих целей, да и другие полезные функции там есть, а защищённость https внушает некоторое доверие.
Относительно недавно при входе в сервис-гид перестали предлагать ввести капчу, что заставило меня задуматься о использовании этого сайта в своих «грязных» целях.
Анализ сайта Сервис-Гида
Переходим к анализу формы входа на сайт. Я пользуюсь Mozilla Firefox и Firebug, в Google Chrome есть свой инструментарий для этих целей.
Открываем вкладку «Консоль», включаем отображение AJAX-запросов, нажимаем кнопку «Не очищать» (чтобы при перенаправлении страницы не затёрлись эти самые запросы) и пытаемся зайти на сайт.
POST-запрос:
www.serviceguide.megafonmoscow.ru/ps/scc/php/check.php?CHANNEL=WWW&LOGIN=ваш_логин&PASSWORD=ваш_пароль
Ответ:
AAAAkljkLFJ9JKJk3fowmcoOW3fds
1
U
Вроде всё понятно, легко получаем SESSION_ID.
Написание скрипта
…
Особого желания разбирать этот формат у меня не было, поэтому я воспользовался уже знакомыми мне xpath и python-lxml (вот неплохой пример использования).
Допустим, получим данные о балансе на счету:
Код намеренно написан без проверок на корректность выполнения, чтобы не загромождать пост кучей try-except.
Теперь переходим непосредственно к отправке смс:
# это продолжение предыдущего куска говнокода
Ну и было бы неплохо выполнить выход из системы:
Несложно написать скрипты, которые будут отправлять вам (или кому-то ещё) смс с нужной вам информацией: твиттер-лента, rss, прогноз погоды и прочее. Привязать это к расписании или каким-либо событиям тоже не составит особого труда.
Подведение итогов
Безусловно, многие приёмы, использованные в фрагментах скрипта, не являются примерами хорошего кода. Возможно, стоит использовать ssl-соединение вместо простого urllib.urlopen(). Возможно, что не стоит полностью переводить страницу в объект etree, а попробовать разобраться с xmlns:xalan. Но одна из целей статьи — показать, что есть удобный способ отправлять смс, не набирая его на клавиатуре телефона, а также предоставить инструмент для автоматических смс-сообщений с рассылочной информацией.
В планах написать статью про скрипт для консольного просмотра количества билетов на поезда с сайта РЖД. В принципе, легко можно осуществить связь этих двух скриптов: присылать смс-уведомление о том, что появились нужные вам билеты.
Источник
Конвертация скрипта Bash в код С# для отправки СМС через usb модем HUAWEI E3372
Несколько моих проектов отправляют СМС и в последнее время после обновлений сервера, а может и ряда других причин, отправка СМС стала почти невозможной.
Старенький USB модем HUAWEI (марку не буду разглашать) перестал стабильно висеть на одном COM порту и временами переподключался на другие порты, совсем отключался и терял антенну.
Да и ситуация с библиотекой GSMComm была непонятной и болезненной.
GSMComm — это пакет для телефонов GSM, в основном для выполнения задач, связанных с SMS.
www.nuget.org/packages/GSMComm последня версия 1.21.1 от 10.10.2015 года.
Поиск по интерент показал, что есть возможность использовать встроенный функционал WEB API новых модемов HUAWEI, более эффективно, чем старый подход с AT командами реализованный в GSMComm.
Выяснилось, что есть прекрасный usb модем HUAWEI E3372, который почти хакерским способом способен отправлять СМС как из скрипта (Curl + Bash), так и из кода (Python, Perl), и, как я предположил, из C#.
Самое печальное, что компания HUAWEI не предоставляет никакой документации как это сделать и все найденные методы имели экспериментальный харктер и зависели от семейства устройств.
В общем, опираясь на найденный материал, не гарантирующий работу кода с момедом, был приобретен HUAWEI E3372.
Не углублясь в эксперименты с Python или Perl я решил попробовать разобраться с вариантами Bash + Curl.
В общем, после нескольких экспериментов был найден работающий код под MS Windows 10 + Git Bash for MS Windows.
Скрипт удивительным образом работал. И это было уже счастье, так как деньги были потрачены на модем не зря!
Осталось только понять КАК же он работает. Почитав документацию по Curl и Bash (ну по bash я не читал так догадался) прояснилась работа скрипта. Привожу этот же скрипт с моими комментариями.
Скрипт с комментариями
Скажу честно, что СМС на русском я не смог добиться. Приходит абракадабра. Так что этот вопрос остался открытым и если у кого-то есть желание закрыть тему отправки СМС на русском — милости просим, дерзайте.
Понимание работы скрипта принесло свою пользу и приблизило к написанию кода на C#.
Было понятно, что в нем должно быть также 3 запроса и должны они делать то же самое что и благословенный Curl. Поэтому в коде приведен Curl, а ниже, аналогичный ему C# код.
Код С# для WinForms
Как только у вас в руках рабочий C# код вы всегда можете его улучшить.
В моем случае он работает как часы и для некоторого солидного количества СМС в минуту вполне годится.
Надеюсь эта статься принесла пользу и в профессиональном и экономическом смыслах.
Источник
Свой личный SMS-шлюз. Часть 2 – создаём API и форму отправки
Представляю вам вторую часть из серии статей по созданию своего шлюза.
В первой части мы настроили Gammu, рассмотрели особо интересные параметры и успешно произвели отправку SMS сообщения. Сейчас нам предстоит задача посложнее – создать некую программную прослойку (API), для того, чтобы можно было работать со шлюзом путем отправки запросов на этот API. В первую очередь это комфорт, во вторую – большое количество дополнительных возможностей.
Постановка задачи
Первое, что нужно для себя понять, какими свойствами и возможностями должен обладать наш код, что мы хотим от него получить и как с ним взаимодействовать. Для этого я поставил для себя пару вопросов и постарался максимально на них ответить.
На чем будем писать backend
Тут все просто, что умеем, на том и пишем, поэтому в моем случае – PHP
Авторизация
Конечно. Сервис будет смотреть в интернет, поэтому авторизация обязательна.
Один пользователь – одна sim-карта?
Конечно нет. У нас сервис для личного пользования и мы хотим иметь один логин, но при этом отправлять с нескольких номеров. Но если появится необходимость выделить один шлюз под конкретный сервис, мы должны иметь возможность добавления пользователей.
Один запрос – один адресат?
Нет. В одном запросе с одним текстовым сообщением должна быть возможность указать несколько адресатов. Суть этого понятна. Например я отслеживаю наличие ЭЭ на даче и в случае отключения хочу получить уведомление на все свои телефоны, а может даже телефон супруги… почему бы и нет, ведь уведомление важное.
История отправленных сообщений
Конечно, история это наша важная составляющая жизни, поэтому ее мы всегда храним
Балансировка нагрузки на карты
Да. Мы обладаем чувством меры и будем отправлять с одной карты не более какого-то числа сообщений, а значит их нужно считать и перед выбором шлюза проверять на исчерпание лимита.
Задача на разработку поставлена, цель ясна, итак приступим
Первое что мы сделаем, определим структуру база данных. Без нее, при наших потребностях никак. Использовать будем MySQL.
Дальше нужно будет написать пару классов, к которым мы были обращаться.
Приступим к созданию БД и создание таблиц
Я буду использовать несколько таблиц для:
Стоит подробнее остановиться на таблице с данными шлюза и используемых полей – smsc_gateway. Здесь мы используем:
В итоге мы получаем такую последовательность действий.
Пользователь отправляет запрос с параметрами:
Значения flash и replacemessages мы рассматривали в прошлой статье. В можно указать несколько номеров телефонов через «,». + в номере телефона указывать не нужно, но обязательно указывать номер в международном формате (для России это 7…). Так же в стоку можно добавить еще один параметр – &attempts= – количество попыток внутри одной отправки, то есть, если можем при отправке вернул ошибку, пытаться ли отправить тут же еще раз?
Вот, что происходит под капотом smsc.php
Первым делом мы подключаем файл с настройками – config.php:
делаем небольшую проверку на XSS, а далее проверяем авторизацию, вызывая метод класса Users_Auth::do($PDO):
Если получили false – авторизация не удалась, возвращаем код и описание ошибки в json, если необходимо.
Если авторизация успешная вызываем $sms_handle->save(), проверяем переданы ли обязательные параметры – телефон и текст сообщения, проверяем в БД статус пользователя, разбираем строку запроса и приводим в нужный нам вид, удаляем пробелы и «+» из номера телефона, а также разделяем их по запятой. Таким образом получаем массив номеров телефонов и текста сообщения, которое нужно на них отправить. Делаем из этого json и сохраняем в таблицу очереди на отправку. Проверка на наличие телефона обязательна. Если попытаться отправлять сообщения без указания номера телефона, возникнет ошибка в Gammu, и шлюз будет занят на несколько секунд. Когда шлюз освободится возникнет аналогичная повторная ситуация, что в свою очередь создаст так называемую «пробку» и последующие сообщения из очереди просто не смогут уйти.
Дальше мы используем простой скрипт, который поставим в cron и будем вызывать раз в 5-10 секунд (по вкусу) – send_queue.php
Он будет обращаться к методу класса обработчика сообщений SMS_data_handle->send(). Здесь уже начинается самое интересное.
Мы получаем сообщение за последние 10 минут без тегов статуса. Если нашли такое, ставим на него тег — process и берём в работу.
Извлекаем из тела json uuid пользователя, обращаемся к таблице и получаем список активных шлюзов. Идем в таблицу со счётчиком и проверяем, не превышен ли лимит на отправку. Если мы получили активный шлюз и счётчик не превышен, ставим на него тег — lock, чтобы никакой другой процесс уже не смог параллельно к нему обратиться. Все вызовы происходит внутри метода send(), но логика раскидана по другим методам класса. По указанному выше описанию работы метода эти обращения легко видны.
Далее мы создаем объект класса $send_proc = new Gammu_SMS($param) с параметрами и обращаемся к методу $send_proc->send($attr) с атрибутами
Весь код метода send():
Если объект вернул true, то переносим сообщение в архив и увеличиваем счётчик отправленных сообщений. Иначе снимаем тег proccess и через некоторое время будет повторная попытка отправки по cron.
Особо внимательные заметили, что мы вызываем метод с дефолтным параметром равным одному – send($с = 1). Параметр $c заложен «на перспективу» и позволяет нам, в случае необходимости получать пачку сообщений из базы данных и обрабатывать их отправку в цикле. Для этого в файле, вызываемом в cron нужно в вызове метода указать число сообщений для выборки их БД – $sms_handle->send(<число>);
Обратим внимание еще на один момент. В файле smsc.php есть возможность отправлять сообщения сразу после того, как оно было добавлено в БД. Для этого нужно раскомментировать следующую строку:
Это позволит нам отказаться от cron, но есть один нюанс – желательно использовать этот метод, если вы отправляете сообщения только на один номер и запросы к шлюзу не могут быть чаще чем раз в 30 секунд. Иначе возможны ошибки связанные с наложением запросов и если шлюз занят, то сообщение не отправится.
Теперь наш шлюз работает через API и умеет отправлять сообщения.
Ну и бонусом мы сделаем простую форму для отправки сообщений с сайта. Ее код не нуждается в пояснении, она просто принимает от вас тест и отправляет POST-запрос на указанный нами скрипт. Единственное в блоке отправки ajax нужно заменить url: «/ » на адрес вашего скрипта smsc.php
Итак подведем итоги проделанной работы. Мы создали аппаратную платформу, научились отправлять сообщения через терминал и расширили возможности системы собственным API для легкого доступа к шлюзу устройств способных отправлять GET/POST-запросы. Хранить историю и балансировать нагрузку между картами и прочее. Все это сильно упрощает работу со шлюзом и позволяет хранить все в одном сервисе.
Внимание, я не претендую на великолепную красоту кода и буду рад любой объективной критике для понимания своих ошибок (в случае наличия) и совершенствования навыков.
Источник
API Отправки СМС сообщений (SMS API)
SMS отправить
Простой способ отправить СМС сообщение с помощью GET-запроса:
В ответ Вы получите структуру формата html или xml или json содержащую следующие поля:
Если ошибка, то:
error=текст ошибки
Если успешно, то для каждого отправленного сообщения возвращается объект содержащий следующие поля:
‘phone’=>номер телефона,’sms_id’=>ID сообщения для проверки его доставки,’cost’=>стоимость отправки в рублях
Если информация запрашивается в формате html, то возвращается общая информация о пакете отправленных SMS, содержащая общую стоимость отправленного собщения, список номеров и текст сообщения
Параметры можно передавать как GET так и POST запросом. Можно комбинировать, часть параметов через GET, часть через POST. Рекомендуем использовать POST, т.к. он не сохраняется в кеше браузера и в логах прокси-серверов.
Вы можете использовать дополнительные необязательные параметры:
Примеры
SMS рассылка
Для создания SMS рассылки на множество номеров, укажите все номера через запятую, например:
Если Вы хотите в одном запросе объединить множество различных СМС сообщений, сформируйте следующий пакет в формате XML или JSON:
Формат php до преобразования
В разделе «default» Вы можете указать значения по умолчанию для этого пакета СМС.
Пример ответа на запрос отправки СМС:
Если сообщение отправлено, то в каждую строку будет добавлен параметр id сообщения. Если в одном сообщении Вы укажете несколько телефонов, они разобьются на отдельные записи.
Пример скрипта СМС рассылки по mySQL базе с сохранением информации об отправленных СМС
SMS стоимость
Структура API запроса для получения стоимости СМС сообщения:
Вы можете использовать дополнительные параметры:
SMS статус
Структура API запроса для получения статуса СМС сообщения:
Примеры ответов:
формат html или без параметра формата:
Возможные ответы при ошибке:
СМС ошибки
Если такое сообщение уже отправлялось Вы получите следующий ответ:
В котором будет id ранее отправленного СМС, его стоимость и сообщение об ошибке
СМС получить
Для получения списка отправленных или полученных СМС используйте следующий запрос:
Например, для получения до 200 входящих СМС, полученных от номера 900 начиная с 14.03.2017г используйте следующий запрос:
«Фишка» для перехода с других сервисов SMS рассылок
СМС CallBack
После доставки сообщения или при получении входящего СМС, входящего звонка или при получении ответа на HLR-запрос вызывается Url-адрес, указанный в профиле. Обработчик должен завершить свою работу за 10 секунд и вернуть http-код 200.
Возвращаемые поля для отправляемого сообщения:
‘type’=>’send’ | ‘receive’ | ‘receive call’,
‘id’=>ID сообщения,
‘status’=>STATUS
СМС Статус
Источник
Отправка SMS на сайте
Иногда необходимо пользователям на сайте отправлять SMS на их мобильные телефоны. Например, это может быть нужно для подтверждения важной операции (например, смена пароля). Или, например, для сообщения важной информации (например, что оплаченный товар пришёл в почтовое отделение). Так же можно делать авторизацию с логином и кодом по SMS, а не обычным паролем. Таким образом, отправлять SMS на сайте приходится относительно часто, и в этой статье я расскажу, как это можно делать.
О том, как разобраться с API и как его использовать, я рассказывал в предудыщей статье: как работать с API.
Так же есть плохой, но зато бесплатный способ. Но тут потребуется узнавать, какой оператор у Вашего посетителя. То есть придётся либо просить его самого указать оператора, либо по коду в телефонном номере пытаться его определить.
После определения оператора можно с помощью того же cURL отправить запрос по данным из формы соответствующего оператора. Например, для Beeline: https://www.beeline.ru/sms/index.wbp. Безусловно, пользователю надо будет ещё подгрузить их капчу, чтобы он смог её ввести.
И подобный механизм надо сделать для всех операторов, которыми пользуются Ваши посетители. Мучительная работа, зато бесплатно. И, более того, частенько придётся править свои скрипты, ведь параметры формы могут быть изменены, и Вы об этом узнаете не сразу. В результате, скрипт станет нерабочим, пока Вы его не исправите.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 5 ):
Здравствуйте Михаил, мне нужно на сайте в админ панели сделать СМС рассылку регистрированным пользователям. Можете посоветовать какой-нибудь хороший сервис для рассылки.Я преподаю английский язык студентам собираюсь проводить несколько онлайн семинар, несколько раз в месяц никак не могу найти скрипт, чтобы установить на сайт можете в добавок и на этот вопросик ответить. Спасибо!
Спасибо Александр! А насчёт проведения семинаров на сайте можете что-нибудь посоветовать
Для рассылок посмотрите уже упомянутый SMS Aero: http://smsaero.ru/ У них есть разные возможности для рассылок плюс редактируемая форма подписки, которую можно установить на сайт и собирать контакты посетителей.
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
Источник