API
Заметки по работе с REST API
через PowerShell и curl.
REST API
$url = "https://habr.com/ru/rss/users/Lifailon/publications/articles/?fl=ru"
RSS лента публикаций на Habr
Invoke-RestMethod $url
$iwr = Invoke-WebRequest -Uri $url
$iwr | Get-Member
$iwr.Content
$iwr.StatusCode -eq 200
$iwr.Headers
$iwr.ParsedHtml | Select lastModified
$iwr.Links | fl title,innerText,href
$iwr.Images.src
Methods
GET - Read
POST - Create
PATCH - Partial update/modify
PUT - Update/replace
DELETE - Remove
Download Image
Download-Image -url https://losst.pro/
Token
https://veeam-11:9419/swagger/ui/index.html
$Header =
$Body =
$vpost = iwr "https://veeam-11:9419/api/oauth2/token" -Method POST -Headers $Header -Body $Body -SkipCertificateCheck
$vtoken = (($vpost.Content) -split '"')[3]
GET
$token = $vtoken | ConvertTo-SecureString -AsPlainText –Force
$vjob = iwr "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -Authentication Bearer -Token $token -SkipCertificateCheck
$Header =
$vjob = iwr "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -SkipCertificateCheck
$vjob = $vjob.Content | ConvertFrom-Json
$vjob = Invoke-RestMethod "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -SkipCertificateCheck
$vjob.data.virtualMachines.includes.inventoryObject
Cookie
Получить hash торрент файла на сайте Кинозал
$id = 1656552
$cookies = "uid=..."
получить cookie в браузере на вкладке сеть из загловка запросов после авторизации на сайте
Get-KinozalTorrentHash $id $cookies
Pode
PowerShell Web framework для создания REST API
, Веб-сайтов, TCP
и SMTP
серверов.
Start-PodeServer
irm http://localhost:8080/api/service -Method Get
irm http://localhost:8080/api/process -Method Get
http://localhost:8080/api/process-html
использовать браузер
irm http://localhost:8080/api/service -Method Post -Body @{"ServiceName" = "AnyDesk"}
Selenium
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"
$Chromium = (Get-ChildItem $path -Recurse | Where-Object Name -like chrome.exe).FullName
Add-Type -Path $WebDriver
Add-Type -Path $SupportDriver
try
finally
Selenium modules
Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-GPT/Get-GPT.psm1 | Out-File -FilePath "$(New-Item -Path "$([0])\Get-GPT" -ItemType Directory -Force)\Get-GPT.psm1" -Force
Get-GPT "Исполняй роль калькулятора. Посчитай сумму чисел: 22+33"
Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-Translation/Get-Translation.psm1 | Out-File -FilePath "$(New-Item -Path "$([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
Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-SpeedTest/Get-SpeedTest.psm1 | Out-File -FilePath "$(New-Item -Path "$([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
$ie.document.IHTMLDocument3_getElementsByTagName("button") | select innerText
получить имена всех Button
$ie.Document.documentElement.innerHTML
прочитать сырой Web Content (<input name=“login” tabindex=“100” class=“input__control input__input” id=“uniq32005644019429136” spellcheck=“false” placeholder=“Логин”)
$All_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("*")
забрать все элементы
$Go_Button = $All_Elements | ? innerText -like "go"
поиск элемента по имени
$Go_Button | select ie9_tagName
получить TagName (SPAN) для быстрого дальнейшего поиска
$SPAN_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("SPAN")
$ie = New-Object -ComObject InternetExplorer.Application
$ie.navigate("https://yandex.ru")
$ie.visible = $true
$ie.document.IHTMLDocument3_getElementByID("login").value = "Login"
$ie.document.IHTMLDocument3_getElementByID("passwd").value = "Password"
$Button_Auth = ($ie.document.IHTMLDocument3_getElementsByTagName("button")) | ? innerText -match "Войти"
$Button_Auth.Click()
$Result = $ie.Document.documentElement.innerHTML
$ie.Quit()
LLM
OpenAI
Пример запроса для перевода текста
$text = "The OpenAI API uses API keys for authentication. You can create API keys at a user or service account level." # https://platform.openai.com/docs/api-reference/authentication
$toLang = "Russian"
$presetPrompt = "Translate the following text into $toLang :
$text
Respond ONLY with the translated text. Do not include any other explanations, context, or comments.
"
$apiKey = "sk-proj-XXXXXXXXXX"
$apiUrl = "https://api.openai.com/v1/chat/completions"
$body = | ConvertTo-Json -Depth 10 -Compress
$response = Invoke-RestMethod -Uri $apiUrl -Method Post -Headers -Body $body
$response.choices.message.content
Mock
Создаем серверную заглушку для API
OpenAI через JSON Server
npm install -g json-server@0.17.4
Конфигурация ответов в файле openai.json
Настройка маршрутизации в файле routes.json
Конфигурация сервера в файле json-server.json
Запускаем сервер:
json-server --watch openai.json --routes routes.json
Делаем запрос:
$(Invoke-RestMethod -Uri "http://localhost:3001/v1/chat/completions").choices.message.content
OpenRouter
Регестрируем аккаунт на OpenRouter через Google, выпускаем api ключ и выбираем бесплатную модель.
$OPENROUTER_API_KEY = "sk-or-v1-KEY"
$OPENROUTER_MODEL = "deepseek/deepseek-r1:free"
$headers =
$body = | ConvertTo-Json -Depth 10 -Compress
$response = Invoke-RestMethod -Uri "https://openrouter.ai/api/v1/chat/completions" -Method Post -Headers $headers -Body $body
$response.choices.message.content
LM Studio
API
в LM Studio совместим с OpenAI
Получить список моделей:
.data.id
deepseek-r1-distill-llama-8b
llama-3.2-3b-instruct
text-embedding-nomic-embed-text-v1.5
Режим чата (когда stream
установлен в True
, ответ приходит по частям):
Ollama
cd $home\Downloads
$versionLatest = .tag_name
irm https://github.com/ollama/ollama/releases/download/${versionLatest}/ollama-windows-amd64.zip -OutFile ollama.zip
Expand-Archive -Path ollama.zip -OutputPath ".\ollama" # -DestinationPath for Windows PowerShell 5.1
Remove-Item ollama.zip; cd ollama
.\ollama serve
запускаем сервер
.\ollama pull mistral:7b-instruct
загружаем модель (https://ollama.com/library/mistral)
.\ollama run mistral
запустить консоль для общения с LLM в режиме чата
# Отправляем API запрос
$data = curl -sS -X POST http://localhost:11434/api/generate -d '{
"model": "mistral",
"prompt":"Return only the word test in the answer"
}'
# Собираем ответ из частей response
[string] .response.trim()
GigaChat
Windows
- Установка сертификатов:
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"
- Авторизация по Sber ID и генерация новых авторизационных данных для получения токена: Developers (время жизни 30 минут)
- Формирование авторизационных данных в формате Base64 из Client ID и Client Secret:
$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
- Получение токена:
$Cred_Base64 = "N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="
$UUID = [System.Guid]::NewGuid()
генерируем UUID для журналирования входящих вызовов и разбора инцидентов
$url = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth"
$headers =
$body =
$GIGA_TOKEN = .access_token
- Параметры:
[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 # передавать сообщения по частям в потоке
- Составление запросов:
$url = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions"
$headers =
# список доступных моделей
.data
$body = | ConvertTo-Json
$Request = Invoke-RestMethod -Method POST -Uri $url -Headers $headers -Body $body
$Request.choices.message.content
Linux
- Установка сертификатов в 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
- Получение токена:
Cred_Base64="N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="
UUID=
GIGA_TOKEN=
curl -s --location "https://gigachat.devices.sberbank.ru/api/v1/models" --header "Authorization: Bearer $GIGA_TOKEN" | jq .
для проверки
- Составление запроса:
request=
|
YandexGPT
- Получить OAuth-Token:
Create AIM Token время жизни 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:
CLOUD_ID= # получить cloud id
FOLDER_ID= # забрать id директории
$CLOUD_ID = .clouds.id
$FOLDER_ID = .folders | Where-Object name -eq test | Select-Object -ExpandProperty id
- Составление запроса:
model="gpt:// /yandexgpt/latest" # https://cloud.yandex.ru/ru/docs/yandexgpt/concepts/models
body=
$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 -Body $body
SuperAGI
Source
Playground generate
API Doc (exaples)
SUPERAGI_API_KEY="31f72164129XXXXX"
prompt="посчитай сумму 22+33, дай только ответ без лишнего текста"
request=
| |
$SUPERAGI_API_KEY = "31f72164129XXXXX"
$prompt = "посчитай сумму 22+33, дай только ответ без лишнего текста"
$request = Invoke-RestMethod -Method Post -Uri 'https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce' -Headers -Body ( | ConvertTo-Json )
.choices.text
Replicate
REPLICATE_API_TOKEN="r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX"
prompt="Жираф в полоску зебры"
request=
request_url=
response_status=
while ; do
response_status=
done
|
$REPLICATE_API_TOKEN = "r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX"
$prompt = "Жираф в полоску зебры"
$body = | ConvertTo-Json
$headers =
$request = Invoke-RestMethod -Uri "https://api.replicate.com/v1/predictions" -Method POST -Body $body -Headers $headers
$response = Invoke-RestMethod -Headers
while ($response.status -ne "succeeded")
$response.output
Google API
Google Translate
$Key = "<TOKEN_API>" # получить токен: https://console.cloud.google.com/apis/credentials
$Text = "You can see in the right corner how long each translation request takes (this does not depend on the amount of text being transferred)."
$LanguageTarget = "RU"
$LanguageSource = "EN"
$url = "https://translation.googleapis.com/language/translate/v2?key=$key"
$Header =
$Body = | ConvertTo-Json
$WebClient = New-Object System.Net.WebClient
foreach ($key in $Header.Keys)
$Response = $WebClient.UploadString($url, "POST", $Body) | ConvertFrom-Json
$Response.data.translations.translatedText
Google Search
$Key = "<TOKEN_API>" # получить токен: https://developers.google.com/custom-search/v1/overview?hl=ru (пользовательский поиск JSON API предоставляет 100 поисковых запросов в день бесплатно)
$cx = "35c78340f49eb474a" # создать поисковую систему https://programmablesearchengine.google.com/controlpanel/all
$Query = "как создать бота discord"
$Lang = "ru"
$Num = 10
$Start = 0
$response = Invoke-RestMethod "https://www.googleapis.com/customsearch/v1?q=$Query&key=$Key&cx=$cx&lr=lang_$Lang&num=$Num&$start=$Start"
$response.items | Select-Object title,snippet,displayLink,link | Format-List
Google Search via RapidAPI
$Key = "<TOKEN_API>"
$headers=
$headers.Add("X-RapidAPI-Key", "$Key")
$headers.Add("X-RapidAPI-Host", "google-search72.p.rapidapi.com")
$query = "как создать бота discord"
$response = Invoke-RestMethod "https://google-search72.p.rapidapi.com/search?q=$query%20gitgub&gl=us&lr=lang_ru&num=20&start=0" -Method GET -Headers $headers
$response.items | Select-Object title,snippet,displayLink,link | Format-List
Google Filter
https://www.google.com/search?q=the+rookie+2018+imdb
формат url-запроса поиска с пробелами
https://www.google.com/search?q=the+rookie+2018+site:imdb.com
поиск по сайту
https://www.google.com/search?q=the+rookie+intitle:index.of+"last modified"+(mkv|avi)
искать страницы, на которых указано “last modified” (последние изменения), заголовок страницы через расширенный оператор поиска (все перечисленные слова должны встречаться в заголовке) содержит слово “index.of” (указывает на директорию на веб-сервере, которая содержит список файлов) и искать файлы с расширениями .mkv или (|) .avi
https://www.google.com/search?q=the+rookie+2018+filetype:torrent
инструкция gopro hero 11 filetype:pdf
искать сразу документ (на странице .pdf или загрузка)
"действия/глаголы, утвержденные для использования в командлетах"
искать по фразе целиком, без разбиения на отдельные слова
"ягуар скорость -животное -xe -xj"
узнаем скорость Ягуара, исключаем животное и модели автомобиля
"intitle:лучшие фильмы 2023"
запрос ищет страницы, заголовки (title HTML документа) которых содержат слова “лучшие”, “фильмы” и “2023” (все слова должны быть в заголовке)
"allintitle:лучшие фильмы 2023"
запрос ищет страницы, заголовки (title HTML документа) которых содержат слова “лучшие”, “фильмы” или “2023” (одно из)
"intext:telegram бот powershell"
поиск страниц, содержащих указанное ключевое слово в тексте страницы (а не только в заголовке)
"inurl:lifailon"
поиск страниц, в URL которых содержится указанное ключевое слово
intitle:index.of "game of thrones" mkv daterange:2010..2015
фильтрация по дате изменения, оператор позволяет задать диапазон дат в формате YYYYMMDD..YYYYMMDD
intitle:index.of "game of thrones" mkv after:2015
ограничить результаты поиска файлов, измененных до (before) или после (after) указанной даты
intitle:index.of "game of thrones" mkv from:2010 to:2015
фильтрация по диапазону дат
https://www.google.com/search?q=the-rookie-2018+site:imdb.com&btnI
редирект на первый url
Media API
IMDb
$key = "<TOKEN_API>" # 500 запросов в месяц
$query="Break"
$headers=
$headers.Add("X-RapidAPI-Key", "$key")
$headers.Add("X-RapidAPI-Host", "imdb8.p.rapidapi.com")
$response = Invoke-RestMethod "https://imdb8.p.rapidapi.com/title/find?q=$query" -Method GET -Headers $headers
$response.results | select title,titletype,year,runningTimeInMinutes,id | Format-Table
"https://www.imdb.com$($response.results.id[0])"
$response.results.principals # актеры
$response.results.image
MoviesDatabase
$key = "<TOKEN_API>"
$imdb_id = "tt0455275"
$headers=
$headers.Add("X-RapidAPI-Key", "$key")
$headers.Add("X-RapidAPI-Host", "moviesdatabase.p.rapidapi.com")
$response = Invoke-RestMethod "https://moviesdatabase.p.rapidapi.com/titles/$imdb_id" -Method GET -Headers $headers
$response.results
TMDB
$TOKEN = "548e444e7812575caa0a7eXXXXXXXXXX"
$Endpoint = "search/tv" # поиск сериала (tv) и фильма (movie) по названию
$Query = "зимородок"
$url =
.results
$id = .results.id # забрать id сериала (210865) https://www.themoviedb.org/tv/210865
$Endpoint = "tv/$id" # получение информации о сериале по его ID
$url =
# список сезонов (.seasons), количество эпизодов (.seasons.episode_count)
(Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2?api_key=$Token" -Method Get).episodes # вывести 2 сезон
Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2/episode/8?api_key=$Token" -Method Get # вывести 8 эпизод
OMDb
Получение API ключа по email
$API_KEY = "XXXXXXXX"
$IMDb_ID = "tt7587890"
curl -s "https://omdbapi.com/?apikey=$($API_KEY)&i=$($IMDb_ID)" | jq .
curl -s "https://omdbapi.com/?apikey=$($API_KEY)&i=$($IMDb_ID)" | ConvertFrom-Json
Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&s=The Rookie"
Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie"
поиск по Title
Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie&y=1990"
поиск по Title и году выхода
Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie&type=movie"
поиск только фильма (movie) или сериала (series)
$(Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&s=The Rookie").Search
поиск всех совпадений (фильмы и сериалы)
ivi
Invoke-RestMethod https://api.ivi.ru/mobileapi/categories
список категорий и жанров (genres/meta_genres)
Invoke-RestMethod https://api.ivi.ru/mobileapi/collections
подборки
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons.number
кол-во сезонов
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].episode_count
кол-во серий во втором сезоне
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].ivi_release_info.date_interval_min
дата выхода следующей серии
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_rating
рейтинг в Кинопоиск (8.04)
$id = (Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_id
получить id в Кинопоиск (5106881)
id=$(curl -s https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok | jq .result[].kp_id)
получить id в Кинопоиск
Kinopoisk
id=5106881
get=
| | |
kinopoisk.dev
Получить токен
Документация по API в формате OpenAPI
GET /v1.4/movie/{id}
поиск по id
$id = 5106881
$API_KEY = "ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
$Header =
$irm = Invoke-RestMethod "https://api.kinopoisk.dev/v1.4/movie/$id" -Method GET -Headers $Header
$irm.rating.kp # рейтинг в Кинопоиск (8,079)
$irm.seasonsInfo # количество сезонов и эпизодов в них
id=5106881
API_KEY="ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
get=
| |
GET /v1.4/movie/search
query="zimorodok"
page=1 # кол-во страниц для выборки
limit=1 # кол-во элементов на странице
|
limit=5
request=
|
$API_KEY = "ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
$page = 1
$limit = 5
$query = "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"
$request = Invoke-RestMethod -Uri "https://api.kinopoisk.dev/v1.4/movie/search?page=$page&limit=$limit&query=$query" -Headers
$request.docs | Where-Object year -eq 2022
UrlCode
($str)
Get-PercentEncode "зимородок"
($str)
UrlEncode "зимородок"
($encoded)
Get-UrlDecode "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"
KinopoiskApiUnofficial
Бесплатно 500 запросов в сутки. Swagger documentation
API_KEY="828ec96a-f45d-4e3d-84b1-XXXXXXXXXXXX"
$headers =
Invoke-RestMethod -Uri 'https://kinopoiskapiunofficial.tech/api/v2.2/films/1142153' -Headers $headers
curl -s "https://kinopoiskapiunofficial.tech/api/v2.2/films/1142153" -H "accept: application/json" -H "X-API-KEY: $API_KEY" | jq .
Kinobox
$url = "https://www.kinopoisk.ru/film/694051"
$kp_id = $url -replace ".+/"
https://kinomix.web.app/#694051
curl -s -X GET "https://kinobox.tv/api/players/main?kinopoisk=$kp_id" -H "accept: application/json"
поиск по id Кинопоиск
curl -s -X GET "https://kinobox.tv/api/players/main?imdb=tt2293640" -H "accept: application/json"
поиск по id IMDb
curl -s -X GET "https://kinobox.tv/api/players/main?title=minions" -H "accept: application/json"
поиск основных плееров по названию
curl -s -X GET "https://kinobox.tv/api/players/all?title=minions" -H "accept: application/json"
поиск всех плееров
curl -s -X GET "https://kinobox.tv/api/popular/films" -H "accept: application/json"
популярные фильмы
curl -s -X GET "https://kinobox.tv/api/popular/series" -H "accept: application/json"
популярные сериалы
VideoCDN
$kp_id = 5106881
$token = "YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX"
$ep = "tv-series"
| Where-Object season_num -eq 2 | Select-Object , # отфильтровать серии по второму сезону и отобразить все озвучки к сериям
.data.episodes
kp_id=5106881
token="YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX"
ep="tv-series"
| |
Torrent
Jackett
mkdir /jackett
docker-compose.yml
---
services:
jackett:
image: lscr.io/linuxserver/jackett:latest
container_name: jackett
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- /jackett/data:/config
- /jackett/blackhole:/downloads
ports:
- 9117:9117
restart: unless-stopped
docker-compose up -d jackett
docker exec -it jackett /bin/bash
доступ к оболочке во время работы контейнера
docker logs -f jackett
мониторинг журналов контейнера
/jackett/data/Jackett/ServerConfig.json
место хранения конфигурации сервера
/jackett/data/Jackett/Indexers/*.json
место хранения конфигурации индексаторов
$API_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Invoke-RestMethod "http://127.0.0.1:9117/api/v2.0/indexers/rutor/results/torznab/api?apikey=$API_KEY"
Прочитать RSS ленту RuTor
$query = "the+rookie"
Invoke-RestMethod "http://127.0.0.1:9117/api/v2.0/indexers/rutor/results/torznab/api?apikey=$API_KEY&t=search&cat=&q=$query"
поиск в RuTor
Invoke-RestMethod "http://127.0.0.1:9117/api/v2.0/indexers/kinozal/results/torznab/api?apikey=$API_KEY&t=search&q=$query"
поиск в кинозал
Invoke-RestMethod "http://127.0.0.1:9117/api/v2.0/indexers/kinozal/results/torznab/api?apikey=$API_KEY&t=search&q=$query&cat=5000"
отфильтровать вывод по сериалам (Capabilities: 5000)
Invoke-RestMethod "http://127.0.0.1:9117/api/v2.0/indexers/all/results/torznab/api?apikey=$API_KEY&t=search&q=riverdale"
поиск во всех индексаторах
$(Invoke-RestMethod "http://127.0.0.1:9117/api/v2.0/indexers/all/results/torznab/api?apikey=$API_KEY&t=indexers&configured=true").indexers.indexer
cписок всех настроенных индексаторов (трекеров)
Torrent-API-py
git clone https://github.com/Ryuk-me/Torrent-Api-py
cd Torrent-Api-py
pip install virtualenv
py -3 -m venv api-py
# Активировать виртуальную среду для Windows
.\api-py\Scripts\activate
# Активировать виртуальную среду для Linux
# $ source api-py/bin/activate
# Установить зависимости и запустить
pip install -r requirements.txt
python main.py
# Proxy: https://github.com/dperson/torproxy
# export HTTP_PROXY="http://proxy-host:proxy-port"
$srv = "http://localhost:8009"
local
$srv = "https://torrent-api-py-nx0x.onrender.com"
public
Invoke-RestMethod $srv/api/v1/sites
список доступных трекеров
Invoke-RestMethod "$srv/api/v1/search/?site=torlock&query=the+rookie&limit=0&page=1"
поиск в выбранном трекере
Invoke-RestMethod "$srv/api/v1/all/search?query=the+rookie&limit=0"
поиск по названию во всех трекерах
Plex
$API_TOKEN = "XXXXXXXXXXXXXXXXXXXX"
$headers = @{
"X-Plex-Token" = $API_TOKEN
"accept" = "application/json"
}
$(Invoke-RestMethod -Headers $headers -Uri http://localhost:32400/servers).MediaContainer.Server
версия сервера
Invoke-RestMethod -Headers $headers -Uri http://localhost:32400/diagnostics/logs -OutFile log.zip
выгруить лог с сервера
$(Invoke-RestMethod -Headers $headers -Uri http://localhost:32400/library/sections).MediaContainer.Directory
список секций добавленных на сервер
$section_key = $(Invoke-RestMethod -Headers $headers -Uri http://localhost:32400/library/sections).MediaContainer.Directory.key[0]
Invoke-RestMethod -Headers $headers -Uri http://localhost:32400/library/sections/$section_key/refresh
синхронизация указанной секции в Plex по ключу
$(Invoke-RestMethod -Headers $headers -Uri http://localhost:32400/library/sections/2/folder).MediaContainer.Metadata
получить список директорий и файлов в корне выбранной секции
$(Invoke-RestMethod -Headers $headers -Uri http://localhost:32400/library/sections/2/folder?parent=204).MediaContainer.Metadata
получить список всех файлов в указанной директории через ключ (MediaContainer.Metadata.key) конечной точки
Jellyfin
$API_TOKEN "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Invoke-RestMethod -Headers @{"X-Emby-Token" = $API_TOKEN} http://localhost:8096/Users
список пользователей и их id
$Users = Invoke-RestMethod -Headers @{"X-Emby-Token" = $API_TOKEN} http://localhost:8096/Users
$UserId = $($Users | Where-Object Name -match "Lifailon").Id
забрать id пользователя
Invoke-RestMethod -Headers @{"X-Emby-Token" = $API_TOKEN} http://localhost:8096/System/Info
информация о системе
$(Invoke-RestMethod -Headers @{"X-Emby-Token" = $API_TOKEN} http://localhost:8096/Items).Items
список добавленных объектов директорий
$ItemId = $(Invoke-RestMethod -Headers @{"X-Emby-Token" = $API_TOKEN} http://localhost:8096/Items).Items[-1].Id
забрать id директории
$Data = $(Invoke-RestMethod -Headers @{"X-Emby-Token" = $API_TOKEN} "http://localhost:8096/Users/$UserId/Items?ParentId=$ItemId").Items
получить содержимое корневой директории по Id из Items
$TvId = $($data | Where-Object Name -match "Rookie").Id
найти сериал или фильм по имени и забрать его Id
$(Invoke-RestMethod -Headers @{"X-Emby-Token" = $API_TOKEN} "http://localhost:8096/Users/$UserId/Items?ParentId=$TvId").Items
получить содержимое дочерней директории по Id ее родительской директории
Telegram
@BotFather (https://t.me/BotFather) /newbot
Format: https://api.telegram.org/bot<token>/<endpoint>
Get-FromTelegram
Get-FromTelegram -Last
Get-FromTelegram -Date
Get-FromTelegram -ChatID
Send-ToTelegram -Text "Send test from powershell"
$LastDate = (Get-FromTelegram -date)[-1].Date
while ($true)
/Service vpnagent
/Service WinRM
/Service test
Button
$keyboard = '{
"inline_keyboard":[[
{"text":"Uptime","callback_data":"/Uptime"},
{"text":"Test","callback_data":"/Test"}
]]
}'
Send-ToTelegram -Text "Test buttons" -Keyboard $keyboard
$request = (Invoke-RestMethod -Uri "https://api.telegram.org/bot$Token/getUpdates").result.callback_query
$request.data # прочитать callback_data нажатой кнопки
$request.message.date
Send-ToTelegramFile
https://core.telegram.org/bots/api#senddocument
Send-ToTelegramFile -Path "C:\Users\Lifailon\Documents\lake.jpg" -Token "7777777777:AAF..." -Chat "7777777777"
Discord
Создаем Applications (General Information). В Bot привязываем к Application и копируем токен авторизации. В OAuth2 - URL Generator выбираем bot и права Administrator и копируем созданный URL для добавления на канал. Переходим по url и добавляем бота на сервер. Получаем ID канала на сервере (текстовые каналы, правой кнопкой мыши копируем ссылку и забираем последний id в url).
Send to Discord
DISCORD_TOKEN="MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
DISCORD_CHANNEL_ID="119403124XXXXXXXXXX"
TEXT="test from bash"
URL="https://discordapp.com/api/channels/ /messages"
$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
$DISCORD_CHANNEL_ID = "119403124XXXXXXXXXX"
$TEXT = "test from PowerShell"
$URL = "https://discordapp.com/api/channels/$DISCORD_CHANNEL_ID/messages"
$Body = | ConvertTo-Json
curl -s $URL -X POST -H "Authorization: Bot $DISCORD_TOKEN" -H "Content-Type: application/json" -d $Body
Read from Discord
|
$messages = (curl -s -X GET $URL -H "Authorization: Bot $DISCORD_TOKEN" -H "Content-Type: application/json" | ConvertFrom-Json)
$messages | Select-Object content,timestamp,
HttpClient
$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
$DISCORD_CHANNEL_ID = "119403124XXXXXXXXXX"
$URL = "https://discordapp.com/api/channels/$DISCORD_CHANNEL_ID/messages"
$HttpClient = New-Object System.Net.Http.HttpClient
$HttpClient.DefaultRequestHeaders.Authorization = "Bot $DISCORD_TOKEN"
$response = $HttpClient.GetAsync($URL).Result
$messages = $response.Content.ReadAsStringAsync().Result
($messages | ConvertFrom-Json).content
Button
Discord Net Webhook
Add-Type -Path .FullName
# https://discordapp.com/api/webhooks/<webhook_id>/<webhook_token> (Настроить канал - Интеграция)
$webhookId = 1197577280000000000
$webhookToken = "rs8AA-XXXXXXXXXXX_Vk5RUI4A6HuSGhpCCTepq25duwCwLXasfv6u23a7XXXXXXXXXX"
$messageContent = "Test dotNET"
$client = New-Object Discord.Webhook.DiscordWebhookClient($webhookId, $webhookToken)
$client.SendMessageAsync($messageContent).Wait()
Discord Net WebSocket
$DiscordAssemblies = .FullName
foreach ($assembly in $DiscordAssemblies)
$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
$Client = New-Object Discord.WebSocket.DiscordSocketClient
$Client.Add_MessageReceived()
$Client.LoginAsync([Discord.TokenType]::Bot, $DISCORD_TOKEN).GetAwaiter().GetResult()
#$Client.StartAsync().Wait()
$Client.StartAsync().GetAwaiter().GetResult()
$Client.ConnectionState
[console]::ReadKey($true)
$Client.LogoutAsync().GetAwaiter().GetResult()
$Client.Dispose()
Copy Codehttps://lifailon.github.io/search_index.en.json$MATCHES more matches