Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Отправка SMS через Python [в одну функцию]

Отправка SMS Python

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

Хотел найти уже готовый вариант скрипта по отправки sms на Python, но все было не то. Как то слишком большой код для такого простого дела. Написал небольшую функцию которая облегчила мою работу и надеюсь, что и вашу тоже.

Шаг 1

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

-> Пройдите регистрацию

Шаг 2

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

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

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

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

Заходим во вкладке Настройки -> Имена отправителей:

Отправка SMS через Python

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

Скрипт отправки SMS Python

Нам понадобиться библиотеки urllib, json, time

Первая urllib и time уже установлены, а вот json если еще не устанавливали для других нужд придется устанавливать сейчас.

# -*- coding: utf-8 -*-
import urllib
import json
import time
 
def send_sms(phones, text, total_price=0):
    login = 'userlog'       # Логин в smsc
    password = 'myPas1'     # Пароль в smsc
    sender = 'Python'    # Имя отправителя
    # Возможные ошибки
    errors = {
        1: 'Ошибка в параметрах.',
        2: 'Неверный логин или пароль.',
        3: 'Недостаточно средств на счете Клиента.',
        4: 'IP-адрес временно заблокирован из-за частых ошибок в запросах. Подробнее',
        5: 'Неверный формат даты.',
        6: 'Сообщение запрещено (по тексту или по имени отправителя).',
        7: 'Неверный формат номера телефона.',
        8: 'Сообщение на указанный номер не может быть доставлено.',
        9: 'Отправка более одного одинакового запроса на передачу SMS-сообщения либо более пяти одинаковых запросов на получение стоимости сообщения в течение минуты. '
    }
    # Отправка запроса
    url = "http://smsc.ru/sys/send.php?login=%s&psw=%s&phones=%s&mes=%s&cost=%d&sender=%s&fmt=3" % (login, password, phones, text, total_price, sender)
    answer = json.loads(urllib.urlopen(url).read())
    if 'error_code' in answer:
        # Возникла ошибка
        return errors[answer['error_code']]
    else:
        if total_price == 1:
            # Не отправлять, узнать только цену
            print 'Будут отправлены: %d SMS, цена рассылки: %s' % (answer['cnt'], answer['cost'].encode('utf-8'))
        else:
            # СМС отправлен, ответ сервера
            return answer
 
print send_sms("7111111111111", 'Текст сообщения')

Всю работу выполняет одна функция send_sms() ей передаются параметры:

  • phones - номер телеофна в международном формате, можно  один а можно через точку с запятой разделять несколько "711111111;72222222"
  • text - сам текст для смс-ки
  • total_price - 0 просто отправляет сообщение снимая деньги, 1 не отправляет письмо но возвращает отчет сколько будет стоить отправка.

Настройка

В самом теле функции меняем данные для входа в SMSC на свои.

login = 'userlog'       # Логин в smsc
password = 'myPas1'     # Пароль в smsc
sender = 'Python'    # Имя отправителя

login, password будут логин и пароль для входа в личный кабинет в smsc. В sender нужно прописать имя отправителя которого вам подтвердили служба поддержки.

Рассылка SMS на Python

# ... допустим, что функция выше уже имеется в нашем скрипте
 
# Отправляем на 3 номера телефона один и тот же текст. Разделяем номера телефона через ;
send_sms("7111111111111;722222222222;7333333333333", 'Текст сообщения')
  
# Рассылка на несколько номеров
phones = ('711111111', '722222222', '7333333333333')
text = 'текст для письма!'
for number in phones:
    send = send_sms(number, text)
    if 'cnt' in send:
        print 'На номер %s, сообщение отправлено успешно!' % number
        time.sleep(30) # Засыпаем передачу на 30 сек - ограничение...
    else:
        print send
        print 'Ошибка...'

Ограничение нужна если отправляется один и тот же текст.

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

Комментариев: 8
  1. File "smsc.py", line 10

    SyntaxError: Non-ASCII character '\xd0' in file smsc.py on line 10, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

  2. Андрей | 2016-07-01 в 15:11:29

    Возможно, будет интересно. Использую скрипт для отправки смс на Perl - http://www.smsfeedback.ru/smsapi/perl.php

  3. @python настройте кодировку!

  4. Можно мне развидеть этот код?

  5. А чем тебе код не понравился? расскажи нам дуракам. как надо писать =)

  6. Traceback (most recent call last):

    File "C:/Users/Новый Пользователь/AppData/Local/Programs/Python/Python37-32/0.3.py", line 37, in

    send = send_sms(phones, text)

    File "C:/Users/Новый Пользователь/AppData/Local/Programs/Python/Python37-32/0.3.py", line 22, in send_sms

    answer = json.loads(urllib.urlopen(url).read())

    AttributeError: module 'urllib' has no attribute 'urlopen'

  7. Ya.ru

    [URL=http://ya.ru]Ya.ru[/URL]

  8. Георгий | 2021-05-12 в 08:06:24

    Traceback (most recent call last):

    File "/data/user/0/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 31, in

    start(fakepyfile,mainpyfile)

    File "/data/user/0/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 30, in start

    exec(open(mainpyfile).read(), __main__.__dict__)

    File "", line 30

    print 'Будут отправлены: %d SMS, цена рассылки: %s' % (answer['cnt'], answer['cost'].encode('utf-8'))

    ^

    SyntaxError: invalid syntax

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

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

(обязательно)