Сегодня мы рассмотрим кастомный скрипт и кастомную задачу средствами Powershell — Регистрация пользователя через API. Как уже неоднократно было сказано Powershell имеет весьма широкое применение. Давайте разбираться.
Windows Powershell — Регистрация пользователя через API
Как уже говорилось ранее, Powershell можно использовать практически везде. Все дело в том, что он многое умеет и на многое способен. И плюс ко всему технический склад ума обязателен поэтому уровень этой статьи выше, чем начинающий тестировщик/разработчик/devops/админ. Не будем ходить вокруг да около, опишу ситуацию:
Есть автотесты, которые выполняют определенные сценарии. Соответственно эти тесты ходят по различным вкладкам веб-приложения и тестируют функционал. Но для того, чтобы все это реализовать необходим пользователь. Руководством было принято решение при каждом деплое автотестового контура дропать бд, что автоматом выпиливало любого зарегистрированного ранее пользователя. Сначала было принято решение об обычном insert скрипте, который заносил бы во все необходимые таблицы данные о пользователе. Но ни разработчики, ни тестировщики не смогли реализовать сиквельный скрипт. К слову, продукт большой, имеет множество интеграций с другими продуктами внутри компании. Из двух девопсеров, задачка пала на меня.
Я стал размышлять, как проще это реализовать, и… Powershell + API. Меня почему-то не смутила трехфакторная регистрация. Я сразу был уверен, что смогу это реализовать. В итоге компиляция всех имеющихся навыков и представлений привела к рождению следующего скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
#Declare reg data# $body = '{ "email": "email@domain.ru", "password": "123456", "confirmPassword": "123456", "emailChecked": true }' $regUri = 'http://server.domain.loc/api/account/registration' $conType = 'application/json' $method = 'put' #Invoke first registration method# $json = (Invoke-WebRequest -Uri $regUri -Method $method -ContentType $conType -Body $body).Content | ConvertFrom-Json | Select-Object -Expand data #Parsing confirmation code and email, declare confirmation body# $confirmCode = $json.code $emailFromBody = ($body | ConvertFrom-Json).email $confirmBody = @{ email = $emailFromBody code = $confirmCode } #Declare confirmation url# $confirmationUri = 'http://server.domain.loc/api/account/checkCode/' + $emailFromBody + '/' + $confirmCode #Invoke confirmation method and getAccountInfo# $getAccountInfo = (Invoke-WebRequest -Uri $confirmationUri -Method post -ContentType $conType -Body $confirmBody) if ($getAccountInfo.RawContent.Contains("Content-Type: application/json; charset=utf-8")) { $parseAccInfo = $getAccountInfo.Content | ConvertFrom-Json | Select -Expand data #Agregate and save account info# $accountId = $parseAccInfo.account $confirmationId = $parseAccInfo.confirmation $orgShortName = "ГАЗПРОМ" <#Add big user data and finish registration#> $bigData = @{ organization = @{ orgShortName = "ПАО " + '"' + $orgShortName + '"' legalAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } postAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } factAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } consignee = "ПАО " + '"' + $orgShortName + '"' inn = "1234567890" kpp = "123456789" orgName = "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ГАЗПРОМ" accountId = $accountId cabinetId = 14 } boss = @{ firstName = "АЛЕКСЕЙ" lastName = "МИЛЛЕР" middleName = "БОРИСОВИЧ" phoneNumber = "9293333333" email = $emailFromBody dept = "ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ" phoneAdd = "null" } isContactMatchToBoss = "true" companyContact = @{ firstName = "АЛЕКСЕЙ" lastName = "МИЛЛЕР" middleName = "БОРИСОВИЧ" phoneNumber = "9293333333" email = $emailFromBody dept = "ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ" phoneAdd = "null" } isSuccess = "true" confirmation = $confirmationId postAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } factAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } legalAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } confirmationData = @{ account = $accountId confirmation = $confirmationId accountId = 0 email = $emailFromBody confirmationCode = $confirmCode inn = "1234567890" } companyViewModel = @{ isCompany = "true" inn = "1234567890" kpp = "123456789" ogrn = "1234567890123" ogrNip = "1234567890123" companyShortName = "ПАО " + '"' + $orgShortName + '"' companyFullName = "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ГАЗПРОМ" consignee = "ПАО " + '"' + $orgShortName + '"' phoneNumber = "9293333333" } } $jsonBigData = $bigData | ConvertTo-Json #Declare confirmation url# $finishRegUrl = 'http://server.domain.loc/api/account/confirmation' #Invoke-WebRequest with user data# Invoke-WebRequest -Uri $finishRegUrl -Method post -ContentType $conType -Body ([Text.Encoding]::UTF8.GetBytes($jsonBigData)) Write-Host "Registration successful!" } else { Write-Host "Abonent is already register." } |
Фух. Давайте по порядку.
Шаг первый — заявка на регистрацию
- Пойдем по шагам регистрации, отправка запроса на регистрацию. За нее отвечает этот кусок:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#Declare reg data# $body = '{ "email": "email@domain.ru", "password": "123456", "confirmPassword": "123456", "emailChecked": true }' $regUri = 'http://server.domain.loc/api/account/registration' $conType = 'application/json' $method = 'put' #Invoke first registration method# $json = (Invoke-WebRequest -Uri $regUri -Method $method -ContentType $conType -Body $body).Content | ConvertFrom-Json | Select-Object -Expand data |
$body — записываем json, в котором записаны первичные данные нового пользователя.
$regUri — адрес, к которому обратимся.
$conType — не обязательно, записываем в каком формате будет подача данных для метода.
$method — не обязательно, записываем тип метода, который хотим использовать.
$json — Сюда прописываем целую итерацию. Первая часть:
Invoke-WebRequest -Uri $regUri -Method $method -ContentType $conType -Body $body).Content — в этой строке мы обращаемся к методу, который указан у нас в переменной $regUri, сообщаем что используется метод put и тип контента json, и передаем тело запроса из переменной $body. При этом нас интересует только конкретная часть возвращаемого ответа. Поэтому мы весь запрос поместили в скобки и вытаскиваем из него только часть Content. В результате получаем такой ответ:
1 2 3 4 5 6 7 |
code : 6252 accountId : e7bd00cb-d2a2-4a0c-8f6c-24d8f4edd1ea confirmationId : c134d363-15e6-4d87-9964-bdf9568c2c09 redirectUrl : isUserExists : False isWrongPassword : False result : 0 |
Это уже обработанные данные, которые в далее мы применим на методе, который является вторым этапом регистрации пользователя.
Шаг второй — подтверждение регистрации
Необходимо сэмулировать ввод кода подтверждения. Сконфигурируем новый боди, а так же заберем email из прошлого body. Так же запишем код, строкой: $confirmCode = $json.code. Запишем необходимый нам адрес строкой:
$confirmationUri = ‘http://server.domain.loc/api/account/checkCode/’ + $emailFromBody + ‘/’ + $confirmCode
Как видите ссылка складывает из строки и двух переменных, собственно весь этот кусок выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#Parsing confirmation code and email, declare confirmation body# $confirmCode = $json.code $emailFromBody = ($body | ConvertFrom-Json).email $confirmBody = @{ email = $emailFromBody code = $confirmCode } #Declare confirmation url# $confirmationUri = 'http://server.domain.loc/api/account/checkCode/' + $emailFromBody + '/' + $confirmCode #Invoke confirmation method and getAccountInfo# $getAccountInfo = (Invoke-WebRequest -Uri $confirmationUri -Method post -ContentType $conType -Body $confirmBody) |
В $getAccountInfo — мы получили ответ от сервера, но он нам нужен не весь, плюс ко всему пора начинать вводить условие, зарегистрирован юзер уже или нет. Далее алгоритм такой — парсим нужные данные в нашем случае это снова Content. Расконвертируем их из json и выберем только компонент data. Таким образом мы сможем обратиться к отдельным элементам ответа, которые рассортированы по своим полям. Далее условие… Есть один единственный нюанс — если пользователь зарегистрирован, то ответ будет отличным от типа данных json. Соответственно на это и делаем проверку. Кодом:
1 2 3 4 5 6 7 8 9 10 |
#Invoke confirmation method and getAccountInfo# $getAccountInfo = (Invoke-WebRequest -Uri $confirmationUri -Method post -ContentType $conType -Body $confirmBody) if ($getAccountInfo.RawContent.Contains("Content-Type: application/json; charset=utf-8")) { $parseAccInfo = $getAccountInfo.Content | ConvertFrom-Json | Select -Expand data #Agregate and save account info# $accountId = $parseAccInfo.account $confirmationId = $parseAccInfo.confirmation |
Шаг третий — ввод данных пользователя
Окей, далее идет большой-большой json — объект, который необходимо отправлять чистым json. Но есть еще переменные, которые нам обязательно надо подставлять в json, иначе данные будут некорректны и мы не сможем пройти регистрацию. В объекте представлены ненастоящие данные:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
$orgShortName = "ГАЗПРОМ" <#Add big user data and finish registration#> $bigData = @{ organization = @{ orgShortName = "ПАО " + '"' + $orgShortName + '"' legalAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } postAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } factAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } consignee = "ПАО " + '"' + $orgShortName + '"' inn = "1234567890" kpp = "1234567890" orgName = "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ГАЗПРОМ" accountId = $accountId cabinetId = 14 } boss = @{ firstName = "АЛЕКСЕЙ" lastName = "МИЛЛЕР" middleName = "БОРИСОВИЧ" phoneNumber = "9293333333" email = $emailFromBody dept = "ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ" phoneAdd = "null" } isContactMatchToBoss = "true" companyContact = @{ firstName = "АЛЕКСЕЙ" lastName = "МИЛЛЕР" middleName = "БОРИСОВИЧ" phoneNumber = "9293333333" email = $emailFromBody dept = "ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ" phoneAdd = "null" } isSuccess = "true" confirmation = $confirmationId postAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } factAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } legalAddress = @{ fiasId = "" city = "Москва" street = "Наметкина" house = "16" postCode = "117420" regionCode = "77" region = "Москва" isCityRegion = "true" } confirmationData = @{ account = $accountId confirmation = $confirmationId accountId = 0 email = $emailFromBody confirmationCode = $confirmCode inn = "1234567890" } companyViewModel = @{ isCompany = "true" inn = "1234567890" kpp = "1234567890" ogrn = "1234567890" ogrNip = "1234567890" companyShortName = "ПАО " + '"' + $orgShortName + '"' companyFullName = "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ГАЗПРОМ" consignee = "ПАО " + '"' + $orgShortName + '"' phoneNumber = "9293333333" } } $jsonBigData = $bigData | ConvertTo-Json |
Последняя строка преобразует объект в правильный json и пишет результат в переменную. Далее забиваем адрес последнего этапа регистрации в переменную $finishRegUrl, и вызываем напрямую метод обращения к api:
1 2 3 4 5 6 7 8 9 10 |
#Declare confirmation url# $finishRegUrl = 'http://korriban.tst.loc/api/account/confirmation' #Invoke-WebRequest with user data# Invoke-WebRequest -Uri $finishRegUrl -Method post -ContentType $conType -Body ([Text.Encoding]::UTF8.GetBytes($jsonBigData)) Write-Host "Registration successful!" } else { Write-Host "Abonent is already register." } |
В блоке else нам выведется сообщение, если пользователь зарегистрирован. Если у вас остались вопросы — комменты открыты! Скрипт берите, пользуйте, адаптируйте под свои нужды. Спасибо за внимание и помните о нашем канале и группе в вк!
Я не думала что найду, спасибо большое!
Пожалуйста, пользуйтесь 🙂