Перейти к содержимому

Лидеры


Популярный контент

Показан контент с высокой репутацией 05.09.2019 во всех областях

  1. 1 балл
    Некоторое время назад я публиковал программку - интернет-мост Stem. Он очень простой в использовании, но к сожалению пока не лишен некоторых глюков. А кроме того, у него есть недокументированные возможности. Предлагаю сейчас поиграться с одной такой тайной фичей. Это будет интересно тем, кто немного знаком с HTML/CSS/JavaScript. В чём суть? Всё просто. У Stem есть веб-клиент. То есть если вы зайдете по адресу https://stem.fomalhaut.me (например), вы увидите окно, которое пригласит вас ввести ID канала и початиться прямо с сайта. После ввода ID канала, вас перекинет на страничку с "чатом", где вы сможете посылать сообщения вашему компьютеру/роботу в майнкрафте. Адрес этой странички будет выглядеть примерно так: https://stem.fomalhaut.me/channel?id=test Где test это ID вашего канала. Когда робот будет вам отвечать, это будет видно в логе. Примерно так: А теперь - тайная фича. Находясь на страничке канала, как на скриншоте, вы можете приписать к адресу дополнительный флаг: &render=true. Полный адрес станет выглядеть примерно так: https://stem.fomalhaut.me/channel?id=test&render=true И начиная с этого момента, все входящие сообщения от компьютера в OpenComputers будут не отрисовываться в лог, а попадать в JS функцию eval(...). Что это значит? Те кто имел дело с JS уже наверное поняли все последствия. Но я поясню. Это значит, что компьютер OpenComputers может прислать сообщение с JS кодом, и сайт Stem этот код выполнит. А это значит, что вы можете творить на сайте вообще всё что угодно. Вы можете удалить интерфейс, показать вместо него новый, скачать что-то с инета, запустить игрушку... да хоть майнить крипту. Поиграем Ничего вредоносного мы делать конечно сейчас не будем. Вместо этого, традиционно, попробуем сделать так, что сайт Stem превратится в сайт для управления светом в нашем доме в Майнкрафте. Шаг первый. Подготовим дом. Тут всё просто - стандартный компьютер, с интернет картой, от него кабель к I/O блоку, а на блоке - подопытная лампа. На компьютер ставим Stem. Например, ставим HPM такой командой, pastebin run vf6upeAN И потом пишем: hpm install stem Нажимаем Enter и готово. Шаг второй. Нам нужен сайт. Усложнять не будем, и наш революционный дизайн будет выглядеть так: Что нам нужно сделать, чтобы сайт Stem превратился в то что нам надо? Методом тыка, через консоль браузера определяем, что достаточно выполнить такой код: document.body.innerHTML = " <style>button:active { background: #fac700; }</style> <button onclick=\"sendMessage(\'toggle\')\">Toggle Light</button> "; document.body.style.alignItems = "center"; Первой строкой мы просто заменяем всё содержимое тега <body> на то что нам надо. Я добавил еще немного косметики в виде стиля для кнопки. Вторая строка - тоже косметика, я просто поправил стиль на теге <body> чтобы кнопочка была посередине. Один важный ньюанс - на кнопке повешено свойство onclick с кодом sendMessage("toggle"). Таким образом, когда пользователь тыкнет по кнопке, мы отправим сообщение обратно в OpenComputers. Функцию sendMessage нам дает веб-клиент Stem. Ей можно безвозмездно пользоваться в своих целях. Шаг третий. Соединяем это все вместе. Теперь надо набросать программку для нашего компьютера в Майнкрафте, чтобы он выслал подготовленную JS-"бомбу" по нашему сигналу. Эники, беники... выходит что-то такое: local event = require('event') local stem = require('stem') local side = require('sides') local com = require('component') local redstone = com.isAvailable('redstone') and com.redstone or nil local channel = "test" local layout = [===[ document.body.innerHTML = "\ <style>button:active { background: #fac700; }</style>\ <button onclick=\"sendMessage(\'toggle\')\">Toggle Light</button>\ "; document.body.style.alignItems = "center"; ]===] local lampSide = side.top local lampTurnedOn = false print("Connecting to the #" .. channel .. " STEM channel...") local server = stem.connect('stem.fomalhaut.me') server:subscribe(channel) print("Done.") print("Press [q] to quit.") while true do local name, a, b = event.pull() if name == "stem_message" then local message = b if message == "connect" then print("Someone wants to connect - sending the layout...") server:send(channel, layout) elseif message == "toggle" then if redstone ~= nil then if not lampTurnedOn then redstone.setOutput(lampSide, 16) lampTurnedOn = true else redstone.setOutput(lampSide, 0) lampTurnedOn = false end end end elseif name == "key_down" then local char = b if char == 113 then break end end end server:disconnect() Я думаю тут большая часть очевидна и понятна. Мы подключаемся к серверу Stem, подписываемся на нужный канал и внимательно слушаем входящие сообщения. Когда пользователь присылает сообщение connect, мы отправляем ему подготовленный код, который мирно лежит в переменной layout. Этот код прилетит к пользователю, и, если пользователь смотрит страницу с включенной опцией render=true, код сработает и перерисует страницу. Если опция будет отключена - он просто увидит код в логе, как простое сообщение. Шаг четвертый. Тестируем. Откроем наш канал по ссылке: https://stem.fomalhaut.me/channel?id=test&render=true Появится пустой лог. Запустим программу в OpenComputers. Она отрисует наше приветствие, что-то вроде: Сonnecting to the #test STEM channel... Done. Press [q] to quit. Теперь пишем на сайте команду connect. Если мы все сделали правильно, и Stem не заглючил, интерфейс сайта исчез, и вместо него появилась наша кнопка. Нажимаем её. Вуаля! Дома зажегся свет. Постскриптум Это конечно же недокументированная хакерская фича, которую можно считать альфа-версией. Кроме того в Stem сейчас есть неуловимый баг, из за которого сообщения иногда не доходят. Не пугайтесь. Если кто-нибудь предоставит мне сценарий (прямо по шагам), при котором 100% срабатывает баг - буду очень рад и пофиксить его будет легче. С помощью описанной фишки можно придумать много хрени. Я показал самое простое что пришло в голову. Уверен, ваша фантазия будет покруче моей ) Пишите баг-репорты или пожелания по фиче, да и просто комменты в эту тему, либо мне в любой канал связи, где я онлайн.
  2. 1 балл
    Я как-то делал. Но оно, по моему, слишком тяжелое для любых задач на ОС. Так что, только чисто поиграться.
  3. 1 балл
    Видел я на хабре пост четырёхлетней давности о включении лампы(в реальном мире) из майнкрафта. Вот он, если что: https://habr.com/ru/post/271527/ Тут я подумал - "А чем я собственно хуже? Почему нельзя контроллировать температуру реактора/дроноферму/дом датчиками движением?" Переходим к практике. Я имею вот такой дисплей купленный в поднебесной(За всеми ссылками и подробной помощью если заинтересуетесь обращаться в личку) Так же, я обладаю платой NodeMcu Lolin V3(Если грубо - это ардуинка с вай-файкой, но нет, это самостоятельный чип esp8266) В общем это всё, что нам сейчас понадобится(Еще понадобится роутер (и белый айпи, если вы играете на сервере)) Я хочу контролировать температуру своего реактора из IC2(но пристроить можно всё что угодно), поэтому берём его. Как это выглядит в игре: Схема реактора(Хотя ничего особо интересного тут нет): Переходим к реальному миру. Нам нужно открыть порт, в моём случае это 4536, к тому же нам нужен постоянный адрес в интернете. Для этого я использую DDNS. Об этом и остальном можно узнать в гугле. Теперь, всё готово чтобы наконец-то смотреть температуру реактора из реально мира! Есть такой простой код(Сейчас говорим про реальный мир): --Если кому будет интересно, вот полная документация по прошивке NodeMcu: https://nodemcu.readthedocs.io/en/master/ wifi.sta.config({ssid = "Xiaomi_2.4G", pwd = "xBfYHR33Le"}) --Мой SSID и пароль моего wi-fi =D wifi.sta.autoconnect(1) --Автоподключение Wi-Fi wifi.setmode(wifi.STATION) --Сейчас ESP8266 Будет работать в режиме клиента) spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8) --Настройка дисплея oled = u8g2.ssd1309_128x64_noname0(1, 8, 4, 0) oled:setFont(u8g2.font_haxrcorp4089_t_cyrillic) --Выставляем шрифт oled:setContrast(255) --Контрастность дисплея) server = net.createServer(net.TCP, 30) --Создаём сервер с тайм-аутом в 30 секунд по TCP протоколу function receiver(socket, temp) --Функция, которая вызывается при подключении oled:clearBuffer() --Очищаем буфер oled:drawUTF8(1, 7, "Темп. Реактора: " .. temp .. "%") --Пишем oled:sendBuffer() --Уже рисуем socket:close() --Разрываем подключение end server:listen(4536 , function(conn) --Выставляем на прослушку порт 4536 conn:on("receive", receiver) end) wifi_check = tmr.create() --Создаём динамический объект таймера wifi_check:alarm(1000, 1, function() --Эта функция - аналог event.timer в OpenComputers, которая так же вызывает функцию. В данном случае мы каждую секунду проверяем Wi-Fi. if not wifi.sta.getip() then --Если мы не имеем айпи, тогда wifi_connect = false oled:clearBuffer() --Очищаем буфер oled:drawUTF8(1, 7, "Подключение к Wi-Fi...") --Пишем oled:sendBuffer() --Рисуем elseif not wifi_connect then --Если мы только что подключились и не получили температуру реактора, тогда рисуем просто текст без температуры wifi_connect = true oled:clearBuffer() --Очищаем буфер oled:drawUTF8(1, 7, "Темп. Реактора: ожидание...") --Пишем oled:sendBuffer() --Рисуем end end) Код в майнкрафте(Очень простой): local component = require("component") local internet = require("internet") local reactor = component.reactor while true do local connection = internet.open("ip", 4536) connection:write(string.sub(reactor.getHeat(), 1, 2)) connection:close() os.sleep(5) end Теперь посмотрим что получилось! Подключение к Wi-Fi: Ожидание температуры: Итог: В общем то тут довольно всё криво сделано, тут надо много чего доделать, на самом деле. Но в целом, работает же=) Мне кажется, что это очень круто(Жаль что всё это без чанклодеров так себе работает). Такие дела. P. s @cyber01 Я сидел в редакторе долго, появилась ошибка "Произошла ошибка конфигурации или сервера". Пришлось вручную редактировать всё=(
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...