Общение с ЖЖ из PowerShell: простейшая аутентификация, получаю текст поста (интерфейс «flat»), ч.3

Feb 02, 2023 08:33

Начало:
...
7. PowerShell: помещаем тело HTTP-ответа ЖЖ в хеш-таблицу (интерфейс «flat»)
8. PowerShell: помещаем тело HTTP-ответа ЖЖ в хеш-таблицу (интерфейс «XML-RPC»)
9. Общение с ЖЖ из PowerShell: простейшая аутентификация, получаю текст поста (интерфейс «flat»), ч.1
10. Общение с ЖЖ из PowerShell: простейшая аутентификация, получаю текст поста (интерфейс «flat»), ч.2

Окружение: операционная система «Windows 10», программа-оболочка «PowerShell» версии 7.

В предыдущем посте я получил в программе-оболочке «PowerShell» по сети по протоколу общения с ЖЖ на базе протокола HTTP(S) текст предпоследнего поста из своего второго журнала «vbgtut.livejournal.com». Однако, этот текст оказался перекодирован в процентную кодировку, которая используется в URL-адресах:

PS C:\> $params["events_1_event"]
%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D0%BE%D1%82%2014.04.2015%20%D0%B3.%20%D0%9D%D0%B0%20%D1%82%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD.%0D%0A%0D%0A%C2%AB%D0%9A%D0%B0%D0%BA%20%D1%83%D0%BF%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%20%D0%B2%20%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8%20%D0%B2%D0%B5%D1%87%D0%B5%D1%80%D0%B0%C2%BB%20%28%D1%81%29.%0D%0A%0D%0A%3Ca%20href%3D%22https%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F4608%2F102249717.9%2F0_de845_6a44b264_orig.jpg%22%3E%3Cimg%20src%3D%22https%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F4608%2F102249717.9%2F0_de845_6a44b264_orig.jpg%22%20width%3D%22900%22%20height%3D%22599%22%20%2F%3E%3C%2Fa%3E

Первый вопрос, который у меня возник: зачем это сделано?

К примеру, название поста и метки поста тоже набраны буквами русского алфавита, но оставлены в кодировке UTF-8 и получены без каких-либо проблем:

PS C:\> $params["events_1_subject"]
Закат
PS C:\> $params["prop_2_value"]
закат, набережная, залив, вечер

Причина этого объяснена в документации к функции «getevents», в пояснении к параметру «events_n_event» результата:

The nth event text itself. This value is first truncated if the truncate variable is set, and then it is URL-encoded (alphanumerics stay the same, weird symbols to %hh, and spaces to + signs, just like URLs or post request). This allows posts with line breaks to come back on one line.

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

Таким образом, параметр «events_1_event» всегда содержит строку без символов новой строки. Символы новой строки при процентной кодировке (если перекодированный текст имеет кодировку UTF-8) представляются последовательностью %0D%0A (CRLF, в операционных системах «Windows») или последовательностью %0A (LF, в Unix-подобных операционных системах). В блоке кода в начале поста я отметил последовательности символов новой строки красным цветом.

Для раскодирования полученной строки из процентной кодировки обратно в кодировку UTF-8 используем возможности платформы «.NET», классы которой, напомню, прекрасно доступны из программы-оболочки «PowerShell». Для этого я использовал метод «UrlDecode» класса «System.Web.HttpUtility»:

PS C:\> [System.Web.HttpUtility]::UrlDecode($params["events_1_event"])

Снимок от 14.04.2015 г. На телефон.

«Как упоительны в России вечера» (с).




Вот, наконец, мы и получили текст поста. Сравните с оригиналом.

Простейшая аутентификация с помощью хеш-суммы пароля

При простейшей аутентификации с помощью хеш-суммы пароля главная проблема - как в программе-оболочке «PowerShell» вычислить хеш-сумму пароля по алгоритму «MD5». Если не использовать сторонние библиотеки, то наиболее подходящий для этого командлет - «Get-FileHash». (Кому интересна эта тема, можете заглянуть вот в этот вопрос на сайте «Stack Overflow», там люди предлагают десяток интересных способов решения этой задачи.)

В документации к командлету «Get-FileHash» я обратил внимание на пример 4, который называется «Compute the hash of a string» (вычисление хеш-суммы строки). В объяснении к этому примеру там сказано следующее:

PowerShell does not provide a cmdlet to compute the hash of a string. However, you can write a string to a stream and use the InputStream parameter of Get-FileHash to get the hash value.

Я взял код из этого примера, немного подправил, оформил в функцию и вот что у меня получилось:

function getHash($str, $alg) {
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write($str)
$writer.Flush()
$stringAsStream.Position = 0
(Get-FileHash -InputStream $stringAsStream -Algorithm $alg).Hash
}

Как видно из блока кода выше, командлет «Get-FileHash» имеет параметр «-Algorithm», в который можно записать одно из пяти возможных значений: SHA1, SHA256 (по умолчанию), SHA384, SHA512 и MD5. Таким образом, полученная выше функция может вычислить хеш-сумму заданной строки по одному из пяти алгоритмов. Впрочем, нам требуется вычислить хеш-сумму только по алгоритму «MD5».

Вычислим хеш-сумму пароля (ниже я вместо настоящего пароля использую слово «пароль», поэтому и хеш-сумма в этом примере будет именно для слова «пароль»; при проведении эксперимента, очевидно, в этом месте следует вставить реальный пароль и получить хеш-сумму именно для реального пароля):

PS C:\> getHash "пароль" "MD5"
E242F36F4F95F12966DA8FA2EFD59992

Теперь пробуем получить тот же один пост из того же журнала, но только используя для простейшей аутентификации входной параметр «hpassword» с хеш-суммой пароля вместо входного параметра «password» с паролем в открытом виде. Вот какой у меня получился набор команд в командной строке:

PS C:\> $body = @{
>> mode = "getevents"
>> user = "vbgtut"
>> hpassword = "E242F36F4F95F12966DA8FA2EFD59992"
>> selecttype = "one"
>> itemid = "148"
>> ver = "1"
>> }
PS C:\> $Response = Invoke-WebRequest -URI "https://www.livejournal.com/interface/flat" -Body $body -Method "POST"
PS C:\> $params = toHash($Response.Content)
PS C:\> $params["events_1_url"]
https://vbgtut.livejournal.com/37952.html

Как видно из блока кода выше, всё сработало так, как я и планировал. Пост успешно получен. Я вывел только один из параметров результата (параметр «events_1_url», содержащий постоянную ссылку на данный пост), чтобы убедиться в получении поста. Все остальные параметры результата (в том числе и текст поста), конечно же, тоже получены.

Более безопасные способы аутентификации я постараюсь разобрать в следующих постах.

Инструмент, Образование, Сайтостроение, Программирование, Английский язык, ЖЖ

Previous post Next post
Up