KRX asp 서비스를 이용한 주가정보 가져오기
KRX에서 제공하는 상장기업지원서비스를 이용해 주가 정보를 가져오고자 한다. 이용 전 https://kasp.krx.co.kr/index.jsp 에서 회원가입 후 ASP 서비스 신청을 미리 해둬야 한다.
관련 PHP 코드는 아래와 같다.
<?php
function setCacheFile($fileName, $valName, $target)
{
$dir = dirname($fileName);
if (!is_dir($dir) || !is_writable($dir))
return false;
// Serializing Targeted Data
$target = base64_encode(serialize($target));
// Writing to Cache File
$fp = fopen($fileName, 'w+');
fwrite($fp, '<?php ');
fwrite($fp, '$' . $valName . ' = unserialize(base64_decode("' . $target . '"));');
fclose($fp);
return true;
}
function getKRXStockInfo()
{
$url = 'http://asp1.krx.co.kr/servlet/krx.asp.XMLSise?code=' . STOCK_CODE;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$return = curl_exec($ch);
if (curl_errno($ch))
return 'Curl error: '.curl_errno($ch);
curl_close($ch);
$return = trim($return);
$data = simplexml_load_string($return);
if (!$data)
return 'XML error';
$info = array();
/*
JongName: 종목명
CurJuka: 현재가
Debi: 전일대비
DungRak: 부호처리
1 - 상한, 2 - 상승, 3 - 보합,
4 - 하한, 5 - 하락
PrevJuka: 전일종가
Volume: 거래량
Money: 거래대금
StartJuka: 시가
HighJuka: 고가
LowJuka: 저가
High52: 52주 최고
Low52: 52주 최저
UpJuka: 상한가
DownJuka: 하한가
Per: PER
Amount: 상장주식수
FaceJuka: 액면가
*/
foreach ($data->TBL_StockInfo[0] ->attributes() as $k => $v) {
$info[$k] = current($v);
}
$cJuka = preg_replace('#[^\d\.]#', '', $info['CurJuka']);
$debi = preg_replace('#[^\d\.]#', '', $info['Debi']);
// 기준가 = 당일종가(현재가) - 전일대비
switch ($info['DungRak']) {
case '1':
case '2':
case '3':
$sPrice = $cJuka - $debi;
break;
case '4':
case '5':
$sPrice = $cJuka + $debi;
break;
default:
break;
}
// 등락률 = (당일종가 - 기준가) / 기준가 * 100
$info['dRate'] = sprintf("%.2f", (($cJuka - $sPrice) / $sPrice) * 100);
return $info;
}
function getStockInfo()
{
// cache 처리
$result = false;
$cache = '/cache/stockInfo.php';
if (is_file($cache)) {
$mtime = filemtime($cache);
// 캐시 10분 유지
if ($mtime < (time() - 600)) {
unlink($cache);
$info = getKRXStockInfo();
$result = setCacheFile($cache, 'info', $info);
} else {
$result = true;
}
} else {
$info = getKRXStockInfo();
$result = setCacheFile($cache, 'info', $info);
}
if ($result)
require_once($cache);
else
$info = getKRXStockInfo();
return $info;
}
KRX 상장기업지원서비스 사이트의 공지에 자사주시세정보를 2021년 6월 30일까지만 제공한다고 한다. 이 후에는 위 코드를 사용할 수 없을 것으로 예상된다.