본문 바로가기

기타

[API / Python] Geolocation API_현재 위치좌표 추출

 

Google Maps Platform Geolocation API

https://developers.google.com/maps/documentation/geolocation/overview?hl=ko

Wi-Fi 액세스 포인트, GPS, 기지국 데이터를 결합하여 위치 추적.

매월 100,000 무료제공 (이후 사용량별 금액 청구) _ 미화 0.005달러/ (미화 5.00달러/1,000)

 

* 사용하기 위해서는 Google Cloud 프로젝트 생성 필요. ( + API 사용 설정 / api 발급 필요 )

 

위치정보 요청 응답 개발가이드 :
https://developers.google.com/maps/documentation/geolocation/requests-geolocation?hl=ko&_gl=1*kn8ia4*_up*MQ..*_ga*NjQ2MDc0Njc1LjE3Mzc1MjY1NTQ.*_ga_NRWSTWS78N*MTczNzUzMDI4OS4yLjEuMTczNzUzMDU0OC4wLjAuMA..

 


 

pip install requests  설치.

 

import requests

key = '###########발급받은key#############'
send_url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=' + key

# POST 요청 보내기
r = requests.post(send_url)

# 응답 처리
if r.status_code == 200:
    j = r.json()
    print(j)
    print(j.get('location', 'Location not found'))
else:
    print(f"Error: {r.status_code}, {r.text}")

# 응답결과
# {'location': {'lat': 37.526126, 'lng': 126.922255}, 'accuracy': 91275.98445292684}
# {'lat': 37.526126, 'lng': 126.922255}

=> 요청 파라미터가 없을 시 요청 위치의 ip주소 기반으로 추적한 위치정보 반환. 

아래처럼 위도 / 경도 값을 반환한다. ( 예시로 사용한 좌표는 여의도 공원 )

위도 : 37.526126
경도 : 126.922255

 

이렇게 나온 위도,경도 값인 ' 37.526126, 126.922255 '을 google map에 검색하면 지도에 위치가 뜬다.

 


 

요청 파라미터 없이 결과를 받아보니 실제 위치와 2.04 km 떨어진 지점을 잡는다.
이전에는 차이가 500m정도였는데 이번에는 오차범위가 크다.


Wi-Fi 활성화
GPS 활성화
Wi-Fi 네트워크 밀도가 높은 도심
=> 정확도가 높아짐

요청 파라미터에 내 현재 네트워크 정보 포함시켜보자.

 


 

우선 네트워크 정보 가져오기.
CMD창에 아래 명령어 실행
netsh wlan show networks mode=bssid
=> 사용자의 컴퓨터가 현재 감지할 수 있는 모든 무선 네트워크 및 관련 정보 출력.

현재 내가 사용중인 Wi-Fi 정보가 나온다.
BSSID 는 AB:CD:EF:12:34:56 형태 (무선 네트워크의 고유한 식별자로, 일반적으로 액세스 포인트의 MAC 주소 형식)

 


 

위에서 얻은 MAC주소를 포함시켜 요청.

import requests
from wifiTest import get_bssid_list, format_bssid_list

key = '###########발급받은key#############'
send_url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=' + key


# 요청 본문
payload = {
  "homeMobileCountryCode": 310,	 # 기기의 홈 네트워크의 모바일 국가 코드 (MCC)
  "considerIp": "false",         # IP위치정보로 대체여부(default: false)
  "wifiAccessPoints": [
    {
      "macAddress": "네트워크1_BSSID"
    },
    {
      "macAddress": "네트워크2_BSSID"
    },
    {
      "macAddress": "네트워크3_BSSID"
    }
  ]
}

# POST 요청 보내기 (네트워크정보 포함)
r = requests.post(send_url, json=payload)

# 응답 처리
if r.status_code == 200:
    j = r.json()
    print(j)
    print(j.get('location', 'Location not found'))
else:
    print(f"Error: {r.status_code}, {r.text}")

이제 내가 현재 있는 건물 위치를 정확하게 잡는다.

그런데 네트워크 정보가 적은 경우에는 404에러가 뜬다. 

 


 


현재 잡히는 네트워크들의 모든 BSSID를 긁어모아본다.
wifiTest 컴포넌트 생성

import subprocess # 외부 명령 실행
import re

def get_bssid_list():
    # netsh 명령 실행 (window)    // linux : sudo iwlist wlan0 scanning
    result = subprocess.run(['netsh', 'wlan', 'show', 'networks', 'mode=bssid'], capture_output=True, text=True)
    networks = result.stdout
    print(f"result: {networks}")

    # BSSID 추출
    bssid_list = re.findall(r"BSSID\s+\d+\s+:\s+([0-9A-Fa-f:]{17})", networks)
    return bssid_list


def format_bssid_list(bssid_list):
    # BSSID를 JSON 형태로 변환
    formatted_list = [{"macAddress": bssid} for bssid in bssid_list]
    return formatted_list

# BSSID 출력
bssid = get_bssid_list()
# print(f"BSSIDs: {bssid}")
print(f"json_bssid: {format_bssid_list(bssid)}")

 

대략 아래처럼 모아진다. 
Wi-Fi를 한번 껐다가 켜면 네트워크 여러개가 잘 잡힘! 

[
    {'macAddress': '네트워크1_BSSID'},
    {'macAddress': '네트워크2_BSSID'},
    {'macAddress': '네트워크3_BSSID'},
    {'macAddress': '네트워크4_BSSID'},
    {'macAddress': '네트워크5_BSSID'},
]

 


 

wifiTest 컴포넌트에서 긁어모은 BSSID를 포함시켜 요청.

import requests
from wifiTest import get_bssid_list, format_bssid_list

key = '###########발급받은key#############'
send_url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=' + key


# 요청 본문
payload = {
  "homeMobileCountryCode": 310,	 # 기기의 홈 네트워크의 모바일 국가 코드 (MCC)
  "considerIp": "false",         # IP위치정보로 대체여부(default: false)
}

# BSSID 리스트 가져오기
bssid_list = get_bssid_list()

# JSON 형식으로 변환
formatted_bssid_list = format_bssid_list(bssid_list)

# 결과 출력
payload["wifiAccessPoints"] = formatted_bssid_list

print("payload: ", payload)

# POST 요청 보내기
r = requests.post(send_url, json=payload)

# 응답 처리
if r.status_code == 200:
    j = r.json()
    print(j)
    print(j.get('location', 'Location not found'))
else:
    print(f"Error: {r.status_code}, {r.text}")

 

요청데이터(paylode)는 아래 형태

paylode : {
    "homeMobileCountryCode": 310,
    "considerIp": "false",
    "wifiAccessPoints": [
        {"macAddress": "네트워크1_BSSID"},
        {"macAddress": "네트워크2_BSSID"},
        {"macAddress": "네트워크3_BSSID"},
        {"macAddress": "네트워크4_BSSID"},
        {"macAddress": "네트워크5_BSSID"},
        {"macAddress": "네트워크6_BSSID"},
        {"macAddress": "네트워크7_BSSID"}
    ]
}

 

BSSID가 많을 수록 정확한 위치를 잘 잡는다.

네트워크 공부 더해야겠다.. 


 

https://haru21.tistory.com/entry/%EB%AC%B4%EC%84%A0%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9D%B4%ED%95%B4-5-Chapter4-WLAN-1

 

무선네트워크 이해 (6) - Chapter4. WLAN (1)

무선네트워크 이해 (6) - Chapter4. WLAN Components WIFI 의 기본 적인 내용을 이해 하셨으면 이제 WLAN (Wireless Local Area Network) 를 이제 보시게 될 텐데요. 이번 장은 간단하게 WLAN 용어를 정리해보도록 하겠

haru21.tistory.com