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일까지만 제공한다고 한다. 이 후에는 위 코드를 사용할 수 없을 것으로 예상된다.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.