python

Получение обычных SMS в мессенджеры Viber и Telegram (с помощью шлюзов GoIP)

  • пятница, 23 августа 2019 г. в 00:23:10
https://habr.com/ru/post/464671/
  • Python
  • Сотовая связь


Во многих компаниях использующих IP-телефонию и применяющих GSM-шлюзы для корпоративной связи часто возникает вопрос приема и отправки СМС со своих номеров.

Для китайских моделей GOIP существует неплохое решение GOIP-SMS-Сервер, о котором неоднократно упоминалось на просторах интернета и в нашем Habr сообществе в том числе. Это простой, бесплатный и удобный продукт, но СМС через WEB, особенно с мобильных не совсем удобно.

Возникла идея приема и передачи СМС с помощью мессенджера — и была реализована за час с помощью простого скрипта на Python3.6 и бота Telegram (и спустя 2 месяца перенесена на Viber) Прошу под кат:

Логика следующая: Обрабатываем и парсим запрос, извлекаем тело СМС, передаем ботам и Отправляем в личные чаты — получаем СМС, особенно интересна тема владельцам iPhone с 1 sim, когда оперативно нужно получить сообщения в командировке или отпуске, от банков или сервисов регистраций или узнать о пополнении оператора:

Итак рассмотрим первую часть а именно — как получать полноценные СМС из GSM сети прямо в Telegram, нам понадобиться:

  • GoIP SMS Сервер
  • Зарегистрируйте бота (получите свой TOKEN у папы всех ботов @BotFather)
  • Зарегистрируйте новый ящик на Gmail и разрешите прием по IMAP

Разберем пример скрипта, но предварительно в СМС сервере добавим наш емайл получателя (можно несколько емайл через запятую:

image

Рассмотрим скрипт:

import imaplib
import email
import telebot # установите в свое окружение библиотеку pip install PyTelegramBotAPI

bot = telebot.TeleBot('YOUTOKENBOT') #укажите ваш токен

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('yougmail@gmail.com', 'gmailpassword') #ваш новый аккаунт @gmail
mail.list() # Смотрим на папки в ящике
mail.select('INBOX') # Подключаемся к папке входящие
result, data = mail.uid('search', None, 'UNSEEN') # выбираем непрочитанные

i = len(data[0].split())
for x in range(i):
 latest_email_uid = data[0].split()[x] 
 result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')
 raw_email = email_data[0][1] 
 mail.store(latest_email_uid, '+FLAGS', '\Deleted') # удаляем чтоб не было повторной отправки
 raw_email_string = raw_email.decode('utf-8')
 email_message = email.message_from_string(raw_email_string) # получаем сырое письмо в виде строки

for part in email_message.walk():
    if part.get_content_type() == "text/html" or part.get_content_type() == "text/plain":
        body = part.get_payload(decode=True)
        s = (email_message['Subject'])
        numb = s[5:16] # Выделяем номер получателя 11 значный в виде 7XXXXXXXXXX с помощью среза, если 12 значный например для Украины то s[5:17] 
        mss = str(body.decode('unicode-escape')) # декодируем тело письма и в Python3 отменяем unicode, если 2я ветка то отменять не нужно
        abon = mss[54:67] # выделяем номер отправителя
        smss = mss[77:] # выделяем тело СМС, а именно собственно само сообщение
        soobsh=( numb + 'n'+ 'n' + smss + 'n' + 'От:' + abon) # форматируем для отправки
        bot.send_message(chat_id, soobsh) # укажите ваш chat_id и отправляйте в телегу ваше СМС
    else:
        continue

Tеперь запускаем скрипт, посылам СМСку на нашу Sim и ждем обработки — около 3 сек нужно на переброс СМС в месседжер, если все верно, то видим наши сообщения в нашем TelegramBot
(номера реальные стерты во избежание «Яровых» конфликтов):

image

image

image

Скрипт можно обернуть в «def функцию» и вызывать ее каждые 3 или 20 или сколько нужно секунд! Зависит от частоты получение СМС-ок!

Если у кого то не получается повторить, пишите — разберем каждый случай…

До встречи в следующей статье!
73!

P.S.: статья около года пролежала в песочнице (одобрена НЛО 20.08.2018) претерпела несколько изменений, видимо старые статьи автоматом не приходят, даже если новая статья позволила стать полноправным участником. Публикую исходный оригинал.

Теперь ее можно обсудить.