1 votos

AppleScript obteniendo texto de (tipo) de archivo json

Estoy tratando de obtener dos valores de una API de IP, el geo sin caracteres adicionales y "isproxy"

el resultado está en este formato :

Resultado:
"{\"ipVersion\":4,\"ipAddress\":\"8.8.8.8\",\"latitude\":37.386051,\"longitude\":-122.083847,\"countryName\":\"Estados Unidos de América\",\"countryCode\":\"US\",\"timeZone\":\"-08:00\",\"zipCode\":\"94035\",\"cityName\":\"Mountain View\",\"regionName\":\"California\",\"isProxy\":false,\"continent\":\"Américas\",\"continentCode\":\"AM\"}"

Intenté esto pero no puedo obtener el valor correcto de isProxy, en este caso devuelve ""continent\":\"Américas"" y en mi intento anterior era "n"

    -- Nuevos datos de IP
-- Establecer la URL base para la API
establecer baseURL a "https://freeipapi.com/api/json/"
establecer isProxy a ""
-- Ejemplo: Obtener información para una dirección IP específica
establecer transactionIP a "8.8.8.8" -- Reemplazar con la dirección IP que desee consultar

-- Crear la URL completa de la API
establecer apiUrl a baseURL & transactionIP

-- Hacer la solicitud a la API
establecer apiResponse a do shell script "curl " & forma citada de apiUrl

-- Función para extraer el valor de una clave específica de un JSON
en extractFromJSON(jsonString, key)
    establecer keyString a "\"" & key & "\":"
    establecer keyValue a texto ((desplazamiento de keyString en cadena JSON) + (longitud de keyString)) hasta -1 de cadena JSON
    establecer delimitadores de elementos de texto de AppleScript a ","
    establecer keyValueList a ítems de texto de keyValue
    repetir con i de 1 a contar de keyValueList
        si el ítems de keyValueList i contiene "\"" luego
            establecer keyValue a ítems de keyValueList i
            salir del repetir
        fin si
    fin repetir
    establecer delimitadores de elementos de texto de AppleScript a "\""
    return texto 2 hasta -2 de keyValue
end extractFromJSON

-- Extraer valores
establecer countryCode a extractFromJSON(apiResponse, "countryCode")
establecer isProxyValue a extractFromJSON(apiResponse, "isProxy")

return isProxyValue
si isProxyValue es igual a "false" entonces
    establecer isProxy a " = Proxy"
otro
    establecer isProxy a " = No es un Proxy"
fin si

return countryCode & isProxy

0voto

qarma Puntos 71

Dado que JavaScript puede analizar cadenas JSON nativamente, podemos aprovechar esta capacidad utilizando un fragmento de JXA. También he elegido llamar a la API utilizando un método Objective-C, lo que, en el mejor de los casos, resulta en un código más limpio (aunque veo que el realce de sintaxis de AskDifferent todavía no maneja bien los apóstrofos).

El código a continuación contiene un manejador principal, APIResponse, que recibe un parámetro etiquetado for que debería pasarse una dirección IP para realizar una búsqueda. Si se pasa una cadena vacía o cualquier valor que no sea cadena (por ejemplo, missing value, null, me), entonces envía una solicitud de API al mismo punto final pero sin un cuerpo, lo que indica su documentación que la búsqueda se realizará contra la propia dirección IP del usuario.

Por lo tanto, decidí realizar una búsqueda en la suya, llamando al manejador de la siguiente manera:

set response to the APIResponse for "104.21.94.136"

Este manejador en sí contiene otro manejador incrustado dentro del objeto de script API, llamado response:. Recibe un solo argumento, que será la cadena JSON que se devuelve mediante una solicitud de API. Esta cadena JSON se inserta luego en una llamada JavaScript a JSON.parse(...) como argumento. En un entorno JavaScript, devolvería un Object poblado con entradas de clave-valor. Esto "conecta" directamente con un record de AppleScript, que contiene propiedades y valores.

El valor de retorno general del script es actualmente este record de AppleScript que representa la respuesta a una solicitud de API. Sin embargo, las líneas inmediatamente anteriores a esta extraen todos los campos de respuesta individuales y asignan sus valores a variables de nivel superior con nombres correspondientes.

Por lo tanto, puedes reemplazar la última línea:

return the response

por una que devuelva los campos específicos que estás buscando, por ejemplo:

return [countryCode, isProxy]

#!/usr/bin/env osascript -s s
#・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・#
use framework "Foundation"
use scripting additions
#・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・#
property text item delimiters : {}
property nil : a reference to missing value
#・・・・・・・・・・・・・・・・・・・・・・・・

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X