Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema viendo resultados con uLkJSON (https://www.clubdelphi.com/foros/showthread.php?t=87346)

JuanOrtega 18-12-2014 01:22:25

Problema viendo resultados con uLkJSON
 
Hola estoy usando la el api de shodan para ver resultados en json usando uLkJSON , el problema es que cuando cargo la IP el programa siempre me devuelve el error "Invalid typecast" y se clava ahi.

El codigo es este :

Código Delphi [-]
unit tool;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, Vcl.StdCtrls, IdSSLOpenSSL,
  IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, uLkJSON;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    nave: TIdHTTP;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    GroupBox1: TGroupBox;
    ip: TEdit;
    Button1: TButton;
    GroupBox2: TGroupBox;
    console1: TMemo;
    ssl: TIdSSLIOHandlerSocketOpenSSL;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  api_key: string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  api_key := 'apikey';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  code: string;

var
  js,
  itjs: TlkJSONobject;

var ip_found:string;

begin
  code := nave.Get('https://api.shodan.io/shodan/host/' + ip.Text + '?key='
    + api_key);

  js := TlkJSON.ParseText(code) as TlkJsonObject;

  ip_found := js.getString('ip');

  console1.Lines.Add(ip_found);

end;

end.

Y me devuelve este error :

Código:

Invalid class typecast
¿ Como soluciono esto ?

Neftali [Germán.Estévez] 18-12-2014 10:46:42

Para poder ayudarte habría que saber qué estás pasando al ParseText como parámetro y en qué linea te está fallando exactamente.
Ambas cosas puedes conseguir saberlas ejecutando paso a paso el programa.

Ñuño Martínez 18-12-2014 10:48:52

Código Delphi [-]
js := TlkJSON.ParseText(code) as TlkJsonObject;
No sé qué tipo de dato devuelve el método ParseText (¿STRING?), pero está claro que no es una clase compatible con TlkJsonObject.

Tienes tres posibles soluciones (ninguna garantizada):
  • Cambiar el tipo de dato de js a otro que sí sea compatible con (o el mismo que) el devuelto por ParseText.
  • No usar el operador "AS" sino forzar el tipo de manera estática: js := TlkJsonObject (TlkJSON.ParseText(code));
  • Usar alguna función o método de conversión.

JuanOrtega 18-12-2014 15:00:34

Es en esta linea es el error :

Código Delphi [-]
  ip_found := js.getString('ip');

Neftali [Germán.Estévez] 18-12-2014 15:25:28

Cita:

Empezado por Neftali (Mensaje 486784)
...habría que saber qué estás pasando al ParseText como parámetro.

Vuelvo a reiterar la pregunta.

JuanOrtega 18-12-2014 19:20:30

Verificar si Field existen en uLkJSON
 
Hola tengo el siguiente codigo :

Código Delphi [-]
unit tool;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, Vcl.StdCtrls, IdSSLOpenSSL,
  IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, uLkJSON;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    nave: TIdHTTP;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    GroupBox1: TGroupBox;
    ip: TEdit;
    Button1: TButton;
    GroupBox2: TGroupBox;
    console1: TMemo;
    ssl: TIdSSLIOHandlerSocketOpenSSL;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  api_key: string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  api_key := 'test';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  code: string;

var
  json, json2: TlkJSONobject;
  i: integer;

var
  ip_found, country_found, country_code, region_name, postal_code: string;

var
  ip_str, product, version, data, cpe, timestamp, last_update, port, os, isp,
    ans, banner: string;

begin
  code := nave.Get('https://api.shodan.io/shodan/host/' + ip.Text + '?key='
    + api_key);

  json := TlkJSON.ParseText(code) as TlkJSONobject;

  for i := 0 to json.Field['data'].Count - 1 do
  begin
    console1.Lines.Add('------------------------------------');
    json2 := (json.Field['data'].Child[i] as TlkJSONobject);

    try
      begin
        console1.Lines.Add(json.Field['ip_strz'].SelfTypeName);
      end;
    except
      //
    end;

  end;
end;

end.

El problema es que estoy tratando de verificar si un field existe por ejemplo ip_strz , en el control uso SeldTypeName para ver si es null y asi darme cuenta pero siempre me da error , trate usando try y except pero sigue dando error , el error que siempre da es este :

Código:

Acess violation at adress in module 'shodan.exe' , read of address 000000
¿ Alguien me puede ayudar ?

Casimiro Notevi 18-12-2014 19:49:21

No crees otro hilo para seguir con lo mismo ;)
He unido ambos hilos.


La franja horaria es GMT +2. Ahora son las 00:01:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi