File manager - Edit - /home/cipherteam/htdocs/cipherteam.in/API/ew/MarketMap.php
Back
<?php // DataGetter/MarketMap.php /* -------------------- CORS -------------------- This endpoint is called via cross-origin browser AJAX from sharemarketipo.in (and possibly other properties). Must be set before ANY other output. ------------------------------------------------ */ $allowedOrigins = [ 'https://sharemarketipo.in', 'https://applyipo.in', ]; $origin = $_SERVER['HTTP_ORIGIN'] ?? ''; if (in_array($origin, $allowedOrigins, true)) { header('Access-Control-Allow-Origin: ' . $origin); header('Access-Control-Allow-Methods: GET'); header('Access-Control-Allow-Headers: Content-Type'); } $exc = isset($_GET['exc']) ? $_GET['exc'] : 'NSE'; $index = isset($_GET['index']) ? $_GET['index'] : '-44'; $prd = '1D'; // fixed, no duration dropdown $apiUrl = 'https://nw.nuvamawealth.com/edelmw-content/content/new-equity/market-map' . '?sym=' . $index . '&prd=' . $prd; /* -------------------- Robust fetch: real timeouts + one retry -------------------- */ $response = false; $httpCode = null; $curlErr = null; for ($attempt = 1; $attempt <= 2; $attempt++) { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $apiUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 8, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'accept: */*', 'appidkey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOjEsImZmIjoiVyIsImJkIjoid2ViLXBjIiwibmJmIjoxNTc5MjQxODMyLCJzcmMiOiJlbXRtdyIsImF2IjoiMS4wLjAuNCIsImFwcGlkIjoiNGZlNjhiNzUzNjc4NGUzNDA3YzNlY2YxOWJlN2M0YWQiLCJpc3MiOiJlbXQiLCJleHAiOjE2MTA3NzgxMzIsImlhdCI6MTU3OTI0MjEzMn0.IR-PKf1Jjr69bsERFmMeuZrZ2RafBDiTGgKA6Ygofdo', 'content-type: application/json', 'origin: https://www.nuvamawealth.com', 'referer: https://www.nuvamawealth.com/', 'source: EDEL', 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36', ), )); $response = curl_exec($curl); $errno = curl_errno($curl); $curlErr = curl_error($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); if ($errno === 0 && $httpCode === 200 && !empty($response)) break; // success if ($errno === 0 && $httpCode !== 0 && $httpCode < 500) break; // non-5xx rejection — don't retry // else: transient (timeout / 5xx) — loop retries once more } if ($curlErr || $httpCode !== 200 || empty($response)) { echo '<div class="mm-empty"><div class="mm-empty__icon">i</div><div class="mm-empty__text">Connection Error</div><div class="mm-empty__sub">Could not reach data source.</div></div>'; exit; } $data = json_decode($response, true); $d = $data['data'] ?? []; // New API: flat bracket keys with display labels and sign info // Order: worst to best $bracketDefs = [ 'null_to_neg5' => ['Below -5%', false], 'neg5_to_neg3' => ['-5% to -3%', false], 'neg3_to_zero' => ['-3% to 0%', false], 'zero_to_pos3' => ['0% to +3%', true], 'pos3_to_pos5' => ['+3% to +5%', true], 'pos5_to_null' => ['Above +5%', true], ]; // Build bracket array matching old structure $brackets = []; foreach ($bracketDefs as $key => [$label, $isPos]) { $stocks = $d[$key] ?? []; $brackets[] = [ 'DisplayText' => $label, 'isPos' => $isPos, 'Count' => count($stocks), 'Stocks' => $stocks, ]; } // Total and max for bar scaling $total = 0; $maxCnt = 0; foreach ($brackets as $b) { $total += $b['Count']; if ($b['Count'] > $maxCnt) $maxCnt = $b['Count']; } if ($total === 0): ?> <div class="mm-empty"> <div class="mm-empty__icon">i</div> <div class="mm-empty__text">No Data Found</div> <div class="mm-empty__sub">Try a different index.</div> </div> <?php else: // Default active bracket: zero_to_pos3 (index 3) $defaultNo = 4; // 1-based; zero_to_pos3 is 4th ?> <!-- ── Bracket distribution card ── --> <div class="mm-brackets-card"> <div class="mm-brackets-card__head"> <span class="mm-head__label">Distribution</span> <span class="mm-head__total"><?php echo $total; ?> stocks</span> </div> <?php $no = 1; foreach ($brackets as $row): $DisplayText = htmlspecialchars($row['DisplayText'], ENT_QUOTES); $Counts = $row['Count']; $isPos = $row['isPos']; $barPct = $maxCnt > 0 ? ($Counts / $maxCnt) * 100 : 0; $propPct = $total > 0 ? round(($Counts / $total) * 100) : 0; $isDefault = ($no === $defaultNo); ?> <label class="mm-bracket <?php echo $isDefault ? 'mm-bracket--active' : ''; ?>" id="mm_bracket_<?php echo $no; ?>" onclick="showHideRow('<?php echo $no; ?>')"> <input type="radio" name="mmBracket" value="<?php echo $no; ?>" <?php echo $isDefault ? 'checked' : ''; ?> class="mm-bracket__radio" /> <div class="mm-bracket__radio-box"></div> <div class="mm-bracket__body"> <div class="mm-bracket__label"><?php echo $DisplayText; ?></div> <div class="mm-bracket__bar-wrap"> <div class="mm-bracket__bar mm-bracket__bar--<?php echo $isPos ? 'pos' : 'neg'; ?>" style="width:<?php echo $barPct; ?>%"></div> </div> </div> <div class="mm-bracket__count"> <div class="mm-bracket__count-val"><?php echo $Counts; ?></div> <div class="mm-bracket__count-pct"><?php echo $propPct; ?>%</div> </div> </label> <?php $no++; endforeach; ?> </div> <!-- ── Stock lists (one per bracket) ── --> <?php $no = 1; foreach ($brackets as $row): $Stocks = $row['Stocks']; $DisplayText = htmlspecialchars($row['DisplayText'], ENT_QUOTES); $Counts = $row['Count']; $isDefault = ($no === $defaultNo); ?> <div class="mm-stocks" id="mm_stocks_<?php echo $no; ?>" style="display:<?php echo $isDefault ? 'block' : 'none'; ?>;"> <div class="mm-stocks__head"> <div class="mm-stocks__title"> Stocks <em>in</em> <?php echo $DisplayText; ?> </div> <div class="mm-stocks__count"><?php echo $Counts; ?></div> </div> <div class="tbl-head"> <div class="tbl-head__col tbl-head__col--name">Company</div> <div class="tbl-head__col tbl-head__col--ltp">LTP</div> <div class="tbl-head__col tbl-head__col--chng">Change</div> </div> <?php if (empty($Stocks)): ?> <div class="mm-empty-small">No stocks in this bracket.</div> <?php else: foreach ($Stocks as $i => $inner): // New API fields: cname, ltp, change, changeP $SName = htmlspecialchars(trim($inner['cname'] ?? ''), ENT_QUOTES); $LTP = htmlspecialchars($inner['ltp'] ?? '', ENT_QUOTES); $Chng = floatval($inner['change'] ?? 0); $PChng = floatval($inner['changeP'] ?? 0); $rank = $i + 1; $delay = number_format(min($i, 20) * 0.025, 3); if ($PChng > 0) { $dir = 'up'; $pct = '+' . number_format($PChng, 2) . '%'; $abs = '+' . number_format($Chng, 2); } elseif ($PChng < 0) { $dir = 'down'; $pct = number_format($PChng, 2) . '%'; $abs = number_format($Chng, 2); } else { $dir = 'flat'; $pct = '0.00%'; $abs = '0.00'; } ?> <div class="sr" style="animation-delay:<?php echo $delay; ?>s"> <div class="sr__rank"><?php echo $rank; ?></div> <div class="sr__name"><?php echo $SName; ?></div> <div class="sr__ltp"><?php echo $LTP; ?></div> <div class="sr__change"> <span class="sr__pct sr__pct--<?php echo $dir; ?>"> <?php if ($dir === 'up'): ?> <svg class="sr__arrow" viewBox="0 0 10 10"><polyline points="2,7 5,3 8,7" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg> <?php elseif ($dir === 'down'): ?> <svg class="sr__arrow" viewBox="0 0 10 10"><polyline points="2,3 5,7 8,3" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg> <?php else: ?> <svg class="sr__arrow" viewBox="0 0 10 10"><line x1="2" y1="5" x2="8" y2="5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg> <?php endif; ?> <?php echo $pct; ?> </span> <span class="sr__abs sr__abs--<?php echo $dir; ?>"><?php echo $abs; ?></span> </div> </div> <?php endforeach; endif; ?> </div> <?php $no++; endforeach; endif; ?> <style> .mm-brackets-card { background:var(--surface); border:1px solid var(--accent-hair); border-radius:var(--radius); padding:10px 14px 10px 18px; margin-bottom:10px; box-shadow:0 2px 0 rgba(0,0,0,0.02); position:relative; overflow:hidden; } .mm-brackets-card::before { content:""; position:absolute; left:0; top:0; bottom:0; width:4px; background:var(--accent); } .mm-brackets-card__head { display:-webkit-box; display:-webkit-flex; display:flex; -webkit-box-pack:justify; -webkit-justify-content:space-between; justify-content:space-between; -webkit-box-align:baseline; -webkit-align-items:baseline; align-items:baseline; padding:4px 0 10px; border-bottom:1px solid var(--accent-hair); margin-bottom:4px; } .mm-head__label { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:0.12em; color:var(--accent-dark); opacity:0.8; } .mm-head__total { font-family:'JetBrains Mono',monospace; font-size:11px; font-weight:600; color:var(--accent-deep); letter-spacing:-0.01em; } .mm-bracket { display:-webkit-box; display:-webkit-flex; display:flex; -webkit-box-align:center; -webkit-align-items:center; align-items:center; gap:10px; padding:9px 8px; cursor:pointer; border-radius:var(--radius-sm); -webkit-transition:background .15s ease; transition:background .15s ease; margin:0 -8px; } .mm-bracket:hover { background:var(--accent-softer); } .mm-bracket--active { background:var(--accent-softer); } .mm-bracket__radio { position:absolute; opacity:0; pointer-events:none; } .mm-bracket__radio-box { width:16px; height:16px; border-radius:50%; border:1.5px solid var(--accent-light); -webkit-flex-shrink:0; flex-shrink:0; position:relative; -webkit-transition:border-color .15s ease,background .15s ease; transition:border-color .15s ease,background .15s ease; } .mm-bracket--active .mm-bracket__radio-box { border-color:var(--accent); background:var(--accent); } .mm-bracket--active .mm-bracket__radio-box::after { content:""; position:absolute; inset:3px; border-radius:50%; background:#fff; } .mm-bracket__body { -webkit-box-flex:1; -webkit-flex:1; flex:1; min-width:0; display:-webkit-box; display:-webkit-flex; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -webkit-flex-direction:column; flex-direction:column; gap:4px; } .mm-bracket__label { font-family:'DM Sans',sans-serif; font-size:11px; font-weight:600; color:var(--accent-deep); letter-spacing:-0.01em; } .mm-bracket--active .mm-bracket__label { color:var(--accent); } .mm-bracket__bar-wrap { width:100%; height:7px; background:var(--accent-softer); border-radius:999px; overflow:hidden; } .mm-bracket__bar { height:100%; border-radius:999px; -webkit-transition:width .4s ease; transition:width .4s ease; } .mm-bracket__bar--pos { background:var(--buy); } .mm-bracket__bar--neg { background:var(--sell); } .mm-bracket__count { -webkit-flex-shrink:0; flex-shrink:0; text-align:right; min-width:42px; } .mm-bracket__count-val { font-family:'JetBrains Mono',monospace; font-size:13px; font-weight:700; color:var(--ink); letter-spacing:-0.02em; line-height:1; } .mm-bracket__count-pct { font-family:'JetBrains Mono',monospace; font-size:9px; font-weight:600; color:var(--ink-3); margin-top:2px; } .mm-stocks { background:var(--surface); border:1px solid var(--accent-hair); border-radius:var(--radius); overflow:hidden; box-shadow:0 2px 0 rgba(0,0,0,0.02); margin-bottom:12px; position:relative; animation:mmIn .3s ease; } .mm-stocks::before { content:""; position:absolute; left:0; top:0; bottom:0; width:4px; background:var(--accent); } @keyframes mmIn { from { opacity:0; -webkit-transform:translateY(6px); transform:translateY(6px); } to { opacity:1; -webkit-transform:translateY(0); transform:translateY(0); } } .mm-stocks__head { display:-webkit-box; display:-webkit-flex; display:flex; -webkit-box-align:baseline; -webkit-align-items:baseline; align-items:baseline; -webkit-box-pack:justify; -webkit-justify-content:space-between; justify-content:space-between; padding:12px 14px 10px 18px; background:var(--accent-softer); border-bottom:1px solid var(--accent-hair); gap:8px; } .mm-stocks__title { font-family:'Fraunces',serif; font-size:14px; font-weight:500; color:var(--accent-deep); letter-spacing:-0.01em; } .mm-stocks__title em { font-style:italic; font-weight:400; color:var(--accent-dark); opacity:0.7; } .mm-stocks__count { font-family:'JetBrains Mono',monospace; font-size:11px; font-weight:700; color:var(--accent); background:var(--surface); padding:3px 9px; border-radius:999px; border:1px solid var(--accent-hair); } .tbl-head { display:-webkit-box; display:-webkit-flex; display:flex; -webkit-box-align:center; -webkit-align-items:center; align-items:center; padding:9px 14px 9px 18px; border-bottom:1px solid var(--accent-hair); gap:10px; } .tbl-head__col { font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:0.10em; color:var(--accent-dark); opacity:0.75; } .tbl-head__col--name { -webkit-box-flex:1; -webkit-flex:1; flex:1; } .tbl-head__col--ltp { width:64px; text-align:right; } .tbl-head__col--chng { width:88px; text-align:right; } .sr { display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex; -webkit-box-align:center; -webkit-align-items:center; align-items:center; padding:10px 14px 10px 12px; border-bottom:1px solid var(--accent-hair); gap:10px; animation:rowIn .3s ease backwards; -webkit-transition:background .15s ease; transition:background .15s ease; } .sr:last-child { border-bottom:none; } .sr:hover { background:var(--accent-softer); } @keyframes rowIn { from { opacity:0; -webkit-transform:translateX(-5px); transform:translateX(-5px); } to { opacity:1; -webkit-transform:translateX(0); transform:translateX(0); } } .sr__rank { width:20px; -webkit-flex-shrink:0; flex-shrink:0; font-family:'JetBrains Mono',monospace; font-size:10px; font-weight:600; color:var(--accent-light); text-align:center; line-height:1; } .sr__name { -webkit-box-flex:1; -webkit-flex:1; flex:1; min-width:0; font-family:'DM Sans',sans-serif; font-size:13px; font-weight:500; color:var(--accent-deep); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .sr__ltp { -webkit-flex-shrink:0; flex-shrink:0; width:64px; text-align:right; font-family:'JetBrains Mono',monospace; font-size:12px; font-weight:600; color:var(--ink); letter-spacing:-0.01em; } .sr__change { -webkit-flex-shrink:0; flex-shrink:0; width:84px; display:-webkit-box; display:-webkit-flex; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -webkit-flex-direction:column; flex-direction:column; -webkit-box-align:end; -webkit-align-items:flex-end; align-items:flex-end; gap:2px; } .sr__pct { display:-webkit-inline-box; display:-webkit-inline-flex; display:inline-flex; -webkit-box-align:center; -webkit-align-items:center; align-items:center; gap:3px; font-family:'JetBrains Mono',monospace; font-size:11px; font-weight:700; padding:3px 8px 3px 5px; border-radius:999px; white-space:nowrap; letter-spacing:-0.02em; line-height:1; } .sr__pct--up { color:var(--buy); background:var(--buy-bg); } .sr__pct--down { color:var(--sell); background:var(--sell-bg); } .sr__pct--flat { color:var(--ink-3); background:var(--accent-soft); } .sr__arrow { width:10px; height:10px; -webkit-flex-shrink:0; flex-shrink:0; } .sr__abs { font-family:'JetBrains Mono',monospace; font-size:9.5px; font-weight:500; letter-spacing:-0.01em; opacity:0.55; white-space:nowrap; padding-right:2px; } .sr__abs--up { color:var(--buy); } .sr__abs--down { color:var(--sell); } .sr__abs--flat { color:var(--ink-3); } .mm-empty-small { padding:20px 16px; text-align:center; font-size:11.5px; color:var(--ink-3); font-style:italic; } .mm-empty { padding:30px 20px; text-align:center; background:var(--surface); border:1px dashed var(--accent-light); border-radius:var(--radius); } .mm-empty__icon { width:48px; height:48px; margin:0 auto 12px; border-radius:50%; background:var(--accent); color:#fff; display:-webkit-box; display:-webkit-flex; display:flex; -webkit-box-align:center; align-items:center; -webkit-box-pack:center; justify-content:center; font-family:'Fraunces',serif; font-size:24px; font-style:italic; } .mm-empty__text { font-family:'Fraunces',serif; font-size:16px; color:var(--accent-deep); font-weight:500; } .mm-empty__sub { margin-top:4px; font-size:12px; color:var(--accent-dark); opacity:0.75; } </style>
| ver. 1.4 |
Github
|
.
| PHP 8.2.9 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings