<?php
require_once 'vendor/autoload.php';
use function Amp\Websocket\Client\connect;
use Com\Upstox\Marketdatafeederv3udapi\Rpc\Proto\FeedResponse;
function decodeProtobuf($buffer) {
$feedResponse = new FeedResponse();
if (!empty($buffer)) {
$feedResponse->mergeFromString($buffer);
}
return $feedResponse;
}
function getMarketDataFeedAuthorize() {
$accessToken = '********************';
$url = 'https://api.upstox.com/v3/feed/market-data-feed/authorize';
$headers = [
'Accept: application/json',
'Authorization: Bearer ' . $accessToken
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
return $data['data']['authorized_redirect_uri'] ?? null;
}
function fetchMarketUpdates() {
$url = getMarketDataFeedAuthorize();
if (!$url) die("❌ Authorization failed\n");
echo "🔗 Connecting to WebSocket...\n";
$connection = connect($url);
echo "✅ Connected! Subscribing...\n";
$payload = [
"guid" => uniqid(),
"method" => "sub",
"data" => [
"mode" => "ltpc",
"instrumentKeys" => [
"BSE_INDEX|SENSEX",
"NSE_INDEX|Nifty 50",
"NSE_INDEX|NIFTY MIDCAP 100"
]
]
];
$connection->sendBinary(json_encode($payload));
// Keep listening until we get non-zero LTP
foreach ($connection as $message) {
$payload = $message->buffer();
if (!empty($payload)) {
$decoded = decodeProtobuf($payload);
$dataArray = json_decode($decoded->serializeToJsonString(), true);
$feeds = $dataArray['feeds'] ?? [];
if (!empty($feeds)) {
$ltpBSE = $feeds['BSE_INDEX|SENSEX']['ltp'] ?? 0;
$ltpNifty50 = $feeds['NSE_INDEX|Nifty 50']['ltp'] ?? 0;
$ltpNiftyMidcap = $feeds['NSE_INDEX|NIFTY MIDCAP 100']['ltp'] ?? 0;
if ($ltpBSE > 0 && $ltpNifty50 > 0 && $ltpNiftyMidcap > 0) {
$result = [
"BSE SENSEX" => [
"ltp" => $ltpBSE,
"plusminusval" => $ltpBSE - ($feeds['BSE_INDEX|SENSEX']['close'] ?? 0),
"percentage" => ($feeds['BSE_INDEX|SENSEX']['close'] ?? 1) != 0 ? round(($ltpBSE - $feeds['BSE_INDEX|SENSEX']['close']) / $feeds['BSE_INDEX|SENSEX']['close'] * 100, 2) : 0
],
"Nifty 50" => [
"ltp" => $ltpNifty50,
"plusminusval" => $ltpNifty50 - ($feeds['NSE_INDEX|Nifty 50']['close'] ?? 0),
"percentage" => ($feeds['NSE_INDEX|Nifty 50']['close'] ?? 1) != 0 ? round(($ltpNifty50 - $feeds['NSE_INDEX|Nifty 50']['close']) / $feeds['NSE_INDEX|Nifty 50']['close'] * 100, 2) : 0
],
"Nifty Midcap 100" => [
"ltp" => $ltpNiftyMidcap,
"plusminusval" => $ltpNiftyMidcap - ($feeds['NSE_INDEX|NIFTY MIDCAP 100']['close'] ?? 0),
"percentage" => ($feeds['NSE_INDEX|NIFTY MIDCAP 100']['close'] ?? 1) != 0 ? round(($ltpNiftyMidcap - $feeds['NSE_INDEX|NIFTY MIDCAP 100']['close']) / $feeds['NSE_INDEX|NIFTY MIDCAP 100']['close'] * 100, 2) : 0
]
];
echo json_encode(['code' => 1, 'data' => $result], JSON_PRETTY_PRINT);
$connection->close();
break;
}
}
}
}
}
fetchMarketUpdates();