Add GigaChat, YandecGPT and update Selenium
This commit is contained in:
		
							parent
							
								
									5f1884eddd
								
							
						
					
					
						commit
						4482e4cad1
					
				
					 1 changed files with 241 additions and 23 deletions
				
			
		
							
								
								
									
										264
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										264
									
								
								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 <<EOF | ||||
| { | ||||
|   "modelUri": "$model", | ||||
|   "completionOptions": { | ||||
|     "stream": false, | ||||
|     "temperature": 0.6, | ||||
|     "maxTokens": 2000 | ||||
|   }, | ||||
|   "messages": [ | ||||
|     { | ||||
|       "role": "user", | ||||
|       "text": "Посчитай сумму 22+33" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| EOF) | ||||
| curl --request POST \ | ||||
|   -H "Content-Type: application/json" \ | ||||
|   -H "Authorization: Bearer $IAM_TOKEN" \ | ||||
|   -H "x-folder-id: $FOLDER_ID" \ | ||||
|   -d "$body" \ | ||||
|   "https://llm.api.cloud.yandex.net/foundationModels/v1/completion" | ||||
| ``` | ||||
| ```PowerShell | ||||
| $model = "gpt://$FOLDER_ID/yandexgpt/latest" | ||||
| $body = @" | ||||
| { | ||||
|   "modelUri": "$model", | ||||
|   "completionOptions": { | ||||
|     "stream": false, | ||||
|     "temperature": 0.6, | ||||
|     "maxTokens": 2000 | ||||
|   }, | ||||
|   "messages": [ | ||||
|     { | ||||
|       "role": "user", | ||||
|       "text": "Посчитай сумму 22+33" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| "@ | ||||
| Invoke-RestMethod -Method POST -Uri "https://llm.api.cloud.yandex.net/foundationModels/v1/completion" -Headers @{"Content-Type"="application/json"; "Authorization"="Bearer $IAM_TOKEN"; "x-folder-id"="$FOLDER_ID"} -Body $body | ||||
| ``` | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue