| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | # SPDX-License-Identifier: AGPL-3.0-or-later"""Apple Maps"""from json import loadsfrom time import timefrom urllib.parse import urlencodefrom searx.network import get as http_getfrom searx.engines.openstreetmap import get_key_labelabout = {    "website": 'https://www.apple.com/maps/',    "wikidata_id": 'Q276101',    "official_api_documentation": None,    "use_official_api": True,    "require_api_key": False,    "results": 'JSON',}token = {'value': '', 'last_updated': None}categories = ['map']paging = Falsesearch_url = "https://api.apple-mapkit.com/v1/search?{query}&mkjsVersion=5.72.53"def obtain_token():    update_time = time() - (time() % 1800)    try:        # use duckduckgo's mapkit token        token_response = http_get('https://duckduckgo.com/local.js?get_mk_token=1', timeout=2.0)        actual_token = http_get(            'https://cdn.apple-mapkit.com/ma/bootstrap?apiVersion=2&mkjsVersion=5.72.53&poi=1',            timeout=2.0,            headers={'Authorization': 'Bearer ' + token_response.text},        )        token['value'] = loads(actual_token.text)['authInfo']['access_token']        token['last_updated'] = update_time    # pylint: disable=bare-except    except:        pass    return tokendef request(query, params):    if time() - (token['last_updated'] or 0) > 1800:        obtain_token()    params['url'] = search_url.format(query=urlencode({'q': query, 'lang': params['language']}))    params['headers'] = {'Authorization': 'Bearer ' + token['value']}    return paramsdef response(resp):    results = []    resp_json = loads(resp.text)    user_language = resp.search_params['language']    for result in resp_json['results']:        boundingbox = None        if 'displayMapRegion' in result:            box = result['displayMapRegion']            boundingbox = [box['southLat'], box['northLat'], box['westLng'], box['eastLng']]        links = []        if 'telephone' in result:            telephone = result['telephone']            links.append(                {                    'label': get_key_label('phone', user_language),                    'url': 'tel:' + telephone,                    'url_label': telephone,                }            )        if result.get('urls'):            url = result['urls'][0]            links.append(                {                    'label': get_key_label('website', user_language),                    'url': url,                    'url_label': url,                }            )        results.append(            {                'template': 'map.html',                'type': result.get('poiCategory'),                'title': result['name'],                'links': links,                'latitude': result['center']['lat'],                'longitude': result['center']['lng'],                'url': result['placecardUrl'],                'boundingbox': boundingbox,                'geojson': {'type': 'Point', 'coordinates': [result['center']['lng'], result['center']['lat']]},                'address': {                    'name': result['name'],                    'house_number': result.get('subThoroughfare'),                    'road': result.get('thoroughfare'),                    'locality': result.get('locality'),                    'postcode': result.get('postCode'),                    'country': result.get('country'),                },            }        )    return results
 |