WinINet是另一個M$在IE3以後加到Win32 API家族的成員, 功用就是提供
HTTP/FTP等IE使用的底層功能。不用白不用, 反正用起來也不困難(如果看過
M$出的Internet Client SDK的話:Q).
底下就是一個使用WinINet API去跟台灣證券交易所的CGI打交道的小程式,
會幫你把指定的日期範圍內的所有證券交易成交統計資料(每五分鐘統計一次的數據)
從證交所抓回來作成HTML index pages. (還不夠酷, 想自己做成交量分析圖的人
自己寫程式畫圖吧!)
只有一個原始碼檔案, 請存成DQuery.dpr.
ps. 這是我在某個傢伙的哀求下心不甘情不願的湊出來的東西, 歡迎大家好好利用:Q
program dquery;
uses Windows, SysUtils, WinInet, Classes;
var
accepts : array[0..8] of pchar;
exheaders : string =
'Accept-Language: zh-tw,en-us;q=0.7,ja;q=0.3'#13#10+
'Content-Type: application/x-www-form-urlencoded'#13#10+
'Accept-Encoding: gzip, deflate';
function CarePath(optional:string):string;
var
j : integer;
begin
j:=1;
while (j<=length(optional)) do
begin
case optional[j] of
'\' : optional[j]:='/';
end;
inc(j);
end;
result:=optional;
end;
procedure GetPost(const hConnect : HINTERNET;
const year, month, day:integer;
const labeltext,progid:string;var linkpage:string);
var
optional, s :string;
hRequest : HINTERNET;
buffer : array[0..32767] of char;
size, count : dword;
t : text;
begin
s:=format('%d%d\%d%d%d\%s.htm',[year,month,year,month,day,progid]);
if fileexists(s) then
begin
linkpage:=linkpage+
format('<A HREF="../%s">%s</A><BR>'#13#10,
[CarePath(s),labeltext]);
end else
begin
hRequest:=HttpOpenRequest(hConnect, 'POST',
pchar('/cgi-bin/mi/'+progid),
'HTTP/1.1',
pchar('http://tse.com.tw/cgi-bin/mi/menus?LANGUAGE=C&PROGRAM='+progid),
@accepts,
INTERNET_FLAG_KEEP_CONNECTION, 0);
if hRequest=nil then
begin
writeln('HttpOpenRequest failed');
abort;
end;
Optional:=format(
'LANGUAGE=C&YEAR=%d&MONTH=%d&DAY=%d&SUBMIT=%s',
[year, month, day, '%ACd%B8%DF']);
writeln('POST '''+optional+''' to '+progid);
if not HttpSendRequest(hRequest, pchar(exheaders),
length(exheaders), pchar(Optional), length(Optional)) then
begin
writeln('HttpSendRequest failed');
abort;
end;
assignfile(t, s);
rewrite(t);
size:=0;
while true do
begin
if not InternetReadFile(hRequest, @buffer, sizeof(buffer), count) then
begin
writeln('InternetReadFile failed');
close(t);
erase(t);
abort;
end;
if count=0 then
begin
writeln(t);
close(t);
if pos('錯誤訊息', buffer)>0 then
begin
erase(t);
abort;
end;
if size=0 then erase(t);
linkpage:=linkpage+
format('<A HREF="../%s">%s</A><BR>'#13#10,
[CarePath(s),labeltext]);
break;
end;
buffer[count]:=#0;
write(t,buffer);
inc(size,count);
end;
end;
end;
var
hInet, hConnect, hRequest : HINTERNET;
s, Optional : string;
i, year, month, day : integer;
categories : TstringList;
buffer : array[0..32767] of char;
count : dword;
types : array[0..0] of string =
('*/*');
t : text;
linkpage, linkpage2 : string;
stock_type_names : array[0..23] of string =
('大盤統計資訊',
'基金',
'認購權證',
'水泥類',
'食品類',
'塑膠類',
'紡織纖維類',
'電機機械類',
'電器電纜類',
'化學工業類',
'玻璃陶瓷類',
'造紙類',
'鋼鐵類',
'橡膠類',
'汽車類',
'電子類',
'營造建材類',
'運輸類',
'觀光類',
'金融保險類',
'百貨貿易類',
'綜合類',
'其它類',
'可轉換公司債'
);
items : array[0..23] of string =
('MS',
'00',
'05', //認購權證
'11', //水泥類
'12', //食品類
'13', //塑膠類
'14', //紡織纖維類
'15', //電機機械類
'16', //電器電纜類
'17', //化學工業類
'18', //玻璃陶瓷類
'19', //造紙類
'20', //鋼鐵類
'21', //橡膠類
'22', //汽車類
'23', //電子類
'25', //營造建材類
'26', //運輸類
'27', //觀光類
'28', //金融保險類
'29', //百貨貿易類
'98', //綜合類
'99', //其它類
'CB' //可轉換公司債
);
var
y, m, d, d1, d2: word;
begin
decodedate(date, y, m, d);
try
if paramcount<4 then abort;
year:=strtoint(paramstr(1));
month:=strtoint(paramstr(2));
d1:=strtoint(paramstr(3));
d2:=strtoint(paramstr(4));
except
year:=y;
month:=m;
d1:=1;
d2:=d;
end;
try
if not (year in [85..y]) then abort;
if year<>y then m:=12;
if not (month in [1..m]) then abort;
if (year<>y) or (month<>m) then
case month of
1,3,5,7,8,10,12 : d:=31;
2 : if isleapyear(year) then d:=29 else d:=28;
else d:=30;
end;
if not (d1 in [1..d]) then abort;
if not (d2 in [d1..d]) then abort;
except
writeln('參數錯誤');
exit;
end;
for i:=0 to high(types) do accepts[i]:=pchar(types[i]);
accepts[high(types)+1]:=nil;
hInet:=InternetOpen('Query Downloader',
INTERNET_OPEN_TYPE_DIRECT, NIL, NIL, 0);
if hInet=nil then
begin
writeln('InternetOpen failed.');
exit;
end;
categories:=TStringList.Create;
try
for i:=0 to high(items) do
categories.add(items[i]);
hConnect:=InternetConnect(hInet, 'tse.com.tw',INTERNET_DEFAULT_HTTP_PORT,
NIL, NIL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_KEEP_CONNECTION, 0);
if hConnect=nil then
begin
writeln('InternetConnect failed');
exit;
end;
linkpage2:='';
for day:=d1 to d2 do
begin
linkpage:='';
try
mkdir(format('%d%d',[year,month]));
except
if ioresult<>0 then;
end;
try
mkdir(format('%d%d\%d%d%d',[year,month,year,month,day]));
except
if ioresult<>0 then;
end;
GetPost(hConnect, year, month, day, '前二十名熱門股', 'hot20', linkpage);
GetPost(hConnect, year, month, day, '每五分鐘統計資訊', '5mins', linkpage);
for i:=0 to categories.count-1 do
begin
s:=format('%d%d\%d%d%d\mi_%s.htm',[year,month,year,month,day,categories[i]]);
if fileexists(s) then
begin
linkpage:=linkpage+
format('<A HREF="../%s">%s</A><BR>'#13#10,
[CarePath(s), stock_type_names[i]]);
end else
begin
hRequest:=HttpOpenRequest(hConnect, 'POST',
'/cgi-bin/mi/stock',
'HTTP/1.1',
'http://tse.com.tw/cgi-bin/mi/menus?LANGUAGE=C&PROGRAM=stock',
@accepts,
INTERNET_FLAG_KEEP_CONNECTION, 0);
if hRequest=nil then
begin
writeln('HttpOpenRequest failed');
exit;
end;
Optional:=format(
'LANGUAGE=C&YEAR=%d&MONTH=%d&DAY=%d&CATEGORY=%s&SUBMIT=%s to stock',
[year, month, day, categories[i], '%ACd%B8%DF']);
writeln('POST '+optional);
if not HttpSendRequest(hRequest, pchar(exheaders),
length(exheaders), pchar(Optional), length(Optional)) then
begin
writeln('HttpSendRequest failed');
exit;
end;
assignfile(t, s);
rewrite(t);
while true do
begin
if not InternetReadFile(hRequest, @buffer, sizeof(buffer), count) then
begin
writeln('InternetReadFile failed');
close(t);
erase(t);
exit;
end;
if count=0 then
begin
writeln(t);
close(t);
if pos('錯誤訊息', buffer)>0 then
begin
erase(t);
exit;
end;
linkpage:=linkpage+
format('<A HREF="../%s">%s</A><BR>'#13#10,
[CarePath(s), stock_type_names[i]]);
break;
end;
buffer[count]:=#0;
write(t,buffer);
end;
end;
end;
linkpage:='<BODY>'#13#10+
format('民國%d年%d月%d日台北股市各類股收盤行情<BR>'#13#10,[year,month,day])+
linkpage+'</BODY>'#13#10;
optional:=format('%d%d\mi_%d%d%d.htm', [year,month,year, month, day]);
assign(t, optional);
rewrite(t);
linkpage2:=linkpage2+
format('<A HREF="%s">民國%d年%d月%d日台北股市收盤行情</A><BR>'#13#10,
[CarePath(optional), year, month, day]);
write(t,linkpage);
close(t);
end;
linkpage2:='<BODY>'#13#10+
format('民國%d年%d月台北股市收盤行情<BR>'#13#10,[year,month])+
linkpage2+'</BODY>'#13#10;
optional:=format('mi_%d%d.htm', [year,month]);
assign(t, optional);
rewrite(t);
write(t,linkpage2);
close(t);
finally
InternetCloseHandle(hInet);
categories.free;
end;
end.
--
※ 發信站: 批踢踢實業坊(ptt.twbbs.org)
◆ From: as1po10.tc.ficn