Выключение ПК и перезагрузка системы с помощью TweetMyPC

В этой статье я опишу, как можно дистанционно выключать ПК, а также перезагружать систему или завершать сеанс работы с ней, используя Twitter API в программе на VB.net.

Введение

У меня дома очень медленное подключение к Интернету. Я решил написать приложение, позволяющее выключать мой домашний ПК дистанционно, находясь вне дома. Я оставлял компьютер включенным для загрузки нужных мне файлов и хотел иметь возможность выключать его удаленно. Я решил применить не клиент-серверную архитектуру, а Twitter API и передавать команды с помощью «My Timeline». Один из аргументов в пользу Twitter — возможность работы с мобильным телефоном. Искать подключенный к Интернету компьютер в этом случае нет необходимости.

Инфраструктура Yedda Twitter

Методы Twitter REST API (EN) предоставляют разработчикам базовые возможности работы с данными Twitter: обновление расписаний, обработка данных состояния и пользователя. Подключиться к Twitter и получить пользовательское расписание, используя .NET, очень просто. Однако я решил не изобретать колесо и использовать существующую библиотеку Twitter. Лучшая библиотека Twitter с открытым исходным текстом — это Yedda. Вы можете познакомиться с ней ближе и загрузить ее c домашней страницы (EN).

Конструирование интерфейса

Мне хотелось сделать интерфейс как можно более простым. Ниже показан снимок экрана интерфейса TweetMyPC, включающего лишь два текстовых поля, один флажок, метку и кнопку.

clip_image002

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

  • форма: frmTweetMyPc;
  • текстовые поля: txtUserName, txtPassword;
  • кнопка: btnSave;
  • флажок: chkStartAutomatic;
  • таймер: tmrTweet (интервал 10000);
  • метка: lblSatus.

Для хранения информации пользователя применяются несколько свойств My.settings (EN). Эти свойства показаны ниже.

clip_image004

Программа

Следующий код сворачивает форму при загрузке программы и запускает таймер с тем, чтобы каждую минуту проверять сообщения Twitter.

    1: Me.WindowState = FormWindowState.Minimized
    2: Me.ShowInTaskbar = False
    3: tmrTweet.Enabled = True

Следующий код, содержащийся в обработчике события Click кнопки, проверяет реквизиты Twitter (имя пользователя и пароль) и сохраняет их в My.Settings.

    1: If txtUserName.Text.Trim = "" Then
    2:     lblSatus.Text = "Please enter Twitter Username"
    3:     txtUserName.Focus()
    4:     Exit Sub
    5: End If
    6: If txtPassword.Text.Trim = "" Then
    7:     lblSatus.Text = "Please enter Twitter Password"
    8:     txtPassword.Focus()
    9:     Exit Sub
   10: End If
   11:  
   12: lblSatus.Text = ""
   13:  
   14:  
   15: 'Проверка допустимого имени пользователя и пароля и их сохранение
   16: Dim objTwitter As New Yedda.Twitter
   17: Dim Updates As XmlDocument
   18:  
   19: Try 'Пытаемся зарегистрироваться
   20:     Updates = objTwitter.GetUserTimelineAsXML(txtUserName.Text.Trim, txtPassword.Text.Trim)
   21:     My.Settings.UserName = txtUserName.Text.Trim
   22:     My.Settings.Password = txtPassword.Text.Trim
   23:     Me.WindowState = FormWindowState.Minimized
   24:     Me.ShowInTaskbar = False
   25:     tmrTweet.Enabled = True
   26: Catch ex As Exception
   27:     MsgBox("Failed to Login to Twitter with the values supplied. Please check your login details.")
   28:     txtUserName.Focus()
   29:     Exit Sub
   30: End Try

Для проверки имени пользователя и пароля при регистрации в Twitter используется библиотека Yedda. Надпись lblSatus применяется для отображения сообщений об ошибках.

Чтобы данное приложение начинало работу при запуске Windows, обработчик события CheckChanged флажка содержит следующий код, добавляющий необходимые разделы реестра.

    1: If chkStartAutomatic.Checked = True Then       My.Settings.AutomaticStart = True
    2:       Dim regKey As RegistryKey
    3:       regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    4:       regKey.SetValue(Application.ProductName, Application.ExecutablePath)
    5:       regKey.Close()
    6: Else
    7:       My.Settings.AutomaticStart = False
    8:       Dim regKey As RegistryKey
    9:       regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
   10:       regKey.DeleteValue(Application.ProductName)
   11:       regKey.Close()
   12: End If

Следующий код, содержащийся в обработчике таймера, каждую минуту проверяет расписание Twitter и в зависимости от текста твита выключает ПК, перезагружает его или завершает сеанс текущего пользователя.

    1: If My.Settings.UserName.Trim = "" Then
    2:     Exit Sub
    3: Else
    4:     'Проверяем наличие нового твита 
    5:     Dim objTwitter As New Yedda.Twitter
    6:     Dim Updates As XmlDocument
    7:     Dim node As XmlNode
    8:     Try 'пытаемся зарегистрироваться
    9:         Updates = objTwitter.GetUserTimelineAsXML(My.Settings.UserName.Trim, My.Settings.Password.Trim)
   10:         Catch ex As Exception
   11:         MsgBox("Error : Failed to Login to Twitter with the values supplied. Please check your login details.")
   12:         Exit Sub
   13:     End Try
   14:     Try
   15:         node = Updates.SelectSingleNode("/statuses/status/id")
   16:         If node.InnerText.Trim <> My.Settings.LastID.Trim Then 
   17:             ' Сравниваем Tweet ID для обнаружения новых твитов
   18:             My.Settings.LastID = node.InnerText.Trim
   19:             node = Updates.SelectSingleNode("/statuses/status/text")
   20:             ProcessTweet(node.InnerText.Trim)
   21:           End If
   22:     Catch ex As Exception
   23:         Exit Sub
   24:     End Try
   25: End If

Если есть новый твит, обрабатываем его.

    1: Private Sub ProcessTweet(ByVal Tweet As String)
    2:     If Tweet = "Shutdown" Then
    3:         System.Diagnostics.Process.Start("shutdown", "-s -f -t 100") 'Выключение
    4:     ElseIf Tweet = "Logoff" Then
    5:         System.Diagnostics.Process.Start("shutdown", "-l -f -t 100") 'Завершение сеанса пользователя
    6:     ElseIf Tweet = "Restart" Then
    7:         System.Diagnostics.Process.Start("shutdown", "-r -f -t 100") ' Перезагрузка
    8:     End If
    9: End Sub

В полосе контекстного меню есть два элемента: Edit Setting (изменение параметров) и Exit (выход).

clip_image002[4]

Следующий код содержится в обработчике события Client элемента Edit Settings и в обработчике события двойного щелчка мыши для значка области уведомлений.

    1: tmrTweet.Enabled = False
    2: txtUserName.Text = My.Settings.UserName.Trim
    3: txtPassword.Text = My.Settings.Password.Trim
    4: If My.Settings.AutomaticStart = True Then chkStartAutomatic.Checked = True
    5: Me.WindowState = FormWindowState.Normal
    6: Me.ShowInTaskbar = True

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

Программа в действии
Завершение

Несмотря на свою простоту, TweetMyPC имеет большой потенциал. Подумайте о выключении телевизора или стиральной машины через Twitter. Это можно сделать с помощью немногочисленных аппаратных средств и простой .NET-программы. TweetMyPC — бесплатная программа с открытым исходным текстом. Вы можете загрузить ее исходный код и добавить к ней новые функции.

Об авторе

Шобан Кумар (Shoban Kumar) — ведущий программист в Allianz Cornhill India. Программирование — его страсть. Он пишет статьи по .NET в https://www.dotnetcurry.com/ (EN), участвует в работе stackoverflow (EN), а также выступает на собраниях групп пользователей Microsoft (EN). Вы можете следить за ним в Twitter (EN).