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);
68 procedure ForcedDOLIB_LOGIN(Proxy: string; Port: Integer; ID: string; Pass: string);
71 destructor Destroy; override;
72 function Connect: boolean;
73 function ForcedConnect: boolean; //SSL
\8fá
\8aQ
\97p
\8b
\90§
\83\8d\83O
\83C
\83\93
74 function Disconnect: boolean;
75 property ProxyAddress: string read FProxyAddress write FProxyAddress;
76 property ProxyPort: integer read FProxyPort write FProxyPort;
77 property UserName: string read FUserName write FUserName;
78 property Password: string read FPassword write FPassword;
79 property ClientUA: string read FClientUA write FClientUA;
80 property Connected: boolean read FConnected;
81 property SessionID: string read GetSessionID;
82 property Version: string read GetVersion;
83 property UserAgent: string read GetUserAgent;
84 property ErrorCode: integer read GetErrorCode;
85 property ErrorMsg: string read GetErrorMsg;
90 DOLIB_VERSION = $10000;
91 DOLIB_LOGIN_UA = 'DOLIB/1.00';
92 DOLIB_LOGIN_HOST = '2chv.tora3.net';
93 DOLIB_LOGIN_URL = '/futen.cgi';
94 DOLIB_2CH_UA = 'X-2ch-UA:';
95 // DOLIB_2CH_UA = 'X-2ch-UA: gikoNavi/1.00'#13#10;
96 DOLIB_ENOMEM_STRING = '
\83\81\83\82\83\8a\82ª
\91«
\82è
\82Ü
\82¹
\82ñ
\81B';
97 DOLIB_LOGIN_ERROR = 'ERROR:';
98 // https://2chv.tora3.net/futen.cgi
102 constructor TDolib.Create;
108 destructor TDolib.Destroy;
115 function TDolib.Connect: boolean;
118 if not Connected then begin
119 DOLIB_LOGIN(FProxyAddress, FProxyPort, FUserName, FPassword);
121 if (AnsiPos(DOLIB_LOGIN_ERROR, SessionID) = 1) then begin
124 end else if ErrorCode <> 0 then begin
129 // Result := (ErrorCode = 0);
133 function TDolib.ForcedConnect: boolean; //2003/12/20
\82Ü
\82Å
\82ÌSSL
\8fá
\8aQ
\97p
\8b
\90§
\83\8d\83O
\83C
\83\93\81i12/21
\88È
\8d~
\82È
\82ç
\92Ê
\8fí
\83\8d\83O
\83C
\83\93\81j
136 if not Connected then begin
137 ForcedDOLIB_LOGIN(FProxyAddress, FProxyPort, FUserName, FPassword);
142 function TDolib.Disconnect: boolean;
145 if FSession <> nil then
146 FreeAndNil(FSession);
150 function TDolib.GetVersion: string;
158 Result := Format('%d.%.2d', [mj, mn]);
161 function TDolib.GetSessionID: string;
164 Result := FSession.FSessionID
169 function TDolib.GetUserAgent: string;
172 Result := FSession.FUserAgent
177 function TDolib.GetErrorMsg: string;
180 Result := FSession.FErrorString
182 Result := 'Error: ID
\82©
\83p
\83X
\83\8f\81[
\83h
\82ª
\90³
\82µ
\82
\82 \82è
\82Ü
\82¹
\82ñ
\81B';
185 function TDolib.GetErrorCode: integer;
188 Result := FSession.ErrorCode
193 procedure TDolib.MakeError(Session: TDolibSession; Error: DWORD);
195 Buf: array[0..4096] of Char;
197 Session.ErrorCode := Error;
198 if Error = ERROR_NOT_ENOUGH_MEMORY then
199 Session.ErrorString := DOLIB_ENOMEM_STRING
201 FillChar(Buf, SizeOf(Buf), #0);
202 FormatMessage({FORMAT_MESSAGE_ALLOCATE_BUFFER or}
203 FORMAT_MESSAGE_IGNORE_INSERTS or
204 FORMAT_MESSAGE_FROM_SYSTEM or
205 FORMAT_MESSAGE_FROM_HMODULE,
206 Pointer(GetModuleHandle('wininet')), Error,
207 (((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Ö¥`)¼®ÎÞ°Ý
208 // MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
209 Buf, SizeOf(Buf), nil);
210 Session.ErrorString := Buf;
215 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
216 http://members.jcom.home.ne.jp/monazilla/document/wininetdel.html
217 http://support.microsoft.com/default.aspx?scid=kb;EN-US;q168151
218 http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/wininet/wininet.asp
219 http://homepage1.nifty.com/~suzuki/delphi/wininet.html
221 procedure TDolib.DOLIB_LOGIN(Proxy: string; Port: Integer; ID: string; Pass: string);
226 ProxyHostPort: string;
227 Buf: array[0..4096] of Char;
233 FSession := TDolibSession.Create;
235 if Proxy <> '' then begin
236 ProxyHostPort := Format('%s:%d', [Proxy, Port]);
237 hSession := InternetOpen(DOLIB_LOGIN_UA, INTERNET_OPEN_TYPE_PROXY, PChar(ProxyHostPort), '', 0);
239 hSession := InternetOpen(DOLIB_LOGIN_UA, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
242 if not Assigned(hSession) then
243 MakeError(FSession, GetLastError())
245 hConnect := InternetConnect(hSession, DOLIB_LOGIN_HOST,
246 INTERNET_DEFAULT_HTTPS_PORT, nil, nil,
247 INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 0);
248 if not Assigned(hConnect) then
249 MakeError(FSession, GetLastError())
251 hRequest := HttpOpenRequest(hConnect, 'POST', DOLIB_LOGIN_URL,
253 INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_NO_COOKIES or
254 INTERNET_FLAG_NO_UI or INTERNET_FLAG_SECURE, 0);
255 if not Assigned(hRequest) then
256 MakeError(FSession, GetLastError())
258 UserInfo := Format('ID=%s&PW=%s', [ID, Pass]);
259 UserAgent := Format('%s %s', [DOLIB_2CH_UA, ClientUA]) + #13#10;
260 if not HttpSendRequest(hRequest, PChar(UserAgent), DWORD(-1), PChar(UserInfo), Length(UserInfo)) then
261 MakeError(FSession, GetLastError())
263 if not InternetReadFile(hRequest, @Buf, SizeOf(Buf), cb) then
264 MakeError(FSession, GetLastError())
265 else if (cb < 11) or (Pos('SESSION-ID=', Buf) <> 1) then
266 MakeError(FSession, ERROR_INVALID_DATA)
268 if Buf[cb - 1] = #10 then
270 FSession.SessionID := Copy(Buf, 12, cb);
271 if FSession.SessionID = '' then
272 MakeError(FSession, ERROR_NOT_ENOUGH_MEMORY);
273 Delim := Pos(':', Buf);
275 MakeError(FSession, ERROR_INVALID_DATA)
277 FSession.UserAgent := Copy(Buf, 12, Delim - 12);
278 if FSession.UserAgent = '' then
279 MakeError(FSession, ERROR_NOT_ENOUGH_MEMORY);
283 InternetCloseHandle(hRequest);
285 InternetCloseHandle(hConnect);
287 InternetCloseHandle(hSession);
290 //SSL
\8fá
\8aQ
\97p
\8b
\90§
\83\8d\83O
\83C
\83\93
291 procedure TDolib.ForcedDOLIB_LOGIN(Proxy: string; Port: Integer; ID: string; Pass: string);
296 ProxyHostPort: string;
297 Buf: array[0..4096] of Char;
303 FSession := TDolibSession.Create;
305 if Proxy <> '' then begin
306 ProxyHostPort := Format('%s:%d', [Proxy, Port]);
307 hSession := InternetOpen(DOLIB_LOGIN_UA, INTERNET_OPEN_TYPE_PROXY, PChar(ProxyHostPort), '', 0);
309 hSession := InternetOpen(DOLIB_LOGIN_UA, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
312 if not Assigned(hSession) then
313 MakeError(FSession, GetLastError())
315 hConnect := InternetConnect(hSession, DOLIB_LOGIN_HOST,
316 INTERNET_DEFAULT_HTTPS_PORT, nil, nil,
317 INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 0);
318 if not Assigned(hConnect) then
319 MakeError(FSession, GetLastError())
321 hRequest := HttpOpenRequest(hConnect, 'POST', DOLIB_LOGIN_URL,
323 INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_NO_COOKIES or
324 INTERNET_FLAG_NO_UI or INTERNET_FLAG_SECURE, 0);
325 if not Assigned(hRequest) then
326 MakeError(FSession, GetLastError())
328 UserInfo := Format('ID=%s&PW=%s', [ID, Pass]);
329 UserAgent := Format('%s %s', [DOLIB_2CH_UA, ClientUA]) + #13#10;
330 HttpSendRequest(hRequest, PChar(UserAgent), DWORD(-1), PChar(UserInfo), Length(UserInfo));
331 if not InternetReadFile(hRequest, @Buf, SizeOf(Buf), cb) then
332 MakeError(FSession, GetLastError())
333 else if (cb < 11) or (Pos('SESSION-ID=', Buf) <> 1) then
334 MakeError(FSession, ERROR_INVALID_DATA)
336 if Buf[cb - 1] = #10 then
338 FSession.SessionID := Copy(Buf, 12, cb);
339 if FSession.SessionID = '' then
340 MakeError(FSession, ERROR_NOT_ENOUGH_MEMORY);
341 Delim := Pos(':', Buf);
343 MakeError(FSession, ERROR_INVALID_DATA)
345 FSession.UserAgent := Copy(Buf, 12, Delim - 12);
346 if FSession.UserAgent = '' then
347 MakeError(FSession, ERROR_NOT_ENOUGH_MEMORY);
350 InternetCloseHandle(hRequest);
352 InternetCloseHandle(hConnect);
354 InternetCloseHandle(hSession);