Dado que JavaScript puede analizar las cadenas JSON de forma nativa, podemos tomar prestada esta capacidad usando un fragmento de JXA. También he elegido llamar a la API utilizando un método Goal-C, que, al menos, da como resultado un código de aspecto más limpio (aunque veo que el resaltado de sintaxis de AskDiFferent todavía no hace frente a los apóstrofos).
El código a continuación contiene un controlador principal, APIResponse
que toma un etiquetado for
Parámetro que debe pasar una dirección IP para realizar una búsqueda. Si se pasa una cadena vacía o cualquier valor de no cadena (por ejemplo, lacking worth
, null
, me
) Luego envía una solicitud API al mismo punto last pero sin una carga útil, que su documentación indica que la búsqueda se realizará con la dirección IP del usuario.
Por lo tanto, decidí realizar una búsqueda en la suya, llamando al controlador así:
set response to the APIResponse for "104.21.94.136"
Este controlador en sí contiene otro manejador integrado dentro del API
Objeto de script, llamado response:
. Se necesita un solo argumento, que será la cadena JSON que se devuelve por una solicitud de API. Esta cadena JSON se inserta luego en una llamada de JavaScript a JSON.parse(...)
como el argumento. En un entorno de JavaScript, devolvería un Object
poblado con entradas de valor clave. Esto directamente “unir” a un Applecript document
que contiene propiedades y valores.
El valor de retorno basic del script es actualmente este Applecript document
Eso representa la respuesta a una solicitud de API. Sin embargo, las líneas que preceden inmediatamente a este extraer todos los campos de respuesta individuales y asignan sus valores a las variables de nivel superior con los nombres correspondientes.
Por lo tanto, puede reemplazar la línea last:
return the response
Con uno los devuelven los campos específicos que buscas, por ejemplo:
return [countryCode, isProxy]
#!/usr/bin/env osascript -s s
#・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・#
use framework "Basis"
use scripting additions
#・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・#
property textual content merchandise delimiters : {}
property nil : a reference to lacking worth
#・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・#
set response to APIResponse for "104.21.94.136"
set [ipVersion, ipAddress, isProxy, latitude, longitude, timeZone, ¬
countryName, countryCode, zipCode, cityName, regionName, ¬
continent, continentCode] to response's [ipVersion, ipAddress, ¬
isProxy, latitude, longitude, timeZone, countryName, countryCode, ¬
zipCode, cityName, regionName, continent, continentCode]
return the response
#・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・#
## HANDLERS:
on APIResponse for ip_addr
script API
property IPv4 handle : ({} & ip_addr & "")'s string 1
property baseURL : "https://freeipapi.com"
property endpoint : "/api/json/" & IPv4 handle
property requestURL : baseURL & endpoint
on response:(JSON as string)
run script "JSON.parse(" & quoted kind ¬
of JSON & ");" in "JavaScript"
finish response:
finish script
API's response:(my (NSString's stringWithContentsOfURL:(the ¬
URLWithString_(the requestURL of the API) of my NSURL) ¬
encoding:(my NSUTF8StringEncoding) |error|:nil))
finish APIResponse
#・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・#