https://habr.com/ru/post/497620/- JavaScript
- Google Chrome
- Умный дом
- Будущее здесь
Беда, товарищи!
Дети (~10 лет) перешли на удаленное обучение, расселись по комнатам с компьютерами и не могут сосредоточиться на уроках!
Они добавлены в
google families,
microsoft family, время за компьютером ограничено, а взрослые сайты убраны через
opendns. Но чуть что — и даже прямо во время zoom-конференции урока ребенок начинает смотреть youtube. А потом училка дает домашнее задание — посмотреть видео и написать сочинение. И видео — тоже на youtube. Без ручной модерации не обойтись.
Под катом пишем волшебный пендаль, а именно chrome plugin, который отправляет каждый открываемый сайт в telegram злому родителю, работающему в соседней комнате.
Бот
Сначала сделаем telegram-бота и канал, в который будут приходить ссылки.
- Открываем BotFather, пишем /newbot, получаем botId (комбинацию из ~50 символов).
- Создаем новый канал, добавляем нашего бота туда как администратора.
- Пишем что-нибудь в канал, открываем ссылку https://api.telegram.org/botbotId/getUpdates, находим там result->channel_post->chat->id.
В итоге имеем
botId и
chatId.
Плагин
- Делаем папку, в ней будет 2 файла — manifest.json и index.js.
- Создаем chrome plugin manifest, по минимуму это:
{
"manifest_version": 2,
"name": "Url Telegram Logger",
"version": "1.0.0",
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": ["index.js"]
}
]
}
Здесь написано, что на любую страницу (matches: all urls) будет внедряться скрипт index.js.
- Пишем сам плагин. Так как сайты сейчас часто SPA, будем отслеживать изменение document.location.href. Это можно сделать через MutationObserver. А можно просто проверять по таймауту. Так же будем отправлять сообщение, когда сайт закрывается (жопу пореже от стула отрывать, хулиганье непослушное растет). В последнем случае мы не можем отправлять обычный асинхронный запрос (сайт закрывается, запрос отменяется). Поэтому будем использовать синхронный navigator.sendBeacon:
const settings = {
botId: '...',
chatId: '...',
userName: 'Matvey',
pollingInterval: 10000
}
const mutedUrls = [
'https://gmail.com',
'https://www.eduka.lt',
// ..все остальное, что всегда можно..
]
const sendMessage = (type, href) => {
if (mutedUrls.find(url => href.startsWith(url))) { return false }
const data = new FormData()
data.append('chat_id', settings.chatId)
data.append('text', `${settings.userName} ${type} ${document.title} ${href}`)
navigator.sendBeacon(
`https://api.telegram.org/bot${settings.botId}/sendMessage`,
data
)
}
let latestHref = null
let timeout = 0
const run = () => {
if (window.location.href !== latestHref) {
latestHref = window.location.href
sendMessage('opened', latestHref)
}
timeout && clearTimeout(timeout)
timeout = setTimeout(run, settings.pollingInterval)
}
window.addEventListener('load', run)
window.addEventListener('unload', () => sendMessage('closed', latestHref))
- Ставим плагин в хром на компьютер жертвы (перейти на chrome://extensions/, включить Developer mode, появится кнопка Load unpacked).
Заключение
20 минут потрачено, теперь можно потратить еще 20 часов, написать бекенд, настроить прием входящих команд (/mute url, /mute 2h url etc), добавить регистрацию, платные ежемесячные подписки, slack и hangouts ботов, а потом огрести за какие-нибудь права детей и персональных данных. Эти удовольствия оставляю читателю, у меня все.