3번 방법을 이용하여 한 방법이 보다 정확해서 그렇게 예제를 꾸미다가
보통은 이렇게 하고 Submit 이벤트를 호출하면 되는데,
Yahoo는 조금 특별해서 자동 로그인 검사까지 하는군요.
(마우스로 클릭을 하였을때 특정 변수를 올려서 로그인 폼을 직접 찍었는지 검사합니다)
그래서, 아이디와 패스워드는 소스 파일을 이용해서 갈아치우는 방법
로그인 버튼은 직접 눌러주는 방법으로 예제를 만들었습니다.
(전체 소스와 실행을 해보시려면 첨부파일을 참조하세요)
계속 연구해서 Submit 을 호출하는 방법으로 깔끔히 처리해 보시는 것도... :)
cuperido
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, OleCtrls, SHDocVw;
type
TForm1 = class(TForm)
Panel1: TPanel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
WebBrowser1: TWebBrowser;
procedure Button1Click(Sender: TObject);
procedure WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('
http://kr.yahoo.com/');
end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
var
stSource, stURL : string;
vaDocument : OleVariant;
itCount, itItemCount : Integer;
blHaveToLogin : boolean;
begin
// Home에서만 처리하도록 함
stURL := URL;
if stURL <> '
http://kr.yahoo.com/' then exit;
if VarIsEmpty(WebBrowser1.Document) or VarIsNull(WebBrowser1.Document) then exit;
vaDocument := WebBrowser1.Document;
blHaveToLogin := false;
for itCount := 0 to vaDocument.Forms.Length - 1 do
begin
for itItemCount := 0 to vaDocument.Forms.Item(itCount).Length - 1 do
begin
if vaDocument.Forms.Item(itCount).Item(itItemCount).Name = 'login' then
begin
vaDocument.Forms.Item(itCount).Item(itItemCount).Value := Edit1.Text;
blHaveToLogin := true;
end;
if vaDocument.Forms.Item(itCount).Item(itItemCount).Name = 'passwd' then
begin
vaDocument.Forms.Item(itCount).Item(itItemCount).Value := Edit2.Text;
blHaveToLogin := true;
end;
end;
end;
if blHaveToLogin then
begin
SetCursorPos(Form1.Left + 670, Form1.Top + 230);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;
end;
end.
이동안 님이 쓰신 글 :
: 답변 감사합니다.
: 그럼 제가 올린소스는 왜 안된느지 또는 어떤 방법으로 해야 되는지 좀 부탁합니다.
: 마우스로까지는 id와 passsword에 포커스를 이동하는것까지는 하였습니다,
: 또 마우스 다운 업 또는 리턴까지도 가능합니다.
: 그런데 클릭보드(Edit1.Text)에 들어있는 값을 id포커스에 자동으로 보내고 하는 작업은 아직 헤메고 있습니다.
: 또 밑에 소스를 보시고 작성하는 순서가 올바른지 아니면 방법을 좀 부탁합니다.
: 하여튼 감사합니다.
:
: //////////////////////////////////
:
: 유영인 Cuperido 님이 쓰신 글 :
: : 자동 로그인을 구현하기 위해서는 몇가지 정도의 방법이 있습니다.
: :
: : 1. 시뮬레이션
: : 이동안님께서 하신 방법처럼 하시는 방법인데, 이 방법은 다른 사람들에게 배포시에는
: : 상당한 여러움이 발생할 수 있습니다. 객체의 위치가 OS마다 IE 버젼, IE를 크기를
: : 어디에 맞추었는지에 따라 다르기 때문 인데요, 물론 자신만 사용할 것이면 상관이
: : 없겠지만, 그렇지 않은 경우에는 당연히 엉뚱한 곳을 찍는 문제가 발견됩니다.
: : 하지만 매우 쉽게 구현할 수 있겠지요.
: :
: : 2. 쿠키 생성
: : IE를 이용하지 않는 객체라면, 쿠키값을 만들어줌으로써 자동 로그인을 구현할 수 있습니다.
: : 당연히, IE에서만 지원되는 것은 처리되지 않지만, 자동 게시물 쓰기 라든지의 프로그램등에서
: : 볼 수 있는 기능들처럼, IE 기능이 필요한 없는 곳에서는 사용이 편리하고 꽤 정확합니다.
: :
: : 3. IE 객체 생성
: : WebBrowser 컴포넌트로 생성된 IE에서 이벤트를 이용함으로 보다 정확하게 접근할 수 있겠습니다.
: : 결과적으로는 아래의 COM 방식과 동일하겠지만, 프로그래머 입장으로서는 이미 맵핑되어 있는
: : 이벤트를 만질 수 있어 보다 조금 정확하게 구현할 수 있습니다. 이러한 방법으로는 홈페이지가
: : 모드 로드되었을때를 기준으로 해서 소스를 바꿔치기 해버리는 방법으로 구현합니다.
: :
: : 4. IE COM 연결
: : COM 객체로 연결하여 인터페이스를 생성하고 원하는 객체를 바꾸는 방법입니다. 이 방법의 장점은
: : 굳이 내포시키지 않더라도, 사용자가 따로 띄운 IE에서도 동작을 할 수 있게끔 할 수 있다는
: : 것이고요. 자동 로그인 프로그램들이 이러한 방식을 사용하고 있습니다. 물론, 이 방법이 가장
: : 까다롭고, 로그인 정도면 무난하겠지만, 더 깊은 부분의 경우에는 책 한권을 봐야할 정도의 많은
: : 레퍼런스가 필요합니다.
: :
: :
: : 1번 방법을 답변해 드리려고 하니, 제 PC에 맞춰서 설명을 드리자면 실행을 하실때 실행이 안되는
: : 경우가 발생할것 같아서, 여러 방법을 다시 말씀드렸습니다. 원하시는 스펙에 따른 방법을 선택해
: : 주시면 그 해당하는 방법을 답변해 드리겠습니다. :)
: :
: :
: : cuperido
: :
: :
: :
: : 이동안 님이 쓰신 글 :
: : : 안녕하세요
: : : 좀처럼 처음 해보는 일입니다. 도움좀 부탁합니다.
: : : //////////////////////////////////////////////////////////////////
: : : //
: : : IE := CreateOLEObject('InternetExplorer.Application');
: : : IE.Visible := True;
: : : IE.ToolBar := False;
: : : IE.Resizable := False;
: : : //.TheaterMode := True ;
: : : IE.Left := 0 ;
: : : IE.Top := 0 ;
: : : IE.Width := 800 ;
: : : IE.Height := 700 ;
: : : IE.Navigate(URL);
: : : //
: : : Setcursorpos(400,130); // 커서를 x,y 좌표이용하여 id에 위치 시킵니다.
: : : Edit1.text := 'winsoft'; // id
: : : Edit1.setfocus;
: : : Edit1.copyToClipboard;
: : : //
: : : Edit2.text := 'winsoft'; // password
: : : Edit2.setfocus;
: : : Edit3.copyToClipboard;
: : :
: : : 위에 테스트문자값을 야후의 id와 password에 입력후 자동으로 Login를 클릭할려고 합니다.
: : : 그런데 그 방법좀 부탁합니다.
: : : 감사합니다.
: : :
: : :