Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 188. – ICQ status

Jan Šindelář 8.6.2005

Dnešní tip bude opět tak trochu ukázkou využití komponent Indy, i když příklad lze provést pomocí libovolných TCP/IP síťových komponent, takže použijte takové, které máte vyzkoušené a oblíbené. Velice jednoduchým způsobem se naučíme zjišťovat status uživatelů ICQ.

V úvodu si nejprve řekneme, co bude náš dnešní příklad umět, jak toho dosáhnout a jaká má program omezení. Naše dnešní ukázka si klade za cíl zjistit stav libovolného uživatele ICQ, tedy zda je online či offline, a zobrazit příslušnou indikační ikonku, kterou si stáhne ze serveru ICQ.

I když se to může zdát na první poslech poměrně komplikované, nemusíte mít strach, že se ponoříme do tajů protokolů ICQ, protože vše podstatné za nás zařídí samotný systém ICQ sám. Možná jste si na některých webových stránkách všimli toho, že autor na ně umístil tzv. ICQ Status Indicator, což není nic jiného, než malý obrázek, který zobrazuje stav, zda je uživatel (tedy autor stránek) právě online. Dá se to udělat díky existenci serveru status.icq.com, který zjistí vše potřebné a vrátí na výstupu patřičný obrázek. Na příslušných stránkách ICQ si můžete vygenerovat jednoduchý kód pro vaše UIN, který poté vložíte na své stránky a máte indikátor hotov.

Díky existenci tohoto serveru však můžeme zjišťovat status i programově (ať už v Delphi, jako v tomto případě, a nebo například i v PHP a status pak zobrazovat pomocí vlastních obrázků). Jednoduchým příkazem tedy odešleme serveru URL, kde bude hlavním parametrem UIN uživatele a jako odpověď dostaneme příslušný GIF obrázek.

Jaká jsou omezení? Jsou vlastně dvě. První se týká přímo systému ICQ jako takového. Abychom mohli zjistit status uživatele, musí mít ve svém ICQ klientovi povolenu indikaci online stavu prostřednictvím webových stránek (tzv. Web Aware příznak, pojmenování se pochopitelně může lišit v závislosti na použitém programu). Má-li uživatel tuto indikaci zakázánu, nezjistíme pochopitelně nic. Druhé omezení se pak týká přímo Delphi, ale o tom až později.

Jak bude tedy vypadat náš program? Bude obsahovat celkem tři komponenty. Tlačítko, kterým jako obvykle celou akci spustíme, dále komponentu Image, která bude zobrazovat indikační obrázek a konečně komponentu IdHTTP, čímž se opět dostáváme k balíku Indy. Tato komponenta bude zodpovědná za komunikaci se serverem, přičemž odešle jednoduchý požadavek typu GET a zachytí odpověď v podobě obrázku. Ten bude uložen na disk a převezme si jej a zobrazí komponenta Image. URL našeho požadavku má následující tvar:

http://status.icq.com/online.gif?icq=XXXXXXXX&img=Y

přičemž za X dosadíme příslušné UIN a hodnota Y pak určuje vizuální podobu indikační ikony (na výběr máte z několika variant). Samotný kód s použitím komponenty IdHTTP pak vypadá následovně:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, ExtCtrls;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Status: TFileStream;
begin
  Status := TFileStream.Create(`status.gif`, fmCreate or fmShareDenyNone);
  try
    IdHTTP1.Get(`http://status.icq.com/online.gif?icq=XXXXXXXX&img=2`, Status);
    Image1.Picture.LoadFromFile(`status.gif`);
  finally
    Status.Free;
  end;
end;

end.

Komponentu IdHTTP není třeba v zásadě nijak nastavovat až na jedinou výjimku. Parametr HandleRedirect je třeba nastavit na hodnotu True.

Teď se dostáváme ke druhému omezení, které jsem zmínil v úvodu a které je také důvodem, proč tentokrát není součástí článku ukázkový projekt ke stažení. Problém je v tom, že starší verzi Delphi (přiznám se, že si nejsem jist, jak jsou na tom například Delphi 2005) nepodporují kvůli dříve platným licenčním podmínkám formát GIF.

Proto je nutné stáhnout si některou z volně dostupných GIF komponent, jinak se nám nepodaří obrázek (který se stáhne právě v tomto formátu) zobrazit. Jelikož záleží na tom, jakou verzi Delphi používáte a i kterou komponentu jste si vybrali, nemá cenu dávat k dispozici ukázkový projekt ke stažení. Takto naznačený zdrojový kód úplně postačí.

Funkce je napsána s ohledem na co možná největší přehlednost, pochopitelně nemusíme obrázek ukládat na disk a vlastně ani nemusíme zobrazovat obrázek ze serveru. To, jaký status uživatel má, se můžeme dozvědět i z hlavičky, kterou nám funkce GET (resp. lepší by pak bylo použít funkci HEAD, abychom zbytečně nestahovali data obrázku, i když má jen pár desítek bajtů) vrátí. Bude-li se soubor s obrázkem jmenovat online0.gif, pak je uživatel offline. Název online1.gif pak značí, že je uživatel online. Pak už můžeme místo obrázku zobrazit například jen informační text či obrázek vlastní.