精華區beta PLT 關於我們 聯絡資訊
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