После длительных путешествий я накопил множество мобильных номеров и соответственно физических 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 образ!
Думаю что это довольно простое в реализации, дешевое и масштабируемое решение проблемы (особенно если ты селфхостер).
Спасибо за пост)
Не думал что мои наработки из чулана пригодятся :))
Дополню, что существуют интересные штуковины, которые, судя по описанию, позволяют вставлять в себя много симок и переключаться между ними через ussd коды (т.е. удаленно). Надеюсь, что когда-нибудь доберусь до своего двухсимочного андроид телефона и попробую настроить компактное решение для 8 сим-карт.
ИМХО, найти старый телефон на Android проще, вот только нужно как-то заботиться о заряде и подключению к WiFi. Для этих целей давно использую RemoteBot (давно не поддерживается автором, но выкладывали взломанную рабочую версию), но вот наткнулся ещё и на telegram-sms — если кто будет пробовать, отпишитесь по результатам.
А как быть с eSIM? :)
Я же правильно понимаю что на каждую симку свой модем нужен?