Как пересылать SMS в Telegram: простой способ для многосимочников

 Публичный пост для комнаты «Селфхостинг»
6 октября 2024  323
Держи долор

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

Если у вас много SIM-карт и вы хотите получать SMS в Telegram, у меня есть для вас простой способ. Вам понадобится машина с Linux, которая будет постоянно запущена и подключена к интернету, и примерно 10$.

Что для этого нужно

  • Физическая сим карта
  • USB modem из списка поддерживаемых библиотекой gammu
  • Токен для telegram бота, ID чата/канала
  • Машина на Linux со свободным USB портом
  • Установленный docker и docker compose

Достаем модем

Если у вас уже дома есть USB модем то проверьте может он есть в списке поддерживаемых.

Для нашей задачи нам не нужен дорогой 4G модем с крутыми фичами. Нам подойдет любой работающий 2G/3G модем и мы можем легко найти такой на avito/ebay/wallapop за хорошую цену.

Вбиваем в поиске "USB модем Huawei", сортируем по цене и ищем те которые без привязки к оператору или уже прошитые. Например такой:


Дальше идем на сайт gammu и ищем там это устройство, надо чтобы оно нашлось и в столбце Supported features был sms :

Если устройство удовлетворяет этим требования, то можно брать!

Настройка

Перед настройкой лучше подключить модем с уже вставленной сим картой на ПК и проверить что он вообще живой.

Определяем путь до устройства

Вставляем модем в USB порт на машине с Linux. Запускаем dmesg и видим примерно следующее:


[73437.459820] usb 3-2: New USB device found, idVendor=12d1, idProduct=15ca, bcdDevice= 1.02
[73437.459838] usb 3-2: Product: HUAWEI Mobile
[73437.459842] usb 3-2: Manufacturer: HUAWEI
[73439.538555] usb-storage 3-2:1.4: USB Mass Storage device detected
[73439.540038] scsi host1: usb-storage 3-2:1.4
[73439.540951] usb-storage 3-2:1.5: USB Mass Storage device detected
[73439.541407] scsi host2: usb-storage 3-2:1.5
[73439.598494] usbcore: registered new interface driver cdc_ncm
[73439.599661] usbcore: registered new interface driver option
[73439.599694] usbserial: USB Serial support registered for GSM modem (1-port)
[73439.599763] option 3-2:1.0: GSM modem (1-port) converter detected
[73439.599972] usb 3-2: GSM modem (1-port) converter now attached to ttyUSB0
[73439.600061] option 3-2:1.2: GSM modem (1-port) converter detected
[73439.600255] usb 3-2: GSM modem (1-port) converter now attached to ttyUSB1
[73439.601026] option 3-2:1.3: GSM modem (1-port) converter detected
[73439.601168] usb 3-2: GSM modem (1-port) converter now attached to ttyUSB2
[73439.604433] usbcore: registered new interface driver cdc_wdm

Нас интересуют логи где есть упоминание ttyUSB:

[73439.599972] usb 3-2: GSM modem (1-port) converter now attached to ttyUSB0
[73439.600255] usb 3-2: GSM modem (1-port) converter now attached to ttyUSB1
[73439.601168] usb 3-2: GSM modem (1-port) converter now attached to ttyUSB2

Почему модем один а устройств три? Наверное потому что в модеме есть еще гнездо для microsd и read-only память с встроенным ПО. Методом перебора я выяснил что мне нужно устройство /dev/ttyUSB0.

Как запускать

# docker-compose.yaml
services:
  gammu:
    build:
      context: https://github.com/kutovoys/sms-to-telegram.git#main
      dockerfile: Dockerfile.alpine
    volumes:
    - type: bind
      source: /dev/ttyUSB0 # тут пишем устройство с лога dmesg
      target: /dev/modem
    privileged: true
    environment:
      - BOT_TOKEN=<токен для бота>
      - PIN=<PIN от сим карты>
      - CHAT_ID=<ID чата в telegram>
      - DEVICE=/dev/modem
    cap_add:
    - NET_ADMIN
    - SYS_MODULE
docker compose up -d gammu
docker compose logs -f --tail=100 gammu

Если было проброшенно не то устройство то в логах будут ошибки например:

gammu-1  | Fri 2024/10/04 20:49:51 gammu-smsd[11]: Created POSIX RW shared memory at 0x7f2199b6f000
gammu-1  | Fri 2024/10/04 20:49:51 gammu-smsd[11]: Starting phone communication...
gammu-1  | Fri 2024/10/04 20:50:51 gammu-smsd[11]: Error at init connection: No response in specified timeout. Probably the phone is not connected. (TIMEOUT[14])
gammu-1  | Fri 2024/10/04 20:50:51 gammu-smsd[11]: Already hit 250 errors
gammu-1  | Fri 2024/10/04 20:50:51 gammu-smsd[11]: Terminating communication: No response in specified timeout. Probably the phone is not connected. (TIMEOUT[14])
gammu-1  | Fri 2024/10/04 20:50:51 gammu-smsd[11]: Starting phone communication...
gammu-1  | Fri 2024/10/04 20:51:52 gammu-smsd[11]: Error at init connection: No response in specified timeout. Probably the phone is not connected. (TIMEOUT[14])
gammu-1  | Fri 2024/10/04 20:51:52 gammu-smsd[11]: Already hit 250 errors
gammu-1  | Fri 2024/10/04 20:51:52 gammu-smsd[11]: Terminating communication: No response in specified timeout. Probably the phone is not connected. (TIMEOUT[14])
gammu-1  | Fri 2024/10/04 20:51:52 gammu-smsd[11]: Starting phone communication...

Если все ок то будет примерно так:

gammu-1  | Fri 2024/10/04 17:50:56 gammu-smsd[12]: Created POSIX RW shared memory at 0x7fcf90b21000
gammu-1  | Fri 2024/10/04 17:50:56 gammu-smsd[12]: Starting phone communication...
gammu-1  | Fri 2024/10/04 17:55:30 gammu-smsd[12]: Ignoring incoming SMS info as not a Status Report in SR memory.
gammu-1  | Fri 2024/10/04 17:55:33 gammu-smsd[12]: Read 1 messages
gammu-1  | Fri 2024/10/04 17:55:33 gammu-smsd[12]: Received IN20241004_195517_00_Celerity_00.txt
gammu-1  | Fri 2024/10/04 17:55:33 gammu-smsd[13]: Starting run on receive: /etc/sms_to_telegram.sh IN20241004_195517_00_Celerity_00.txt 
gammu-1  | Fri 2024/10/04 17:55:33 gammu-smsd[12]: Process finished successfully

Чтобы проверить получения смс можно воспользоваться бесплатными сервисами по отправке смс (гугли "send sms for free" ) или попытаться авторизоваться в telegram/банке/итд.

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

Есть библиотека Gammu, которая предоставляет абстракцию для работы с телефонами/модемами разных производителей .

И есть Gammu SMS Daemon работающий поверх этой библиотеки, который получает смс-ки и запускает произвольный скрипт. В нашем случае это скрипт для отправки сообщений в telegram.

Вместо итогов

Спасибо @kutovoys за идею и docker образ!

Думаю что это довольно простое в реализации, дешевое и масштабируемое решение проблемы (особенно если ты селфхостер).

Связанные посты
11 комментариев 👇

Спасибо за пост)
Не думал что мои наработки из чулана пригодятся :))

  Развернуть 1 комментарий

@kutovoys, Да они вообще завелись без правок и фиксов!
Это тот редкий момент когда что-то заработало с первого раза :)

  Развернуть 1 комментарий

@alikhil, сам в шоке))

  Развернуть 1 комментарий
Nikita Sukhorukov Golang Software Video Developer 5 октября в 19:57

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

  Развернуть 1 комментарий

ИМХО, найти старый телефон на Android проще, вот только нужно как-то заботиться о заряде и подключению к WiFi. Для этих целей давно использую RemoteBot (давно не поддерживается автором, но выкладывали взломанную рабочую версию), но вот наткнулся ещё и на telegram-sms — если кто будет пробовать, отпишитесь по результатам.

  Развернуть 1 комментарий

@aryadovoy, Согласен, телефон найти проще. Я тоже рассматривал этот вариант.

Но с точки зрения поддержки и сетапа лично мне легче с USB модемом. В добавок это еще и дешевле.

  Развернуть 1 комментарий

@aryadovoy, Я telegram-sms использовал, работало отлично. Батарейка только через пару лет вспухла.

  Развернуть 1 комментарий

А как быть с eSIM? :)

  Развернуть 1 комментарий

@aryadovoy, Вряд ли такое количество симок нужно постоянно. Как правило они нужны эпизодически, авторизоваться где-нибудь и т.п. Так что профили eSIM можно хранить в телефоне и активировать при необходимости.

  Развернуть 1 комментарий

Я же правильно понимаю что на каждую симку свой модем нужен?

  Развернуть 1 комментарий

@kudjo, да, в варианте в котором я описал - все так

  Развернуть 1 комментарий

😎

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

Что вообще здесь происходит?


Войти  или  Вступить в Клуб