Автосмена темы и обоев на Windows: делаем красиво

Вчера Google выкатили апдейт Chrome OS, который вносит в систему темную тему оформления. Хотя еще 2018 году Apple представили macOS Mojave, одной из ключевых нововведений в которой стала темная тема и динамические обои. Фишка оказалась настолько бомбезной, и её добавили в iOS 13 через год. Вскоре темная тема появилась и в Android 10… И вроде бы все хорошо, но в Windows (более распространенной десктопной ОС) темная тема оформления появилась в 2016 году в Unniversary Update и до сих пор эту функцию не довели до ума. Итак, в этом гайде я расскажу как допилить темную тему, плюс как сделать динамические обои.

Пишем скрипт

Итак, как происходит изменение темы и обоев на Windows? Правильно, через реестр. Его мы можем редактировать через командную строчку или же через PowerShell. Через командную строку, сколько бы я не пробовал, мне не удалось что-либо изменить. Поискав на форумах нашел способы редактирования реестра через PowerShell. Итак, осталось найти где же хранятся записи для смены темы и обоев.

В данной записи реестра хранится путь к установленным обоям
А в этой записи хранится параметр, отвечающий за тему приложений

В папке HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize содержится несколько записей, AppsUseLightTheme отвечает за темы приложений, а SystemUsesLightTheme за систему (панель пуск и таскбар). По желанию мы можем менять темы системы и приложений.

Кстати говоря, вот здесь можно задать настройки

В PowerShell менять реестр для смены обоев можно следующим образом:

Set-ItemProperty -Path HKCU:\Control Panel\Desktop -Name wallpaper -Value $path

Где вместо $path указывается путь к файлу. А тему:

Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value $value -Type Dword -Force

Где вместо $value указывается 0 для темной темы, а 1 для светлой.

Эти настройки применяются при логине пользователя, так что чтобы после изменения записей реестра параметры считались нужно перезайти в систему или же запустить следующую строчку в PowerShell:

RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters ,1 ,True

Собираем скрипт

К сожалению последняя строчка срабатывает не с первого раза, так что запишем её в цикл. Ну и для удобства впишем предыдущие команды в отдельные функции:

Function Set-WallPaper($Value){
Set-ItemProperty -Path HKCU:\Control Panel\Desktop -Name wallpaper -Value $value
}
Function Set-Theme($Value){
Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value $value -Type Dword -Force
}
Set-WallPaper -value "path to your dark wallpaper"
Set-Theme -value 0 # dark theme
for ($i = 0; $i -lt 5; $i++) {
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters ,1 ,True
}
view raw dark.ps1 hosted with ❤ by GitHub

Собственно осталось автоматизировать процесс запуска данного скрипта. Можно было бы конечно два раза запускать один скрипт, который в зависимости от времени выбирал бы тему и обои, но у меня нет ни малейшего желания изучать как работать со временем в PowerShell. Так что напишем два скрипта, итак, второй скрипт для включения светлой темы:

Function Set-WallPaper($Value){
Set-ItemProperty -Path HKCU:\Control Panel\Desktop -Name wallpaper -Value $value
}
Function Set-Theme($Value){
Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value $value -Type Dword -Force
}
Set-WallPaper -value "path to your light wallpaper"
Set-Theme -value 1 # light theme
for ($i = 0; $i -lt 5; $i++) {
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters ,1 ,True
}
view raw light.ps1 hosted with ❤ by GitHub

Если при запуске скрипта у вас не всегда меняются обои, то стоит увеличить количество итераций в цикле (вместо 5 вписать 10 например)

Автоматизация запуска скрипта

Для того что бы автоматизировать весь процесс я воспользовался планировщиком заданий.

Планировщик можно найти в меню Пуск в папке Средства администрирования Windows
В планировщике жмем правую кнопку мыши, затем создать простую задачу…
Выбираем название
Триггер ставим на Ежедневно
В данном случае задача для переключения на темную тему и обои, по этому выбираем удобное время
Действие: запустить программу
В качестве программы выбираем интерпретатор PowerShell, а в качестве аргументов указываем путь к скрипту

На этом все, осталось создать такую же задачу для включения светлой темы и обоев. Все бы хорошо, но как говорится нет предела совершенству. При запуске задания на секунду появляется окно интерпретатора, а хотелось бы чуда. Я нашел скрипт для скрытого запуска PowerShell-скрипта. Вместо pathToYourScrpt.ps1 пишем путь к скрипту, придется создавать два VBScript файла для каждого PowerShell-скрипта:

Dim objShell,objFSO,objFile
Set objShell=CreateObject("WScript.Shell")
Set objFSO=CreateObject("Scripting.FileSystemObject")
'enter the path for your PowerShell Script
strPath="pathToYourScrpt.ps1"
'verify file exists
If objFSO.FileExists(strPath) Then
'return short path name
set objFile=objFSO.GetFile(strPath)
strCMD="powershell -nologo -command " & Chr(34) & "&{" &_
objFile.ShortPath & "}" & Chr(34)
'Uncomment next line for debugging
'WScript.Echo strCMD
'use 0 to hide window
objShell.Run strCMD,0
Else
'Display error message
WScript.Echo "Failed to find " & strPath
WScript.Quit
End If
view raw script.vbs hosted with ❤ by GitHub

В планировщике, вместо PowerShell.exe указываем путь к скрипту, не забываем очистить аргументы

На этом все! В интернете можно найти кучу парных обоев, часто это будут обои из macOS и iOS. Ссылка на этот проект на Githubе. Всем добра!

Источники

  1. https://www.androidcentral.com/chrome-os-finally-getting-dark-mode
  2. https://en.wikipedia.org/wiki/Android_10
  3. https://en.wikipedia.org/wiki/IOS_13
  4. https://en.wikipedia.org/wiki/MacOS_Mojave
  5. https://trashbox.ru/topics/101690/yubilejnoe-obnovlenie-windows-10-obzor-novovvedenij#chapter-4
  6. https://docs.microsoft.com/ru-ru/powershell/scripting/learn/ps101/09-functions?view=powershell-7
  7. https://social.technet.microsoft.com/Forums/ie/en-US/72a9b4bf-071b-47cd-877d-0c0629a9eb90/how-change-the-wallpaperbackground-with-a-command-line-?forum=w7itproui
  8. https://levashove.ru/temnaya-tema-interfejsa-windows-10-ruchnoe-i-avtomaticheskoe-vklyuchenie/
  9. http://web.archive.org/web/20070216074902/http://blog.sapien.com/current/2006/12/20/schedule-hidden-powershell-tasks.html

Атакуем social-media или как автоматизировать репост в соцсети на примере Telegram

Мой блог работает на WordPress, и здесь как и в большинстве сайтов небольшой трафик, почему так происходит? Большая часть трафика сейчас приходится на мобильные устройства. Кроме того, большая часть мобильного трафика исходит из мобильных приложений — клиентов соцсетей и мессенджеров. Крупные компании и организации давно ведут свои соцсети, обновляя свои сайты только важной информацией. К примеру в КФУ на сайте имеется довольно много статичных данных: информация о преподавателях, учебные программы, время работы и адреса подразделений и тд. Большая часть новостей постится в сообществах ВКонтакте.

Статистика распределения трафика via gs.statcounter.com

Увеличению мобильного трафика способствует два крупных фактора: увеличение количества мобильный устройств и человеческая лень (нам легче тапнуть по иконке приложения, чтобы получить контент, нежели набирать название сайта в поисковой строке). Что бы там ни было, сегодня расскажу как я пытался автоматизировать репост в соцсети и что из этого вышло

Встроенные средства репоста WordPress

Если вы покупаете подписку, то WP предоставляет обширную базу все различных плагинов, среди которых можно найти плагины для репоста в нужные вам сети. Ну а если вы пользуетесь бесплатной версией, как и я, то в WP есть встроенные средства интеграции с соцсетями. Настройки расположены во вкладке Инструменты -> Маркетинг -> Подключения. Можно так же просто wordpress.com/marketing/connections/ и доменное имя сайта. К сожалению WP публикует лишь начало поста и ссылку на нее.

В WP можно подключить Facebook Pages, Twitter, LinkedIn и Tumblr

Набор доступных соцсетей весьма скуден, что делать если я, к примеру, захочу репостить посты в Telegram канал?

Репост в Telegram

Конечно никто не мешает копировать весь материал и оформлять его в виде поста в канале, но это же скучно, да к тому же можно автоматизировать. Когда я вел свой блог в Telegram (в 2016 году), существовало несколько платформ бот-менеджеров (Manybot, Chatfuel), а так же множество ботов репостеров с WP или RSS. К сожалению Manybot и Chatfuel мертвы, боты репостеры тоже, большинство существующих платформ платные либо не могут парсить WP-сайты. До сих пор жив IFTTT, скорее всего из-за того что поддерживается средствами Telegram Inc.

Логика сервиса крайне проста, выбираем событие триггер, и действие.

Начать работу с сервисом крайне легко, регистрируемся, логинимся в необходимые сервисы, и создаем апплет. Для работы в Telegram нужно запустить официальный бот @IFTTT, и добавить его в свой канал как администратор. На сайте IFTTT можно настроить структуру отправляемого сообщения в Telegram.

Но к сожалению, почему-то репост в телеграм в нем работает криво, и текст кодируется в URL-encoding.

Я думал что это скорее всего на стороне WP, не найдя там настроек кодировки решил попробовать RSS. Да в WP есть RSS-лента, к слову большинство CMS тоже поддерживают RSS. Ссылка на RSS в WP: доменное имя сайта /feed/ .

К примеру ссылка на RSS моего блога:

https://keepeasy.tech.blog/feed/

Но RSS тоже не заработал, и к тому же RSS проверяется раз в час на предмет новых данных.

Кстати IFTTT хорошо справился с репостом в Facebook Pages, Даже текст отформатировал.

Instant View

Я решил не сдаваться и протестировать отправку ссылок на пост, вместо текста поста и все заработало. Но учитывая то, что вероятность перехода по ссылке на внешний сайт весьма мала, и именно из-за этого в Telegram ввели Instant View, я попытался сделать свой шаблон парсинга блога, так как изначально мой блог не поддерживал Instant View. Добавить свой шаблон не сложно, открываем страницу создания своих . Вставляем страницу, наподобие которой будет отслеживать Instant View.

Страница редактирования шаблона

Минимальный шаблон состоит из полей title и body. С помощью оператора @remove можно удалить с Preview нежелательные объекты, к примеру я удалил блок комментариев и лайков с WP. Подробнее можно почитать в документации. Если вы не знакомы со структурой сайта для которого пишете шаблон, то можете воспользоваться инструментами разработчика вашего браузера (на Chromium-подобных браузерах горячая клавиша — F12).

Итак, чтобы начать пользоваться шаблоном, нужно привести вашу ссылку на пост к следующему виду:

https://t.me/iv?url={{ссылка на пост}}&rhash={{хэш шаблона}}

Хеш шаблона, да и всю подобную ссылку можно получить нажав на кнопку View in Telegram наверху справа.

Ну а дальше можно встроить свой шаблон Instant View прямо в IFTTT, для этого в шаблоне сообщения Telegram необходимо вставить ссылку полученную на сайте Instant View вместо ссылки поста указать поле {{PostUrl}}. Не забываем включить предпросмотр ссылок (web page preview).

Вот так выглядит мой шаблон

На этом всё, прикрепляю использованные ресурсы: