PowerShell: помещаем тело HTTP-ответа ЖЖ в хеш-таблицу (интерфейс «flat»)

Jan 28, 2023 07:53

Начало:
1. Общение с ЖЖ из скрипта по протоколу HTTP(S), ч.1: документация
2. Общение с ЖЖ из скрипта по протоколу HTTP(S), ч.2: URL-адрес входа, интерфейсы
3. Выбор веб-клиента для общения с ЖЖ из скрипта, PowerShell, моделирование
4. PowerShell: особенности использования командлета «Invoke-WebRequest»
5. Общение с ЖЖ из скрипта по протоколу HTTP(S), ч.3: первая успешная связь

В предыдущем посте я описал, как осуществить связь с ЖЖ из программы-оболочки «PowerShell» версии 7 (я работаю в операционной системе «Windows 10») по протоколу общения с ЖЖ на базе протокола HTTP(S). Пример связи был продемонстрирован через интерфейсы «flat» и «XML-RPC».

В документации рекомендуется поместить данные из тела HTTP-ответа в хеш-таблицу (ассоциативный массив), так с ними будет удобнее работать. Вот что сказано в документации:

The ordering of the variable/value pairs does not matter. As you read them in, read them into a hash structure (associative array, dictionary, collection... whatever it's called in your language. Just a data structure that links one string variable key to another string variable value.).

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

$value = $hashTable["название_параметра"]

При использовании интерфейса «flat»

Напомню, в предыдущем посте я получил через интерфейс «flat» следующие данные:

PS C:\> $Response.Content
auth_scheme
c0
challenge
c0:1674766800:1054:60:ZmbOcwbxmdswLmKngEVl:3a50482295a65607685badc39b09d47b
expire_time
1674767914
server_time
1674767854
success
OK

В свойстве $Response.Content объекта $Response содержится объект класса «System.String», то есть то, что в программе-оболочке «PowerShell» обычно называют «строкой». Эта строка содержит в своем составе кроме букв, цифр и других символов еще так называемые «символы новой строки», благодаря чему один объект класса «System.String» оказывается расположен на нескольких строках окна программы-оболочки «PowerShell».

Можно заметить, что такая ситуация создает некоторую путаницу в терминологии: получается, что одна строка (объект класса «System.String») расположена на нескольких строках окна программы-оболочки «PowerShell». На английском языке такую строку называют «multiline string» и путаницы не создается благодаря использованию разных слов «line» и «string». А на русском получается масло масляное: «многострочная строка», хотя опытные программисты сразу понимают, о чем идет речь.

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

PS C:\> $content = $Response.Content
PS C:\> ConvertFrom-StringData -StringData $content -Delimiter "`n"
ConvertFrom-StringData: Data line 'auth_scheme' is not in 'name=value' format.

Я написал на языке PowerShell небольшую функцию, преобразующую строку в хеш-таблицу для нашего случая:

function toHash($str) {
$arr = $str -split '\r?\n'
$hash = @{}
for ($i = 0; $i -lt $arr.Length; $i += 2) {
$hash[$arr[$i]] = $arr[$i + 1]
}
return $hash
}

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

Я обсудил эту функцию на известном сайте «Stack Overflow»:

https://stackoverflow.com/questions/75253709/how-to-get-a-hashtable-in-powershell-from-a-multiline-string-in-which-keys-and-v

Результат работы описанной выше функции для нашего случая:

PS C:\> toHash($Response.Content)

Name Value
---- -----
expire_time 1674767914
challenge c0:1674766800:1054...
server_time 1674767854
success OK
auth_scheme c0

В блоке кода выше я сократил самое длинное значение, обозначив его остаток многоточием, потому что это значение не влезало в формат поста. Но, думаю, понятно, что в окне программы-оболочки «PowerShell» это значение можно рассмотреть полностью.

Теперь, если нам понадобится, скажем, значение параметра с названием «server_time», то мы можем получить его из хеш-таблицы следующим образом:

PS C:\> $hashTable = toHash($Response.Content)
PS C:\> $hashTable["server_time"]
1674767854

В следующем посте я попытаюсь сделать то же самое, что и в этом, но только для общения с ЖЖ через интерфейс «XML-RPC».

Продолжение следует.

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

Previous post Next post
Up