Имея учётную запись в Yandex и Google, можно получить ключ для доступа к API сервисов геолокации. Что с ними делать далее в замтке.
На сервере, к имени которого привязан ключ, размещаем скрипт следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright ©2017 Aleksey Rogov <alex@arogov.com> import requests import json import xml.dom.minidom import cgi import time import sqlite3 keys = ('v_2dzKmERdfe6Q0GRK4CIQ8sR9Ba6iPiQ-5XAPrjFLt7AuF0', '5VbeulhlZ-R-nTlHmv5hX3hrwgB3AqwrBT801p50x2NAB7Y_', 'nSlKdUzNCTDTHEFOCwtrzfo7S1GHuPMPa1AIUSO1ZcoqDqM7') yandex_api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=='; yandex_api_url = 'http://api.lbs.yandex.net/geolocation'; google_api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxx'; google_api_url = "https://www.googleapis.com/geolocation/v1/geolocate?key=" + google_api_key; dbname = 'geoapi.sqlite' params = cgi.FieldStorage() key = params.getfirst('key') provider = params.getfirst('provider') mcc = params.getfirst('mcc') mnc = params.getfirst('mnc') lac = params.getfirst('lac') cellid = params.getfirst('cellid') signal = params.getfirst('signal') print('Content-type: text/html',end='\r\n\r\n') if not key or not provider or not mcc or not mnc or not lac or not cellid or not signal: print('{"status":false,"reason":"arguments missmatch","lat":0,"lng":0,"precision":0,"url":""}') exit() if key not in keys: print('{"status": false,"reason":"invalid key"}') exit() if not mcc.isdigit() or not mnc.isdigit(): print('{"status":false,"reason":"invalid format"}') exit() input_xml = '''xml=<ya_lbs_request> <common> <version>1.0</version> <api_key>%s</api_key> </common> <gsm_cells> <cell> <countrycode>%s</countrycode> <operatorid>%s</operatorid> <cellid>%s</cellid> <lac>%s</lac> <signal_strength>%s</signal_strength> <age>1000</age> </cell> </gsm_cells> </ya_lbs_request>'''%(yandex_api_key, mcc, mnc, cellid, lac, signal) input_json='''{ "homeMobileCountryCode": %s, "homeMobileNetworkCode": %d, "radioType": "gsm", "carrier": "BEELINE", "considerIp": "false", "cellTowers": [ { "cellId": %d, "locationAreaCode": %d, "mobileCountryCode": %s, "mobileNetworkCode": %d, "age": 0, "signalStrength": %s, "timingAdvance": 15 } ] }'''%(mcc, int(mnc), int(cellid, 16), int(lac, 16), mcc, int(mnc), signal) if provider == 'yandex': api_url = yandex_api_url header = {'Content-type': 'application/x-www-form-urlencode'} body = input_xml elif provider == 'google': api_url = google_api_url header = {'Content-Type': 'application/json'} body = input_json r = requests.post(api_url, headers=header, data=body) if not r: print('{"status":true,"reason":"provider error"}') exit() lat = 0 lon = 0 prec = 0 alt = 0 altprec = 0 if provider == 'yandex': xml = xml.dom.minidom.parseString(r.text) xml.normalize() lat = xml.getElementsByTagName('latitude')[0].childNodes[0].nodeValue lon = xml.getElementsByTagName('longitude')[0].childNodes[0].nodeValue prec = xml.getElementsByTagName('precision')[0].childNodes[0].nodeValue alt = xml.getElementsByTagName('altitude')[0].childNodes[0].nodeValue altprec = xml.getElementsByTagName('altitude_precision')[0].childNodes[0].nodeValue print('{"status":true,"lat":' + str(lat) + ',"lng":' + str(lon) + ',"precision":' + str(prec).split('.')[0] + ',"url":"https:\/\/maps.yandex.ru\/?ll=' + str(lon) + ',' + str(lat) + '&pt=' + str(lon) + ',' + str(lat) + '&spn=0.05,0.05&l=sat,skl' + '"}') elif provider == 'google': jsn = json.loads(r.text) lat = jsn['location']['lat'] lon = jsn['location']['lng'] prec = jsn['accuracy'] print('{"status":true,"lat":' + str(lat) + ',"lng":' + str(lon) + ',"precision":' + str(prec).split('.')[0] + ',"url":"https:\/\/www.google.ru\/maps\/@' + str(lat) + ',' + str(lon) + ',15z?hl=ru"}') tnow = int(time.time()) conn = sqlite3.connect(dbname) cur = conn.cursor() cur.execute('INSERT INTO geoapi VALUES(NULL,?,?,?,?,?,?,?,?,?)',(str(tnow),str(mcc),str(mnc),str(lac),str(cellid),str(lat),str(lon),str(alt),str(prec))) conn.commit() conn.close() |
переменным yandex_api_key и google_api_key нужно прописать соответствующие ключи доступа, в переменную keys — ключи клиентов.
Для определения координат нужно сделать следующий GET-запрос: https://mysite/geoapi?key=apikey&provider=yandex&mcc=250&mnc=99&lac=220000&cellid=330000&signal=-81, меняя переменную provider, можно выбрать поставщика услуг геолокации. В ответ сервер вернёт JSON-объект с данными о местоположении:
1 |
{"status":true,"lat":XX.XXXXXXX,"lng":YY.YYYYYYY,"precision":3201,"url":"https:\/\/maps.yandex.ru\/?ll=YY.YYYYYYY,XX.XXXXXXX&pt=YY.YYYYYYY,XX.XXXXXXX&spn=0.05,0.05&l=sat,skl"} |