1 {*******************************************************}
3 { DOLIB API Interface Unit }
5 { 2002 Monazilla Project }
6 { Dax mailto:daxmonazilla@yahoo.co.jp }
7 {
\81i
\83q
\81jmailto:gikonavi@ice.dti2.ne.jp }
8 {********************************************************
12 2002/03/02
\83\8d\83O
\83C
\83\93\83G
\83\89\81[
\82ð
\8c\9f\8fo
\82·
\82é
\82æ
\82¤
\82É
\8fC
\90³
\82µ
\82½
\82©
\82à
\81B
13 2002/03/02 DOLIB.dll
\82ð
\8eg
\82í
\82È
\82¢
\82æ
\82¤
\82É
\82µ
\82½
\81B
14 2002/02/27
\83o
\83O
\8fC
\90³ (GetVersion
\82Í
\83R
\83l
\83N
\83g
\82µ
\82Ä
\82È
\82
\82Ä
\82à
\8eæ
\93¾
\89Â
\94\
\82É
\82µ
\82½)
15 2002/01/22 DOLIB 1.00C
\91Î
\89\9e\81B
16 \88È
\89º
\82Ì
\83v
\83\8d\83p
\83e
\83B
\82ð
\92Ç
\89Á
\81B
17 - Session .........
\83Z
\83b
\83V
\83\87\83\93\82Ì
\83|
\83C
\83\93\83^
\82ð
\95Ô
\82µ
\82Ü
\82·
\81A
\91½
\95ª
\8eg
\82í
\82È
\82¢
\81B
18 - SessionID .......
\83Z
\83b
\83V
\83\87\83\93ID
\82ð
\95Ô
\82µ
\82Ü
\82·
\81B
19 - Version ......... DOLIB
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\95Ô
\82µ
\82Ü
\82·
\81B
20 - UserAgent ....... UA
\97p
\82Ì
\95¶
\8e\9a\97ñ Monazilla/x.xx
\82ð
\95Ô
\82µ
\82Ü
\82·
\81B
21 - ErrorCode .......
\83G
\83\89\81[
\83R
\81[
\83h
\82ð
\95Ô
\82µ
\82Ü
\82·
\81B
22 - ErrorMsg ........
\83G
\83\89\81[
\83\81\83b
\83Z
\81[
\83W
\82ð
\95Ô
\82µ
\82Ü
\82·
\81B
23 2002/01/20 Disconnect
\8cã
\82É Connected
\83v
\83\8d\83p
\83e
\83B
\82ð
\96ß
\82µ
\82Ä
\82È
\82©
\82Á
\82½
\81B
24 2002/01/19 DOLIB 1.00B
\91Î
\89\9e\81B
\83f
\81[
\83^
\8eæ
\93¾
\82É
\90¬
\8c÷
\81I
25 2002/01/18 DOLIB 1.00
\91Î
\89\9e\81B
\82µ
\82©
\82µ
\83G
\83\89\81[
\82µ
\82©
\95Ô
\82Á
\82Ä
\97\88\82È
\82¢
\81A
\81A
26 2002/01/18 ghanyan
\8e\81\82Ì
\8f\95\8c¾
\82É
\82æ
\82è
\93®
\8dì
\82·
\82é
\81B
\8a´
\8eÓ
\81I
27 2002/01/09 DOLIB 0.01
\97p
\82É
\8dì
\90¬
\8aJ
\8en
\81B
\82Å
\82à
\93®
\82©
\82È
\82¢
\82Ì
\82Å
\82Ù
\82Á
\82Æ
\82
\81B
36 Windows, SysUtils, WinInet;
39 TDolibSession = class(TObject)
46 property SessionID: string read FSessionID write FSessionID;
47 property ErrorCode: Integer read FErrorCode write FErrorCode;
48 property ErrorString: string read FErrorString write FErrorString;
49 property UserAgent: string read FUserAgent write FUserAgent;
52 TDolib = class(TObject)
54 FSession : TDolibSession;
59 FProxyAddress: string;
61 function GetSessionID: string;
62 function GetVersion: string;
63 function GetUserAgent: string;
64 function GetErrorCode: integer;
65 function GetErrorMsg: string;
66 procedure MakeError(Session: TDolibSession; Error: DWORD);
67 procedure DOLIB_LOGIN(Proxy: string; Port: Integer; ID: string; Pass: string);
70 destructor Destroy; override;
71 function Connect: boolean;
72 function Disconnect: boolean;
73 property ProxyAddress: string read FProxyAddress write FProxyAddress;
74 property ProxyPort: integer read FProxyPort write FProxyPort;
75 property UserName: string read FUserName write FUserName;
76 property Password: string read FPassword write FPassword;
77 property ClientUA: string read FClientUA write FClientUA;
78 property Connected: boolean read FConnected;
79 property SessionID: string read GetSessionID;
80 property Version: string read GetVersion;
81 property UserAgent: string read GetUserAgent;
82 property ErrorCode: integer read GetErrorCode;
83 property ErrorMsg: string read GetErrorMsg;
88 DOLIB_VERSION = $10000;
89 DOLIB_LOGIN_UA = 'DOLIB/1.00';
90 DOLIB_LOGIN_HOST = 'tiger2.he.net';
91 DOLIB_LOGIN_URL = '/~tora3n2c/futen.cgi';
92 DOLIB_2CH_UA = 'X-2ch-UA:';
93 // DOLIB_2CH_UA = 'X-2ch-UA: gikoNavi/1.00'#13#10;
94 DOLIB_ENOMEM_STRING = '
\83\81\83\82\83\8a\82ª
\91«
\82è
\82Ü
\82¹
\82ñ
\81B';
95 DOLIB_LOGIN_ERROR = 'ERROR:';
99 constructor TDolib.Create;
105 destructor TDolib.Destroy;
112 function TDolib.Connect: boolean;
115 if not Connected then begin
116 DOLIB_LOGIN(FProxyAddress, FProxyPort, FUserName, FPassword);
118 if (AnsiPos(DOLIB_LOGIN_ERROR, SessionID) = 1) then begin
121 end else if ErrorCode <> 0 then begin
126 // Result := (ErrorCode = 0);
131 function TDolib.Disconnect: boolean;
134 if FSession <> nil then
135 FreeAndNil(FSession);
139 function TDolib.GetVersion: string;
147 Result := Format('%d.%.2d', [mj, mn]);
150 function TDolib.GetSessionID: string;
153 Result := FSession.FSessionID
158 function TDolib.GetUserAgent: string;
161 Result := FSession.FUserAgent
166 function TDolib.GetErrorMsg: string;
169 Result := FSession.FErrorString
171 Result := 'Error: ID
\82©
\83p
\83X
\83\8f\81[
\83h
\82ª
\90³
\82µ
\82
\82 \82è
\82Ü
\82¹
\82ñ
\81B';
174 function TDolib.GetErrorCode: integer;
177 Result := FSession.ErrorCode
182 procedure TDolib.MakeError(Session: TDolibSession; Error: DWORD);
184 Buf: array[0..4096] of Char;
186 Session.ErrorCode := Error;
187 if Error = ERROR_NOT_ENOUGH_MEMORY then
188 Session.ErrorString := DOLIB_ENOMEM_STRING
190 FillChar(Buf, SizeOf(Buf), #0);
191 FormatMessage({FORMAT_MESSAGE_ALLOCATE_BUFFER or}
192 FORMAT_MESSAGE_IGNORE_INSERTS or
193 FORMAT_MESSAGE_FROM_SYSTEM or
194 FORMAT_MESSAGE_FROM_HMODULE,
195 Pointer(GetModuleHandle('wininet')), Error,
196 (((Word(SUBLANG_DEFAULT)) shl 10) or Word(LANG_NEUTRAL)), //Delphi
\82ÉMAKELANGID
\83}
\83N
\83\8d\82ª
\96³
\82©
\82Á
\82½
\82Ì
\81B(
\81L¥
\83Ö¥`)¼®ÎÞ°Ý
197 // MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
198 Buf, SizeOf(Buf), nil);
199 Session.ErrorString := Buf;
204 kage
\8dì
\8eÒ
\82³
\82ñ
\82ÌDOLIB
\83N
\83\8d\81[
\83\93\83\
\81[
\83X
\81i
\91å
\95Ï
\82¨
\82¢
\82µ
\82ã
\82¤
\82²
\82´
\82¢
\82Ü
\82µ
\82½
\81j
205 http://members.jcom.home.ne.jp/monazilla/document/wininetdel.html
206 http://support.microsoft.com/default.aspx?scid=kb;EN-US;q168151
207 http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/wininet/wininet.asp
208 http://homepage1.nifty.com/~suzuki/delphi/wininet.html
210 procedure TDolib.DOLIB_LOGIN(Proxy: string; Port: Integer; ID: string; Pass: string);
215 ProxyHostPort: string;
216 Buf: array[0..4096] of Char;
222 FSession := TDolibSession.Create;
224 if Proxy <> '' then begin
225 ProxyHostPort := Format('%s:%d', [Proxy, Port]);
226 hSession := InternetOpen(DOLIB_LOGIN_UA, INTERNET_OPEN_TYPE_PROXY, PChar(ProxyHostPort), '', 0);
228 hSession := InternetOpen(DOLIB_LOGIN_UA, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
231 if not Assigned(hSession) then
232 MakeError(FSession, GetLastError())
234 hConnect := InternetConnect(hSession, DOLIB_LOGIN_HOST,
235 INTERNET_DEFAULT_HTTPS_PORT, nil, nil,
236 INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 0);
237 if not Assigned(hConnect) then
238 MakeError(FSession, GetLastError())
240 hRequest := HttpOpenRequest(hConnect, 'POST', DOLIB_LOGIN_URL,
242 INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_NO_COOKIES or
243 INTERNET_FLAG_NO_UI or INTERNET_FLAG_SECURE, 0);
244 if not Assigned(hRequest) then
245 MakeError(FSession, GetLastError())
247 UserInfo := Format('ID=%s&PW=%s', [ID, Pass]);
248 UserAgent := Format('%s %s', [DOLIB_2CH_UA, ClientUA]) + #13#10;
249 if not HttpSendRequest(hRequest, PChar(UserAgent), DWORD(-1), PChar(UserInfo), Length(UserInfo)) then
250 MakeError(FSession, GetLastError())
252 if not InternetReadFile(hRequest, @Buf, SizeOf(Buf), cb) then
253 MakeError(FSession, GetLastError())
254 else if (cb < 11) or (Pos('SESSION-ID=', Buf) <> 1) then
255 MakeError(FSession, ERROR_INVALID_DATA)
257 if Buf[cb - 1] = #10 then
259 FSession.SessionID := Copy(Buf, 12, cb);
260 if FSession.SessionID = '' then
261 MakeError(FSession, ERROR_NOT_ENOUGH_MEMORY);
262 Delim := Pos(':', Buf);
264 MakeError(FSession, ERROR_INVALID_DATA)
266 FSession.UserAgent := Copy(Buf, 12, Delim - 12);
267 if FSession.UserAgent = '' then
268 MakeError(FSession, ERROR_NOT_ENOUGH_MEMORY);
272 InternetCloseHandle(hRequest);
274 InternetCloseHandle(hConnect);
276 InternetCloseHandle(hSession);