본문 바로가기

Programming/Project

파이썬으로 홈택스 사업자등록상태조회 프로그램 만들기

기업에 대해서 궁금할 때 홈택스에서 사업자등록번호를 이용해 사업자등록상태조회를 이용하게 된다.

사업자등록상태조회에서는 위의 그림과 같이 사업자의 과세유형(일반/간이)등과 사업자상태(계속/휴업/폐업) 상태를 조회 할 수 있다. 하지만 요청당 5초 제한이 걸려있고 여러개의 사업자 등록번호를 조회해야 할때 일일히 입력하면 시간이 오래 걸리는 부분이 있어 이를 자동화 했다.

통신분석

통신구간을 분석하기 위해 웹브라우저의 개발자도구를 사용하여 요청하는 URL과 Request Data를 확인해 보았다. 사업자 등록번호는 삼성전자의 사업자등록번호를 사용해 조회를 했다.

POST 방식으로 통신을 하는것과 wqAction.do 로 확인되는 요청 URL, 인자값들이 확인되었다. Request Payload에는 내가 조회했던 사업자번호가 <txprDscmNo> 부분에 들어가 있는 것을 볼 수 있다. Response 값은 아래처럼 오게 되는데 조회결과가 trtCntn 에 반환됐음이 확인된다.

<map id='' >
	<map id='resultMsg' >
		<detailMsg></detailMsg>
		<msg></msg>
		<code></code>
		<result>S</result>
	</map>
		<trtEndCd>Y</trtEndCd>
		<smpcBmanEnglTrtCntn>The business registration number is registered</smpcBmanEnglTrtCntn>
		<nrgtTxprYn>N</nrgtTxprYn>
		<smpcBmanTrtCntn>등록되어 있는 사업자등록번호 입니다. </smpcBmanTrtCntn>
		<trtCntn>부가가치세 일반과세자 입니다.</trtCntn>
</map>

개발코드

단순한 URL 요청이기 때문에 개발 코드는 간단하다. 개발자도구를 통해 확인한 요청 URL과 인자값을 선언하고 사업자등록번호 부분만 계속해서 바꿔서 호출하는 코드로 작성하면 된다. ReaData 부분의 txprDSCMNo 에 사업자등록번호를 넣어주기 위해 CRN을 넣어 주었다.

import sys
import requests
import xml.etree.ElementTree as ElementTree

# hometax Reauest Header POST 형식
ReqUrl = "https://teht.hometax.go.kr/wqAction.do?actionId=ATTABZAA001R08&screenId=UTEABAAA13&popupYn=false&realScreenId="
# Reauest Data
ReqData = "<map id=\"ATTABZAA001R08\"><pubcUserNo/><mobYn>N</mobYn><inqrTrgtClCd>1</inqrTrgtClCd><txprDscmNo>\{CRN\}</txprDscmNo><dongCode>85</dongCode><psbSearch>Y</psbSearch><map id=\"userReqInfoVO\"/></map><nts<nts>nts>65AGfuvw27DVJrPbJ8pYRkgFW9OhjQJa3Y3FuhNj6ZlM5"

사업자등록번호를 넣어서 상태를 조회해오는 함수이다. ReaData 에 있는 \{CRN}\ 부분을 replace로 치환하여 조회할 사업자등록번호로 변경을 해준다. xml로 반환되는 값의 "trtCntn" 부분만 결과로 저장해준다. 

# 사업자등록번호(CRN) 으로 등록상태를 조회해오는 부분
def Search_CRN(crn):
    crn = crn.replace("-", "") # URL 요청시 "-" 가 있으면 조회가 안되 replace
    res = requests.post(ReqUrl, data=ReqData.replace("\{CRN\}", crn), headers={'Content-Type': 'text/xml'}) # Request Data 에서 CRN 읽어온 부분 Replace 후 POST 요청
    # print(res.text)
    xml = ElementTree.fromstring(res.text).findtext("trtCntn") # 결과 부분에서 사업자등록상태 부분만 파싱
    result = crn + "\t" + xml.replace("\n", "").replace("\t", " ") + "\n" # 결과저장
    return result

CRN은 파일에서 읽어오거나 변수로 선언하여 replace로 치환해주면 된다. 마지막으로 코드 전문을 첨부한다.

import sys
import requests
import xml.etree.ElementTree as ElementTree

# hometax Reauest Header POST 형식
ReqUrl = "https://teht.hometax.go.kr/wqAction.do?actionId=ATTABZAA001R08&screenId=UTEABAAA13&popupYn=false&realScreenId="
# Reauest Data
ReqData = "<map id=\"ATTABZAA001R08\"><pubcUserNo/><mobYn>N</mobYn><inqrTrgtClCd>1</inqrTrgtClCd><txprDscmNo>\{CRN\}</txprDscmNo><dongCode>85</dongCode><psbSearch>Y</psbSearch><map id=\"userReqInfoVO\"/></map><nts<nts>nts>65AGfuvw27DVJrPbJ8pYRkgFW9OhjQJa3Y3FuhNj6ZlM5"

# 사업자등록번호(CRN) 으로 등록상태를 조회해오는 부분
def Search_CRN(crn):
    crn = crn.replace("-", "") # URL 요청시 "-" 가 있으면 조회가 안되 replace
    res = requests.post(ReqUrl, data=ReqData.replace("\{CRN\}", crn), headers={'Content-Type': 'text/xml'}) # Request Data 에서 CRN 읽어온 부분 Replace 후 POST 요청
    xml = ElementTree.fromstring(res.text).findtext("trtCntn") # 결과 부분에서 사업자등록상태 부분만 파싱
    result = crn + "\t" + xml.replace("\n", "").replace("\t", " ") + "\n" # 결과저장
    return result


inputs = "YOUR_CRN_VALUE"
result += Search_CRN(inputs) # 결과에 한줄씩 붙여넣기

print(result)