Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΡΠ΅Π±ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΡΠΈΡΠΎΠ²ΠΊΠΈ Π°ΠΊΡΠΈΠΉ ΠΈ ΠΊΡΠΈΠΏΡΠΎΠ²Π°Π»ΡΡ, ΡΠΏΠΎΡΡΠΈΠ²Π½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, ΠΎΠ½Π»Π°ΠΉΠ½-ΡΠ°ΡΡ, IoT-ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ. ΠΠ±ΡΡΠ½ΡΠ΅ HTTP-Π·Π°ΠΏΡΠΎΡΡ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Ρ: ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΎΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ΅ΡΠ²Π΅Ρ, ΡΡΠ°ΡΠΈΡΡ Π»ΠΈΡΠ½ΠΈΠΉ ΡΡΠ°ΡΠΈΠΊ ΠΈ ΠΆΠ΄Π°ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ.
WebSocket ΡΠ΅ΡΠ°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ: ΡΡΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π΄Π»Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ. Π‘Π΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ β ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π½Π° ΠΊΠ°Π½Π°Π»Ρ.
ΠΡΠΎΡΡΠ°Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ: Π²Ρ Π·Π²ΠΎΠ½ΠΈΡΠ΅ Π΄ΡΡΠ³Ρ (ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΠ΅, handshake), Π΄ΡΡΠ³ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΊΡΠΎ Π·Π²ΠΎΠ½ΠΈΡ, ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ·ΠΎΠ² (Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ), ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π»ΠΈΠ½ΠΈΡ ΠΎΡΡΠ°ΡΡΡΡ ΠΎΡΠΊΡΡΡΠΎΠΉ, ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ (ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ ).
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° WebSocket Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΡ Π΄ΠΎΡΡΠ°Π²ΠΊΡ Π΄Π°Π½Π½ΡΡ , ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½ΠΈΠΉ ΠΎΠ±ΠΌΠ΅Π½ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ.
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ WebSocket Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Cryptocompare
Cryptocompare ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ ΠΊΡΠΈΠΏΡΠΎΠ²Π°Π»ΡΡΠ°ΠΌ ΡΠ΅ΡΠ΅Π· WebSocket. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° ΠΏΠΎΡΠΎΠΊ BTC/USD.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ WebSocket-ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π° PowerShell
# =================================================================================
# WebSocket-Client.ps1 β Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ WebSocket-ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
# Windows PowerShell >= 5.1
# ΠΠ²ΡΠΎΡ: hypo69
# ΠΠ°ΡΠ° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ: 13/09/2025
# =================================================================================
# =================================================================================
# ΠΠΠ¦ΠΠΠΠΠ― (MIT)
# =================================================================================
<#
ΠΠΈΡΠ΅Π½Π·ΠΈΡ MIT: https://opensource.org/licenses/MIT
#>
function Start-WebSocketClient {
<#
.SYNOPSIS
Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ WebSocket-ΠΊΠ»ΠΈΠ΅Π½Ρ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.
.DESCRIPTION
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ WebSocket-ΡΠ΅ΡΠ²Π΅ΡΡ, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π½Π° ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ
ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π²Ρ
ΠΎΠ΄ΡΡΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠ°Π·ΡΡΠ²Π΅.
.PARAMETER Url
URL WebSocket-ΡΠ΅ΡΠ²Π΅ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: "wss://streamer.cryptocompare.com/v2?api_key=ΠΠΠ¨_API_KEY").
.PARAMETER SubscribeMessage
Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON.
.PARAMETER ReconnectDelay
ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 5 ΡΠ΅ΠΊ.
.EXAMPLE
$Url = "wss://streamer.cryptocompare.com/v2?api_key=ΠΠΠ¨_API_KEY"
$SubscribeMessage = '{"action":"SubAdd","subs":["5~CCCAGG~BTC~USD"]}'
Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5
#>
[CmdletBinding()]
param(
[Parameter(Mandatory, HelpMessage = "Π£ΠΊΠ°ΠΆΠΈΡΠ΅ URL WebSocket-ΡΠ΅ΡΠ²Π΅ΡΠ°.")]
[string]$Url,
[Parameter(Mandatory, HelpMessage = "Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON.")]
[string]$SubscribeMessage,
[Parameter(Mandatory = $false, HelpMessage = "ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (ΡΠ΅ΠΊ).")]
[int]$ReconnectDelay = 5
)
while ($true) {
try {
$ws = [System.Net.WebSockets.ClientWebSocket]::new()
$uri = [Uri] $Url
$ws.ConnectAsync($uri, [Threading.CancellationToken]::None).Wait()
Write-Host "β
Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Ρ $Url" -ForegroundColor Green
if ($SubscribeMessage) {
$bytes = [System.Text.Encoding]::UTF8.GetBytes($SubscribeMessage)
$buffer = [System.ArraySegment[byte]]::new($bytes)
$ws.SendAsync($buffer, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, [Threading.CancellationToken]::None).Wait()
Write-Host "β‘ ΠΠΎΠ΄ΠΏΠΈΡΠΊΠ° ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π°: $SubscribeMessage" -ForegroundColor Cyan
}
$bufferSize = 1024
$buffer = New-Object byte[] $bufferSize
$segment = [System.ArraySegment[byte]]::new($buffer)
while ($ws.State -eq [System.Net.WebSockets.WebSocketState]::Open) {
$receiveTask = $ws.ReceiveAsync($segment, [Threading.CancellationToken]::None)
$receiveTask.Wait()
$message = [System.Text.Encoding]::UTF8.GetString($buffer, 0, $receiveTask.Result.Count)
Write-Host "π© ΠΠΎΠ»ΡΡΠ΅Π½ΠΎ: $message"
}
}
catch {
Write-Host "β ΠΡΠΈΠ±ΠΊΠ°: $_" -ForegroundColor Red
}
Write-Host "β³ ΠΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· $ReconnectDelay ΡΠ΅ΠΊΡΠ½Π΄..." -ForegroundColor Yellow
Start-Sleep -Seconds $ReconnectDelay
}
}
# =================================================================================
# --- ΠΠ ΠΠΠΠ ΠΠ‘ΠΠΠΠ¬ΠΠΠΠΠΠΠ― ---
# =================================================================================
# Π Π°ΡΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ API_KEY ΡΠ²ΠΎΠΈΠΌ ΠΊΠ»ΡΡΠΎΠΌ Cryptocompare
# $Url = "wss://streamer.cryptocompare.com/v2?api_key=ΠΠΠ¨_API_KEY"
# $SubscribeMessage = '{"action":"SubAdd","subs":["5~CCCAGG~BTC~USD"]}'
# Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5
ΠΠ°Π½Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ². ΠΠ½ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π»ΡΠ±ΡΡ WebSocket-ΠΏΠΎΡΠΎΠΊΠΎΠ², Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅: ΠΏΡΠΈ ΡΠ°Π·ΡΡΠ²Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. Π‘ΠΊΡΠΈΠΏΡ Π»Π΅Π³ΠΊΠΎ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈΠ»ΠΈ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ , ΠΏΡΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΡΡΡ β Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΡΠ°ΠΉΠ», ΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ JSON ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ .
ΠΠΎΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΊ ΠΊΠΎΠ΄Ρ
- [System.Net.WebSockets.ClientWebSocket] β .NET ΠΊΠ»Π°ΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ WebSocket.
- ConnectAsync β ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
- SendAsync β ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΠΏΠΎΠ΄ΠΏΠΈΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
- ReceiveAsync β ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
- ΠΠ²ΡΠΎΠΏΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ β ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΡΠ΅ΡΠ΅Π· Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ
while ($true)ΠΈStart-Sleep. - ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β Π²ΡΠ²ΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ Ρ ΡΠ²Π΅ΡΠΎΠ²ΠΎΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ.
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ WebSocket
- ΠΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π·Π°ΡΠΈΡΡΠ½Π½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»
wss://. - ΠΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ API-ΠΊΠ»ΡΡΠΈ ΠΈ ΡΠΎΠΊΠ΅Π½Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ.
- Π€ΠΈΠ»ΡΡΡΡΠΉΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
- ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π΄Π°Π½Π½ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΠΉΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ .
- Π’Π΅ΡΡΠΈΡΡΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π·Π°ΡΠ°Π½Π΅Π΅.