2022-06-25

【Python2】透過郵局 web service 查詢 3+3(6碼) 郵遞區號

參考資料 ----


郵局提供了 web service 方便 大量且快速查詢郵遞區號。

注意:要申請!要申請要申請
1. 開放 個人/團體/企業 申請,但要有固定 IP
2. 要填寫 web service 系統介接申請書,郵局才會將貴公司 IP 列入白名單,貴公司的查詢程式才能正常運作。
 
#!/usr/bin/python
#-*- coding:utf-8 -*-

import requests
import xml.etree.cElementTree as ET

...
...

def main():
    # sAddr = '高雄市前金區'
    # sAddr = '高雄市前金區光復一街'
    sAddr = '完整的地址'
    sZip = GetZip(sAddr)    # 正式
    # sZip = GetZip(sAddr,0)    # 測試
    if(sZip is None):
        print('查詢失敗')
    else:
        print('sZip = '+sZip)


# 郵局 web service, 取得 3+3 郵遞區號
# 傳入的參數 bTest: 執行函數的模式, 預設為 "正式"=1, 若為 0 時, 則列出傳回的各節點(node) 內容
def GetZip(ss, bTest=1):
    mydata = (''
                '<soap12:envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
                    '<soap12:body>'
                        '<getzipcode xmlns="http://tempuri.org/">'
                            '<addrstr>' + ss + '</addrstr>'
                        '</getzipcode>'
                    '</soap12:body>'
                '</soap12:envelope>')
    url = 'http://33wsp.post.gov.tw/lzwzip/tzip33.asmx'
    headers = {'content-type': 'application/soap+xml'}
    response = requests.post(url,data=mydata,headers=headers)
    root = ET.fromstring(response.content)
    sResult = None
    for child in root.iter('*'):
        if(bTest==0):
            print(child.tag, child.text)
        if (child.tag=='{http://tempuri.org/}GetZipCodeResult'):
            if(child.text is None):
                pass
            else:
                if(len(child.text)==6):
                    sResult = child.text
            break
    
    return sResult
 

郵局傳回的內容如下:
 
# 當地址不完整時, 傳回的值為空值 None
('{http://www.w3.org/2003/05/soap-envelope}Envelope', None)
('{http://www.w3.org/2003/05/soap-envelope}Body', None)
('{http://tempuri.org/}GetZipCodeResponse', None)
('{http://tempuri.org/}address', None)


# 當地址完整時
('{http://www.w3.org/2003/05/soap-envelope}Envelope', None)
('{http://www.w3.org/2003/05/soap-envelope}Body', None)
('{http://tempuri.org/}GetZipCodeResponse', None)
('{http://tempuri.org/}GetZipCodeResult', '801002')    # 當有資料成功傳回時, 郵遞區號在這
 


經實驗後,當地址不完整時, web service 會傳回 None 或 3 碼郵遞區號
2022.06.25 測試,之前還會有傳回 3 碼郵區的情況,現在好像只會傳回 None 6 碼郵區

當地址內含有 路/街... 等,即使沒有門牌號碼,郵局 web service 就可能傳回 6 碼郵區,例如:"高雄市前金區光復一街",因此 並不能將 web service 做為判別地址完整性的方法。





沒有留言:

張貼留言