[delphi] https_file_getter - Indy使ってます。
2011/02/05
2011/02/05
delphi
https
indy
windows
delphiです。ことの発端は、httpsなファイルを取得したいという話から。windowsな環境で、いろいろ工夫すればデフォルトの環境でできるかなと思ったけど、せっかくだからdelphiで。
delphiですとIndy使うと簡単にできるということらしい。
コンソールアプリケーションとして作成してます。
まずは論よりコード
program https_file_getter;
{$APPTYPE CONSOLE}
uses
SysUtils, IdHTTP, IdSSLOpenSSL, Classes;
var
IdHTTP: TIdHTTP;
SSLIO: TIdSSLIOHandlerSocketOpenSSL;
paraCount: integer;
MS: TMemoryStream;// 使ってないけどね。
FS: TFileStream;
url: String;
filename: String;
begin
(*
一番目の引数はターゲットURL
2番目の引数は出力するファイル
*)
try
(*
コマンドライン引数を処理部
*)
begin
// コマンドライン引数の数
paraCount := ParamCount;
if paraCount = 0 then
begin
Writeln('*** 引数[1]必須 url [2]option 出力ファイル名');
exit;
end;
if 0 < paraCount then
begin
// コマンドラインから文字列を取得
url := ParamStr(1);
end;
if 1 < paraCount then
begin
// コマンドラインから文字列を取得
filename := ParamStr(2);
end;
end;
(*
Indyを使っている部分
*)
begin
IdHTTP := TIdHTTP.Create();
SSLIO := TIdSSLIOHandlerSocketOpenSSL.Create(nil); // これじゃないとhttpsできないよ
SSLIO.SSLOptions.Method := sslvSSLv3;
IdHTTP.ReadTimeout := 10000;
IdHTTP.ConnectTimeout := 10000;
IdHTTP.IOHandler := SSLIO;
// filenameがあれば
if 0 < Length(filename) then
begin
// fmCreate : ファイルがなければ作成、あれば再作成
FS := TFileStream.Create(filename, fmCreate);
// これだけストリーム書き出せるけど、巨大なファイル対応できる?
IdHTTP.Get(url, FS);
FS.Free;// これ必要?
end
else
begin
// 標準出力するだけ
Write(IdHTTP.Get(url));
end;
end; // Indy使ってる部分終了
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
(*
どこまで大きいファイルに対応できてるんだろう?
*)
{$APPTYPE CONSOLE}
uses
SysUtils, IdHTTP, IdSSLOpenSSL, Classes;
var
IdHTTP: TIdHTTP;
SSLIO: TIdSSLIOHandlerSocketOpenSSL;
paraCount: integer;
MS: TMemoryStream;// 使ってないけどね。
FS: TFileStream;
url: String;
filename: String;
begin
(*
一番目の引数はターゲットURL
2番目の引数は出力するファイル
*)
try
(*
コマンドライン引数を処理部
*)
begin
// コマンドライン引数の数
paraCount := ParamCount;
if paraCount = 0 then
begin
Writeln('*** 引数[1]必須 url [2]option 出力ファイル名');
exit;
end;
if 0 < paraCount then
begin
// コマンドラインから文字列を取得
url := ParamStr(1);
end;
if 1 < paraCount then
begin
// コマンドラインから文字列を取得
filename := ParamStr(2);
end;
end;
(*
Indyを使っている部分
*)
begin
IdHTTP := TIdHTTP.Create();
SSLIO := TIdSSLIOHandlerSocketOpenSSL.Create(nil); // これじゃないとhttpsできないよ
SSLIO.SSLOptions.Method := sslvSSLv3;
IdHTTP.ReadTimeout := 10000;
IdHTTP.ConnectTimeout := 10000;
IdHTTP.IOHandler := SSLIO;
// filenameがあれば
if 0 < Length(filename) then
begin
// fmCreate : ファイルがなければ作成、あれば再作成
FS := TFileStream.Create(filename, fmCreate);
// これだけストリーム書き出せるけど、巨大なファイル対応できる?
IdHTTP.Get(url, FS);
FS.Free;// これ必要?
end
else
begin
// 標準出力するだけ
Write(IdHTTP.Get(url));
end;
end; // Indy使ってる部分終了
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
(*
どこまで大きいファイルに対応できてるんだろう?
*)
最初の引数でurlを指定します。
二番目の引数で、取得したファイル名を指定。
なければ標準出力に出力します。エンコードは気にしてないので、リダイレクトしても役にたたないです。
https(SSL)に対応させるためにオープンソースのライブラリを利用してます。
これないとだめ
ssleay32.dll
libeay32.dll
参考
- Ruminated Rumblings: Indy and HTTPS Post
- Indy : TIdHTTP.Getで文字化けしない方法
- TMemoryStream
- Indy を使って Webサーバのリソースを Getする | ランディネットワーク
- トイ・マップ:【Delphi】 TFileStreamの使い方
- indy.fulgan.com - /ZIP/
- Unicode 版 Delphi (2009 / 2010 / XE) に最新版の Indy10 をインストールする
- Software/OpenSSL for Windows - limber.jp
ちなみに高機能なコマンドにwgetとcurlがあります。windowsならcygwinとかで使えると思う。
wgetとcurlの根本的な違い - ctrlshiftの日記
: