diff --git a/README.md b/README.md index b35ad4e..4d3887c 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,8 @@ - [DSC](#dsc) - [Git](#git) - [Ansible](#ansible) +- [GigaChat](#GigaChat) +- [YandexGPT](#YandexGPT) # Help @@ -2774,9 +2776,10 @@ Start-PodeServer { # Selenium -`Invoke-Expression(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/Deploy-Selenium/rsa/Deploy-Selenium-Drivers.ps1")` установка всех драйверов и Chromium подходящей версии для драйвера -```PowerShell +`Invoke-Expression(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/Deploy-Selenium/rsa/Deploy-Selenium-Drivers.ps1")` установка всех драйверов и Chromium соответствующий версии для драйвера +``` $path = "$home\Documents\Selenium\" +$log = "$path\ChromeDriver.log" $ChromeDriver = "$path\ChromeDriver.exe" $WebDriver = "$path\WebDriver.dll" $SupportDriver = "$path\WebDriver.Support.dll" @@ -2784,35 +2787,68 @@ $Chromium = (Get-ChildItem $path -Recurse | Where-Object Name -like chrome.exe). Add-Type -Path $WebDriver Add-Type -Path $SupportDriver try { - $ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions - $ChromeOptions.BinaryLocation = $Chromium - $ChromeOptions.AddArgument("start-maximized") - $ChromeOptions.AcceptInsecureCertificates = $True - $Selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriver, $ChromeOptions) - $Selenium.Navigate().GoToUrl("https://translate.google.la/") + $ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions # создаем объект с настройками запуска браузера + $ChromeOptions.BinaryLocation = $Chromium # передаем путь до исполняемого файла, который отвечает за запуск браузера + $ChromeOptions.AddArgument("start-maximized") # добавляем аргумент, который позволяет запустить браузер на весь экран + $ChromeOptions.AcceptInsecureCertificates = $True # игнорировать предупреждение на сайтах с не валидным сертификатом + #$ChromeOptions.AddArgument("headless") # скрывать окно браузера при запуске + $ChromeDriverService = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($ChromeDriver) # создаем объект настроек службы драйвера + $ChromeDriverService.HideCommandPromptWindow = $True # отключаем весь вывод логирования драйвера в консоль (этот вывод нельзя перенаправить) + $ChromeDriverService.LogPath = $log # указать путь до файла с журналом + $ChromeDriverService.EnableAppendLog = $True # не перезаписывать журнал при каждом новом запуске + #$ChromeDriverService.EnableVerboseLogging = $True # кроме INFO и ошибок, записывать DEBUG сообщения + $Selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriverService, $ChromeOptions) # инициализируем запуск с указанными настройками + + $Selenium.Navigate().GoToUrl("https://google.com") + $Search = $Selenium.FindElements([OpenQA.Selenium.By]::Id('APjFqb')) + $Search = $Selenium.FindElements([OpenQA.Selenium.By]::XPath('//*[@id="APjFqb"]')) + $Search = $Selenium.FindElements([OpenQA.Selenium.By]::Name('q')) + $Search = $Selenium.FindElements([OpenQA.Selenium.By]::XPath('//*[@name="q"]')) + $Search = $Selenium.FindElements([OpenQA.Selenium.By]::ClassName('gLFyf')) + $Search = $Selenium.FindElements([OpenQA.Selenium.By]::CssSelector('[jsname="yZiJbe"]')) + $Search = $Selenium.FindElements([OpenQA.Selenium.By]::TagName('textarea')) | Where-Object ComputedAccessibleRole -eq combobox + $Search.SendKeys("calculator online") + $Search.SendKeys([OpenQA.Selenium.Keys]::Enter) - $buttons = $selenium.FindElements([OpenQA.Selenium.By]::TagName('button')) # найти все элементы по TagName - $buttons = $selenium.FindElements([OpenQA.Selenium.By]::CssSelector('button')) # найти все Button используя CSS selector - $Image = $buttons | Where-Object Text -Match "Изображения" # отфильтровать элементы по Label или Text - $Image.Click() # нажать на Button - $Text = $buttons | Where-Object Text -Match "Текст" - $Text.Click() - $textarea = $Selenium.FindElements([OpenQA.Selenium.By]::TagName("textarea")) # найти все элементы с тэгом textarea - $textarea.Count # количество найденных элементов - $text1 = $textarea | Where-Object ComputedAccessibleLabel -like "Исходный текст" # отфильтровать по Lable - $text1 = $textarea | Where-Object ComputedAccessibleRole -like combobox # отфильтровать по роли - $text1 = $selenium.FindElements([OpenQA.Selenium.By]::ClassName("er8xn")) # найти элемент по имени класса (class="") - $text1.SendKeys("Hello") # ввести текст в поле Start-Sleep 1 - $text2 = $selenium.FindElements([OpenQA.Selenium.By]::ClassName("ryNqvb")) - $out = $text2.Text # получить результат перевода из второго textarea - Write-Host $out -ForegroundColor Green + $div = $Selenium.FindElements([OpenQA.Selenium.By]::TagName("div")) + $2 = $div | Where-Object {($_.ComputedAccessibleRole -eq "button") -and ($_.ComputedAccessibleLabel -eq "2")} + $2.Click() + $2.Click() + $plus = $div | Where-Object {($_.ComputedAccessibleRole -eq "button") -and ($_.Text -eq "+")} + $plus.Click() + $3 = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="KN1kY"]')) + $3.Click() + $3.Click() + $sum = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="Pt8tGc"]')) + $sum.Click() + $result = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="VssY5c"]')).Text + Write-Host "Result: $result" -ForegroundColor Green } finally { $Selenium.Close() $Selenium.Quit() } ``` +### Selenium modules +```PowerShell +Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-GPT/Get-GPT.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-GPT" -ItemType Directory -Force)\Get-GPT.psm1" -Force +``` +`Get-GPT "Исполняй роль калькулятора. Посчитай сумму чисел: 22+33"` +```PowerShell +Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-Translation/Get-Translation.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-Translation" -ItemType Directory -Force)\Get-Translation.psm1" -Force +``` +`Get-Translation -Provider DeepL -Text "I translating the text"` \ +`Get-Translation -Provider DeepL -Text "Я перевожу текст"` \ +`Get-Translation -Provider Google -Text "I translating the text"` \ +`Get-Translation -Provider Google -Text "Я перевожу текст" -Language en` +```PowerShell +Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-SpeedTest/Get-SpeedTest.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-SpeedTest" -ItemType Directory -Force)\Get-SpeedTest.psm1" -Force +``` +`Get-SpeedTest -Provider Libre` \ +`Get-SpeedTest -Provider Open` \ +`Get-SpeedTest -Provider Ookla` + # IE `$ie.document.IHTMLDocument3_getElementsByTagName("input") | select name` получить имена всех Input Box \ @@ -4898,6 +4934,7 @@ Windows Registry Editor Version 5.00 ``` # Performance +`lodctr /R` пересоздать счетчиков производительности из системного хранилища архивов (так же исправляет счетчики для CIM, например, для cpu Win32_PerfFormattedData_PerfOS_Processor и iops Win32_PerfFormattedData_PerfDisk_PhysicalDisk) \ `(Get-Counter -ListSet *).CounterSetName` вывести список всех доступных счетчиков производительности в системе \ `(Get-Counter -ListSet *memory*).Counter` поиск по wildcard-имени во всех счетчиках (включая дочернии) \ `Get-Counter "\Memory\Available MBytes"` объем свободной оперативной памяти \ @@ -6282,3 +6319,184 @@ https://docs.chocolatey.org/en-us/guides/organizations/organizational-deployment # source: URL-адрес внутреннего репозитория source: https://community.chocolatey.org/api/v2/ChocolateyInstall.ps1 ``` +# GigaChat + +### 1. Установка сертификатов: + +`Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_root_ca.cer"` скачать сертификат минцифры \ +`Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_sub_ca.cer"` \ +`Import-Certificate -FilePath "$home\Downloads\russian_trusted_root_ca.cer" -CertStoreLocation "Cert:\CurrentUser\Root"` установить сертификат минцифры \ +`Import-Certificate -FilePath "$home\Downloads\russian_trusted_sub_ca.cer" -CertStoreLocation "Cert:\CurrentUser\CA"` + +### 2. Авторизация по Sber ID и генерация новых авторизационных данных для получения токена: https://developers.sber.ru/studio (время жизни 30 минут) + +### 3. Формирование авторизационных данных в формате Base64 из Client ID и Client Secret: +```PowerShell +$Client_ID = "7e6d2f9f-825e-49b7-98f4-62fbb7506427" # [System.Guid]::Parse("7e6d2f9f-825e-49b7-98f4-62fbb7506427") +$Client_Secret = "c35113ee-6757-47ba-9853-ea1d0d9db1ef" # [System.Guid]::Parse("c35113ee-6757-47ba-9853-ea1d0d9db1ef") +$Client_Join = $Client_ID+":"+$Client_Secret # объединяем два UUID в одну строку, разделяя их символом ':' +$Bytes = [System.Text.Encoding]::UTF8.GetBytes($Client_Join) # преобразуем строку в массив байт +$Cred_Base64 = [Convert]::ToBase64String($Bytes) # кодируем байты в строку Base64 +``` +### 4. Получение токена: + +`$Cred_Base64 = "N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="` \ +`$UUID = [System.Guid]::NewGuid()` генерируем UUID для журналирования входящих вызовов и разбора инцидентов +```PowerShell +$url = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth" +$headers = @{ + "Authorization" = "Basic $Cred_Base64" + "RqUID" = "$UUID" + "Content-Type" = "application/x-www-form-urlencoded" +} +$body = @{ + scope = "GIGACHAT_API_PERS" +} +$GIGA_TOKEN = $(Invoke-RestMethod -Uri $url -Method POST -Headers $headers -Body $body).access_token +``` +### 5. Параметры: +```PowerShell +[string]$content = "Посчитай сумму чисел: 22+33" +[string]$role = "user" # роль автора сообщения (user/assistant/system) +[float]$temperature = 0.7 # температура выборки в диапазоне от 0 до 2. Чем выше значение, тем более случайным будет ответ модели. +[float]$top_p = 0.1 # используется как альтернатива temperature и изменяется в диапазоне от 0 до 1. Задает вероятностную массу токенов, которые должна учитывать модель. Так, если передать значение 0.1, модель будет учитывать только токены, чья вероятностная масса входит в верхние 10%. +[int64]$n = 1 # количество вариантов ответов (1..4), которые нужно сгенерировать для каждого входного сообщения +[int64]$max_tokens = 512 # максимальное количество токенов, которые будут использованы для создания ответов +[boolean]$stream = $false # передавать сообщения по частям в потоке +``` +### 6. Составление запросов: +```PowerShell +$url = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions" +$headers = @{ + "Authorization" = "Bearer $GIGA_TOKEN" + "Content-Type" = "application/json" +} + +$(Invoke-RestMethod -Uri "https://gigachat.devices.sberbank.ru/api/v1/models" -Headers $headers).data # список доступных моделей + +$body = @{ + model = "GigaChat:latest" + messages = @( + @{ + role = $role + content = $content + } + ) + temperature = $temperature + n = $n + max_tokens = $max_tokens + stream = $stream +} | ConvertTo-Json +$Request = Invoke-RestMethod -Method POST -Uri $url -Headers $headers -Body $body +$Request.choices.message.content +``` +## Curl + +### Установка сертификатов в Ubuntu: + +`wget https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt` \ +`wget https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt` \ +`mkdir /usr/local/share/ca-certificates/russian_trusted` \ +`cp russian_trusted_root_ca_pem.crt russian_trusted_sub_ca_pem.crt /usr/local/share/ca-certificates/russian_trusted` \ +`update-ca-certificates -v` \ +`wget -qS --spider --max-redirect=0 https://www.sberbank.ru` + +### Получение токена: +```Bash +Cred_Base64="N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ==" +UUID=$(uuidgen) +GIGA_TOKEN=$(curl -s --location --request POST "https://ngw.devices.sberbank.ru:9443/api/v2/oauth" \ +--header "Authorization: Basic $Cred_Base64" \ +--header "RqUID: $UUID" \ +--header "Content-Type: application/x-www-form-urlencoded" \ +--data-urlencode 'scope=GIGACHAT_API_PERS' | jq -r .access_token) +``` +`curl -s --location "https://gigachat.devices.sberbank.ru/api/v1/models" --header "Authorization: Bearer $GIGA_TOKEN" | jq .` для проверки + +### Составление запроса: +```Bash +request=$(curl -s https://gigachat.devices.sberbank.ru/api/v1/chat/completions \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $GIGA_TOKEN" \ + -d '{ + "model": "GigaChat:latest", + "messages": [ + { + "role": "user", + "content": "Когда уже ИИ захватит этот мир?" + } + ], + "temperature": 0.7 +}') +echo $request | jq -r .choices[].message.content +``` +# YandexGPT + +## Получить OAuth-Token: + +https://cloud.yandex.ru/ru/docs/iam/operations/iam-token/create время жизни IAM-токена не больше 12 часов \ +`yandexPassportOauthToken="y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX"` для bash \ +`$yandexPassportOauthToken = "y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX"` для PowerShell + +## Обменять OAuth-Token на IAM-Token: + +`IAM_TOKEN=$(curl -s -d "{\"yandexPassportOauthToken\":\"$yandexPassportOauthToken\"}" "https://iam.api.cloud.yandex.net/iam/v1/tokens" | jq -r .iamToken)` \ +`$IAM_TOKEN = $(Invoke-RestMethod -Method POST -Uri "https://iam.api.cloud.yandex.net/iam/v1/tokens" -Body $(@{yandexPassportOauthToken = "$yandexPassportOauthToken"} | ConvertTo-Json -Compress)).iamToken` + +## Получить FOLDER_ID: +```Bash +CLOUD_ID=$(curl -s -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds | jq -r .clouds[].id) # получить cloud id +curl -s --request GET -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d "{\"cloudId\": \"$CLOUD_ID\"}" # получить список директорий в облаке +curl -s --request POST -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d "{\"cloudId\": \"$CLOUD_ID\", \"name\": \"test\"}" # создать директорию в облаке +FOLDER_ID=$(curl -s --request GET -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d '{"cloudId": "b1gf9n6heihqj0pt5piu"}' | jq -r '.folders[] | select(.name == "test") | .id') # забрать id директории +``` +```PowerShell +$CLOUD_ID = $(Invoke-RestMethod -Method Get -Uri "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds" -Headers @{"Authorization"="Bearer $IAM_TOKEN"; "Content-Type"="application/json"}).clouds.id +$FOLDER_ID = $(Invoke-RestMethod -Method Get -Uri "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders" -Headers @{"Authorization"="Bearer $IAM_TOKEN"; "Content-Type"="application/json"} -Body (@{"cloudId"= $CLOUD_ID} | ConvertTo-Json)).folders | Where-Object name -eq test | Select-Object -ExpandProperty id +``` +### Составление запроса: +```Bash +model="gpt://$FOLDER_ID/yandexgpt/latest" # https://cloud.yandex.ru/ru/docs/yandexgpt/concepts/models +body=$(cat <