[Модуль] Xiaomi miIO (xiaomimiio)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Dicont
Сообщения: 112
Зарегистрирован: Вс дек 17, 2017 11:24 pm
Благодарил (а): 34 раза
Поблагодарили: 11 раз

Re: [Модуль] Xiaomi miIO

Сообщение Dicont » Сб янв 13, 2018 10:47 pm

Вот что удалось протестировать. Команды работают! Но это еще не все скорее всего.
Пример брал вот отсюда https://github.com/rytilahti/python-miio/issues/69
Это немного другая колонка попроще Mi Internet Speaker, но прошли.

Для Mi Wifi Speaker (mdz-16-da):
СпойлерПоказать
В режиме ожидания подключение через Bt

22:31:34 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=get_prop&dopt=["umi"]
22:31:34 {"result":["{ \"DeviceName\": \"???????(580005070)\", \"channel_title\": \"??????\", \"current_state\": \"PAUSED_PLAYBACK\", \"hardware_version\": \"S602\",
\"play_mode\": \"REPEAT_ALL\", \"track_artist\": \"\", \"track_duration\": \"00:00:00\", \"track_title\": \"\", \"transport_channel\": \"BT\" }"],"id":1515871894}

В режиме PLAY Bt

16:7:35 command = get_prop
16:7:35 properties = ["umi"]
16:7:35 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=get_prop&dopt=["umi"]
16:7:35 {"result":["{ \"DeviceName\": \"小米互联网音箱(580005070)\", \"channel_title\": \"Billboard精选专辑\", \"current_state\": \"PLAYING\", \"hardware_version\": \"S602\", \"play_mode\": \"REPEAT_ALL\", \"track_artist\": \"\", \"track_duration\": \"00:00:00\", \"track_title\": \"\", \"transport_channel\": \"BT\" }"],"id":1515935256}

16:7:50 command = get_prop
16:7:50 properties = ["rel_time"]
16:7:50 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=get_prop&dopt=["rel_time"]
16:7:50 {"result":["NOT_IMPLEMENTED"],"id":1515935270}

Интернет радио режиме PLAY

16:2:47 command = get_prop
16:2:47 properties = ["umi"]
16:2:47 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.102&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=get_prop&dopt=["umi"]
16:2:47 {"result":["{ \"DeviceName\": \"小米互联网音箱(580005070)\", \"channel_title\": \"Billboard精选专辑\", \"current_state\": \"PLAYING\", \"hardware_version\": \"S602\", \"play_mode\": \"REPEAT_ALL\", \"track_artist\": \"Owl City&Yuna\", \"track_duration\": \"00:03:26\", \"track_title\": \"Shine Your Way\", \"transport_channel\": \"PLAYLIST\" }"],"id":1515934967}

POWER On\Off

22:29:15 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=power&dopt=
22:29:15 {"result":"ok","id":1515871755}

PLAY

22:33:13 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=play&dopt=
22:33:13 {"result":"ok","id":1515871993}

PAUSE

22:41:35 command = pause
22:41:35 properties =
22:41:35 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=pause&dopt=
22:41:35 {"result":"ok","id":1515872495}

toggle (Работает как кнопка включить выключить музыку, имитация Play\Pause)

23:13:45 command = toggle
23:13:45 properties =
23:13:45 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=toggle&dopt=
23:13:45 {"result":"ok","id":1516133627}

VOL UP

command = vol_up
properties = [5] - на сколько увеличить громкость,

В приложении:
this.mVolumeView.setMaxVolume(100);
this.mVolumeView.setMinVolume(0);

22:36:16 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=vol_up&dopt=[5]
22:36:16 {"result":"ok","id":1515872176}

VOL DW

22:35:50 command = vol_down
22:35:50 properties = [5]
22:35:50 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=vol_down&dopt=[5]
22:35:50 {"result":"ok","id":1515872150}


NEXT CH (Выбор радиоканала из списка в приложении)

22:40:14 command = next_channel
22:40:14 properties =
22:40:14 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=next_channel&dopt=
22:40:14 {"result":"ok","id":1515872414}

PREV CH (Выбор радиоканала из списка в приложении)

14:33:47 command = previous_channel
14:33:47 properties =
14:33:47 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=previous_channel&dopt=
14:33:47 {"result":"ok","id":1515929627}

PREV TR

22:37:0 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=previous_track&dopt=
22:37:0 {"result":"ok","id":1515872220}

NEXT TR

22:38:0 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=next_track&dopt=
22:38:0 {"result":"ok","id":1515872280}

Показывает время звучания текущего трека в секундах, только когда играет transport_channel\": \"PLAYLIST\

15:28:11 command = get_prop
15:28:11 properties = ["rel_time"]
15:28:11 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=get_prop&dopt=["rel_time"]
15:28:11 {"result":["00:00:22"],"id":1515932891}15:28:12 command = get_prop

при transport_channel\": \"BT\"
command = get_prop
properties = ["rel_time"]
результат: result":["NOT_IMPLEMENTED"]

Текущий уровень громкости

20:15:19 command = get_prop
20:15:19 properties = ["volume"]
20:15:19 /ajax/xiaomimiio.html?op=test_api_cmd&dip=192.168.0.12&dtoken=4xxxxxxxxxxxxxxxxxxxxxa&dcmd=get_prop&dopt=["volume"]
20:15:19 {"result":[29],"id":1516209319}
Последний раз редактировалось Dicont Ср янв 17, 2018 8:26 pm, всего редактировалось 7 раз.
За это сообщение автора Dicont поблагодарил:
skysilver (Вс янв 14, 2018 10:13 pm)
Рейтинг: 1.16%
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: [Модуль] Xiaomi miIO

Сообщение skysilver » Вс янв 14, 2018 10:16 pm

Dicont писал(а):Вот что удалось протестировать. Команды работают!
Отличная работа. Постараюсь запилить в следующем обновлении.

П.с. Все команды/методы (М), которые идут с пустыми свойствами (Р) будут работать через привязку метода-свойства к command в модуле. Можно проверить уже сейчас.
За это сообщение автора skysilver поблагодарили (всего 2):
odinvolk (Пн янв 15, 2018 2:34 am) • Dicont (Пн янв 15, 2018 9:14 pm)
Рейтинг: 2.33%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Dicont
Сообщения: 112
Зарегистрирован: Вс дек 17, 2017 11:24 pm
Благодарил (а): 34 раза
Поблагодарили: 11 раз

Re: [Модуль] Xiaomi miIO

Сообщение Dicont » Пн янв 15, 2018 9:53 pm

Если что то еще получиться найти, добавлю в тот же спойлер.

А нет ничего для miIO типа SNMP walk, чтобы все команды вытащить?

или еще какие нибудь варианты, какой нибудь китайский форум по miIO
или придется как то прошивку ломать, но ее где то брать- не видел в открытом доступе,
может еще какой нибудь ресурс.
Пока поиски не дали результата, только github но там все вроде перебрал..
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: [Модуль] Xiaomi miIO

Сообщение skysilver » Вт янв 16, 2018 9:36 am

Dicont писал(а):А нет ничего для miIO типа SNMP walk, чтобы все команды вытащить?
Подозреваю, что нет. Это ж закрытый протокол.
Dicont писал(а):или еще какие нибудь варианты, какой нибудь китайский форум по miIO
Я ищу на гитхабе и исходниках других систем УД - iobroker, hass, openhab, Homegear, Jeedom, Homey.
Dicont писал(а):или придется как то прошивку ломать, но ее где то брать- не видел в открытом доступе
Прошивку устройств расковырять, думаю, нереально. Вот декомпильнуть приложение Михом и его плагины на конкретные девайсы еще можно попробовать. Но я бы так зарываться не стал. Выяснить апи-команды можно, перехватив wireshark-ом трафик между Михом и устройством.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Dicont
Сообщения: 112
Зарегистрирован: Вс дек 17, 2017 11:24 pm
Благодарил (а): 34 раза
Поблагодарили: 11 раз

Re: [Модуль] Xiaomi miIO

Сообщение Dicont » Вт янв 16, 2018 10:34 pm

Перехватил пакеты - они зашифрованы от xiaomi.wifispeaker.
Нормально только от lumi.gateway.v3 приходят.

На 4PDA нашел кучу плагинов для MiHOME - https://drive.google.com/drive/folders/ ... 3RvbTZjUGc

Скачал
55. папка 421 | файл 6945.apk | назначение - Xiaomi Mi Smart Network Speaker

Далее декомпиляция APK.
Получил исходники, в них много интересного. Нужно проверять.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: [Модуль] Xiaomi miIO

Сообщение skysilver » Вт янв 16, 2018 10:41 pm

Dicont писал(а):Перехватил пакеты - они зашифрованы от xiaomi.wifispeaker.
Аха, так и есть. Дальше этот дамп в wireshark-ке надо экспортировать в json формат и скормить расшифровщику вместе с токеном. Для этого дела я использую miio под nodejs (развернул на тестовой виртуалке) отсюда https://github.com/aholstenson/miio
Команда в консоли такая:

Код: Выделить всё

miio --token b31c928032e6a4afc898c5c8768a518f --json-dump e:\cap5.json
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Dicont
Сообщения: 112
Зарегистрирован: Вс дек 17, 2017 11:24 pm
Благодарил (а): 34 раза
Поблагодарили: 11 раз

Re: [Модуль] Xiaomi miIO

Сообщение Dicont » Сб янв 20, 2018 7:01 pm

skysilver писал(а):
Dicont писал(а):Перехватил пакеты - они зашифрованы от xiaomi.wifispeaker.
Аха, так и есть. Дальше этот дамп в wireshark-ке надо экспортировать в json формат и скормить расшифровщику вместе с токеном. Для этого дела я использую miio под nodejs (развернул на тестовой виртуалке) отсюда https://github.com/aholstenson/miio
Команда в консоли такая:

Код: Выделить всё

miio --token b31c928032e6a4afc898c5c8768a518f --json-dump e:\cap5.json
Поставил node.js поставил модуль miio
но в списке node_modules/miio/lib/devices/ нет xiomi wifi или internet speaker,
при выполнении команды выше, пишет ошибка, и использует devices/gateway/subdevice.js

Из приложения MiHome (модуль для Xiaomi Mi Smart Network Speaker) добавил все что нашел в исходниках в сообщение выше.

Хотелось проверить работу кнопки CH, как вы написали- с помощью расшифровки трейса из wireshark экспортированном в json.
Надеялся ее использовать как микрофон для передачи команд МЖД,
но микрофон работает только когда ее нажимаешь на колонке и далее запрос поиска через китайское облако (,
а из приложения работает только как next_chanel к сожалению.

Но можно включать выключать и запускать музыку, и думаю выводить на колонку звук, если колонка подключена по BT к серверу МЖД!
Что очень хорошо!

Возможно, что то не так сделал при дешифровке пакетов, ранее опыта не было.
СпойлерПоказать
В файле /home/dicont/mich, пакеты от Колонки до Андроид с установленным приложением MiHOME.

nodejs miio --token 4xxxxxxxxxxxxxxxxxxxxxa --json-dump /home/dicont/mich

/usr/src/miio-master/node_modules/miio/lib/devices/gateway/subdevice.js:52
return this._parent.call('get_device_prop_exp', [ [ 'lumi.' + this.id, ...this._propertiesToMonitor ]])
^^^

SyntaxError: Unexpected token ...
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:374:25)
at Object.Module._extensions..js (module.js:417:10)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Module.require (module.js:354:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/usr/src/miio-master/node_modules/miio/lib/devices/gateway.js:11:19)
at Module._compile (module.js:410:26)
at Object.Module._extensions..js (module.js:417:10)
root@Dexter:/usr/src/miio-master/node_modules# ls /usr/src/miio-master/node_modules/miio/lib/devices/
air-purifier.js chuangmi.plug.v1.js gateway humidifier.js power-outlet.js power-strip.js vacuum.js yeelight.js yeelight.mono.js
capabilities eyecare-lamp2.js gateway.js philips-light-bulb.js power-plug.js power-switch.js yeelight.color.js yeelight.lamp.js
root@Dexter:/usr/src/miio-master/node_modules# ls /usr/src/miio-master/node_modules/miio/lib/devices/ -l
итого 84
-rw-rw-r-- 1 dicont dicont 4284 янв 3 23:01 air-purifier.js
drwxrwxr-x 2 dicont dicont 4096 янв 19 23:32 capabilities
-rw-rw-r-- 1 dicont dicont 755 янв 3 23:01 chuangmi.plug.v1.js
-rw-rw-r-- 1 dicont dicont 2523 янв 3 23:01 eyecare-lamp2.js
drwxrwxr-x 2 dicont dicont 4096 янв 19 23:32 gateway
-rw-rw-r-- 1 dicont dicont 10013 янв 3 23:01 gateway.js
-rw-rw-r-- 1 dicont dicont 2722 янв 3 23:01 humidifier.js
-rw-rw-r-- 1 dicont dicont 1301 янв 3 23:01 philips-light-bulb.js
-rw-rw-r-- 1 dicont dicont 536 янв 3 23:01 power-outlet.js
-rw-rw-r-- 1 dicont dicont 534 янв 3 23:01 power-plug.js
-rw-rw-r-- 1 dicont dicont 810 янв 3 23:01 power-strip.js
-rw-rw-r-- 1 dicont dicont 542 янв 3 23:01 power-switch.js
-rw-rw-r-- 1 dicont dicont 5035 янв 3 23:01 vacuum.js
-rw-rw-r-- 1 dicont dicont 1268 янв 3 23:01 yeelight.color.js
-rw-rw-r-- 1 dicont dicont 2988 янв 3 23:01 yeelight.js
-rw-rw-r-- 1 dicont dicont 173 янв 3 23:01 yeelight.lamp.js
-rw-rw-r-- 1 dicont dicont 173 янв 3 23:01 yeelight.mono.js
root@Dexter:/usr/src/miio-master/node_modules#
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: [Модуль] Xiaomi miIO

Сообщение skysilver » Сб янв 20, 2018 10:27 pm

Dicont писал(а):Возможно, что то не так сделал при дешифровке пакетов, ранее опыта не было.
Да, тут явно что-то пошло не так. Скинь в личку этот дамп и токен, попробую расшифровать у себя на компе.
За это сообщение автора skysilver поблагодарил:
Dicont (Вс янв 21, 2018 1:34 am)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
shawk
Сообщения: 8
Зарегистрирован: Вт янв 09, 2018 10:26 pm
Благодарил (а): 8 раз
Поблагодарили: 3 раза

Re: [Модуль] Xiaomi miIO

Сообщение shawk » Сб янв 20, 2018 10:36 pm

итак, лампа yeelink.light.bslamp1
--info выдает такое:
СпойлерПоказать
{"result":{"life":22126,"token":"d.......2","mac":"78:11:DC:8F:AA:AA","fw_ver":"1.5.4_160","hw_ver":"MTK7697","uid":"1594400630","model":
"yeelink.light.bslamp1","wifi_fw_ver":"4.3.0","ap":{"rssi":-73,"ssid":"XXXX","bssid":"AA:AA:AA:AA:AA:AA"},"netif":{"localIp":"192.168.1.67","mask":"255.255.255.
0","gw":"192.168.1.1","gw_mac":"AA:AA:AA:AA:AA:AA"},"mmfree":68968},"id":2}
вот немного трафика:
СпойлерПоказать
{"id":8316,"method":"get_prop","params":["power","color_mode","bright","ct","rgb","flowing","pdo_status","hue","sat","save_state","flow_params","nl_br","nighttime","miband_sleep"]}
{"result":["off","1","1","4000","16750592","0","","36","100","1","0,0,1000,1,16711680,100,1000,1,65280,100,1000,1,255,100","0","enable|220000|060000|00","1"],"id":8316}
{"result":[],"id":8317}
{"result":[],"id":8318}
{"result":["off","1","1","4000","16750592","0","","36","100","1","0,0,1000,1,16711680,100,1000,1,65280,100,1000,1,255,100","0","enable|220000|060000|00","1"],"id":8319}
{"result":["off","1","1","4000","16750592","0","","36","100","1","0,0,1000,1,16711680,100,1000,1,65280,100,1000,1,255,100","0","enable|220000|060000|00","1"],"id":8320}
{"result":["on","1","1","4000","16750592","0","","36","100","1","0,0,1000,1,16711680,100,1000,1,65280,100,1000,1,255,100","0","enable|220000|060000|00","1"],"id":8322}
{"id":8323,"method":"set_power","params":["on","smooth",500,1]}
{"result":["ok"],"id":8323}
{"result":["ok"],"id":8324}
{"result":["ok"],"id":8325}
{"result":["ok"],"id":8326}
{"result":["ok"],"id":8327}
{"result":["ok"],"id":8328}
{"result":["ok"],"id":8329}
{"id":8330,"method":"set_power","params":["off"]}
{"result":["ok"],"id":8330}
{"result":["off","1","1","4000","16750592","0","","36","100","1","0,0,1000,1,16711680,100,1000,1,65280,100,1000,1,255,100","0","enable|220000|060000|00","1"],"id":8331}
Перехватывал через WiFi, так что не все пакеты поймал...
Трафик шифруется.
На лампе через блютус висит 4 гидротермографа, их признаков в трафике пока не увидел. Присутствует трафик с китайским сервером, по большей части дублирует имеющийся, но на другом ключе, так что не расшифровался.
Еще, наверное, это нужно?
devicetype: 047e
serial: 2d87
За это сообщение автора shawk поблагодарил:
skysilver (Сб янв 20, 2018 11:45 pm)
Рейтинг: 1.16%
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: [Модуль] Xiaomi miIO

Сообщение skysilver » Вс янв 21, 2018 3:36 am

Обновление. Версия 1.1-beta.
  • Добавлена базовая поддержка Mi Internet Speaker [НЕ ПРОВЕРЕНО]:
    • получение текущего статуса и параметров (channel_title, current_state, hardware_version, play_mode, track_artist, track_duration, track_title, transport_channel, volume, rel_time);
    • команды (power, play, pause, toggle, next_channel, previous_channel, next_track, previous_track);
    • управление громкостью (vol_up и vol_down).
  • Добавлена базовая поддержка Yeelight Bedside Lamp [НЕ ПРОВЕРЕНО]:
    • получение текущего статуса и параметров (power, bright, ct, rgb, hue, sat, color_mode, flowing, pdo_status, save_state, flow_params, nl_br, nighttime, miband_sleep);
    • включение/выключение (power);
    • регулировка яркости (bright);
    • регулировка цветовой температуры (ct);
    • регулировка цвета (rgb).
  • Дополнены типы zigbee-устройств.
  • Обновлены изображения zigbee-устройств.
  • Добавлена проверка серийного номера и кода устройства на валидность.
  • Исправлен диапазон регулировки громкости радио на шлюзе (от 0 до 100).
yeelink.light.bslamp1.png
yeelink.light.bslamp1.png (3.87 КБ) 6021 просмотр
xiaomi.wifispeaker.v1.png
xiaomi.wifispeaker.v1.png (3.97 КБ) 6021 просмотр
Управление колонкой производится через привязку к параметру command свойства объекта и передачи ему через setGlobal следующих значений:
- power - включить/выключить (режим standby),
- play - запуск проигрывания,
- pause - остановка проигрывания,
- toggle - переключить состояние проигрывания,
- next_channel - следующая радиостанция,
- previous_channel - предыдущая радиостанция,
- next_track - следующий трек в плейлисте,
- previous_track - предыдущий трек в плейлисте.

Dicont, shawk, подключайтесь к тестированию. Проверяйте, отписывайтесь о результатах.

P.S. Не стесняемся подкинуть разработчику "на пиво", чтобы дело шло веселее. ;)
За это сообщение автора skysilver поблагодарили (всего 7):
ypiter2006 (Вс янв 21, 2018 11:59 am) • shawk (Вс янв 21, 2018 1:23 pm) • VooDooN (Вс янв 21, 2018 5:49 pm) • Gelezako (Вт янв 23, 2018 7:45 pm) • piton_78 (Вс фев 25, 2018 4:43 am) • VAD07 (Чт июн 06, 2019 12:23 am) • Peter (Пн сен 09, 2019 10:21 pm)
Рейтинг: 8.14%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Ответить