我每天都用用163邮箱,但又觉得填写帐号密码比较麻烦。 学习了一点基本的java,想用b/s模式来写个小程序登录163邮箱,但是弄了个叫“163邮箱”的按钮连接了上网页就不知道怎么去实现自动填表的部分了。我觉得应该用robot类,但是不会用,希望各位能够解答一下。 最好先给我讲讲思路,谢谢。 还有,我打算用netbeans去写,别的软件不怎么会……

解决方案 »

  1.   

    maxthon 自带这些东西,firefox 也有。其实IE自己也支持!
      

  2.   

    下面这段程序是你点击登录按钮后触发的动作
    javascript是无法跨域控制对象的,163的js读起来很恶心.另外这种东西无需写程序吧,用ie的自动完成就行了.function fLoginFormSubmit() { var fm = window.document.login163; var user = fm.username; user.value = fTrim( user.value); //Trim the input value. if( user.value =="") { window.alert("\请输入您的用户名 ?"); user.focus(); event.returnValue = false; return false; } if( fm.password.value.length =="") { window.alert("\请输入您的密码 ?"); fm.password.focus(); event.returnValue = false; return false; } var ati = user.value.indexOf( "@"); if( ati != -1 ){ user.value = user.value.substring(0, ati); } var secure = fm.remUser.checked?true:false; var url = fm.secure.checked ? "https://reg.163.com/logins.jsp" : "http://reg.163.com/login.jsp"; url += "?type=1&url=http://fm163.163.com/coremail/fcg/ntesdoor2?"; url += "lightweight%3D1%26verifycookie%3D1%26"; if(secure){ user.autocomplete="on"; }else{ user.autocomplete="off"; } fGetVersion(fm); fm.action = url + "language%3D-1%26style%3D" + fm.style.value; visitordata.setVals( [fm.username.value,fm.style.value,fm.secure.checked?1:0 ], fm.remUser.checked); visitordata.store(); if(!fm.remUser.checked){ setCookie('ntes_mail_noremember','true',true); } return true; }
      

  3.   

    一般网站是可以的,但是像163这种大门户,他们早有考虑,会有些防范措施原理很简单了,知道url自己建个from表单提交就行了.我上面不是放了段163的提交代码吗,你在163点击提交的时候就是上面代码那个流程,你要是看懂了,就能做了.
      

  4.   

    什么叫“url自己建个from表单提交就行”啊?
      

  5.   

    可以用robot类去写吗?应该是怎样的一个思路呢?里面有很多的方法啊!
      

  6.   

    lz 你要向对方服务器发请求得知道url name password参数才行啊,你连对方要什么都不知道怎么建立连接阿,这个东西也不用java写啊,属于html的范围.无论用什么写你都的知道http请求吧,form是表单.发送http请求的一种形式.
      

  7.   

    你不是想实现像遨游火狐那种自动填充的功能吧,这个要在浏览器级别上才行,我记得我试过js是不能跨域改变对象的.实在不明白你到底想怎么搞.你打开mail.163.com
    在写网址的地方
    输入
    javascript:void(window.document.login163.username.value='test')
    回车
    然后输入
    javascript:void(fLoginFormSubmit())
    回车
      

  8.   

    我想楼主要问的,是怎么用java实现 在打开这个网页的时候,就自动将用户名和密码填充好。
    学习
      

  9.   

    就是像楼上说的差不多,我知道robot类可以帮我按下或者放开某一些键,就利用这个方法来输入username和password,还有一个方法是可以控制鼠标移动的轨迹的,我想这个方法可以用来选定那个输入帐号或者密码或者“登录”的方框,把这个交给程序做了,我想应该就可以免去我输入的麻烦了,不知道可行不?
      

  10.   

    或者是按照8楼朋友的提示那样,在程序中我把真实的值赋给username和password那个方框就可以实先自动登录了吧?但是我该给服务器发送些什么信息才能呢?
    还是用robot类记录按键好呢?
      

  11.   

    eclipse也挺好的,不妨试试,在官方网站直接下最新版本的,eclipse3.3 m3
      

  12.   

    老兄这是侵入式行为,涉及到安全问题,要在浏览器层面上才行(我猜是这样),你要java实现浏览器的代码的话我可以给你。
      

  13.   

    什么入侵式行为?这么严重的?我只是想用robot类记录我按过的帐号密码,而且是我自己一个人用的,但是用那个类记录鼠标的轨迹我就不会了,因为不同屏幕有不用大小,需要记录的选择框的坐标不同,就不知道怎么办了。你实现浏览器的代码是怎么样的,也是用robot类的吗?
      

  14.   

    我写swt时偶然看到的, eclipse 官方的demo 下swt官方例子里面就有。就一个类,你要是下不到的话我有空帮你找下。
      

  15.   

    需要最新版的swt.jar才行http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.3.2-200802211800/swt-3.3.2-win32-win32-x86.zipSimplebrowser.propertieserror.CouldNotLoadResources = Unable to load resources
    Back = Back
    BrowserNotCreated = Error - The Browser widget could not be instantiated. Please check the Browser widget is supported on this platform. Supported platforms and software requirements for the Browser widget are listed on the SWT FAQ web page.
    Forward = Forward
    Stop = Stop
    Refresh = Refresh
    Enter = Go
    Home = Home
    Startup = http://www.baidu.com
      

  16.   


    package com.xxx ;public class SimpleBrowser {
    private static ResourceBundle resourceBundle = ResourceBundle
    .getBundle("Simplebrowser"); private Composite parent; private Text locationBar; private Browser browser; private ToolBar toolbar; private Button enter; private ToolItem itemBack, itemForward; private Label status; private ProgressBar progressBar; public SimpleBrowser(Composite parent, boolean top) {
    this.parent = parent;
    try {
    browser = new Browser(parent, SWT.BORDER);
    } catch (SWTError e) {
    /* Browser widget could not be instantiated */
    parent.setLayout(new FillLayout());
    Label label = new Label(parent, SWT.CENTER | SWT.WRAP);
    label.setText(getResourceString("BrowserNotCreated"));
    parent.layout(true);
    return;
    }
    final Display display = parent.getDisplay();
    browser.setData(
    "org.eclipse.swt.examples.browserexample.BrowserApplication",
    this);
    browser.addOpenWindowListener(new OpenWindowListener() {
    public void open(WindowEvent event) {
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    SimpleBrowser app = new SimpleBrowser(shell, false);
    event.browser = app.getBrowser();
    }
    });
    if (top) {
    browser.setUrl(getResourceString("Startup"));
    show(false, null, null, true, true, true, true);
    } else {
    browser.addVisibilityWindowListener(new VisibilityWindowListener() {
    public void hide(WindowEvent e) {
    } public void show(WindowEvent e) {
    Browser browser = (Browser) e.widget;
    SimpleBrowser app = (SimpleBrowser) browser
    .getData("org.eclipse.swt.examples.browserexample.BrowserApplication");
    app.show(true, e.location, e.size, e.addressBar, e.menuBar,
    e.statusBar, e.toolBar);
    }
    });
    browser.addCloseWindowListener(new CloseWindowListener() {
    public void close(WindowEvent event) {
    Browser browser = (Browser) event.widget;
    Shell shell = browser.getShell();
    shell.close();
    }
    });
    }
    } /**
     * Gets a string from the resource bundle. We don't want to crash because of
     * a missing String. Returns the key if not found.
     */
    static String getResourceString(String key) {
    try {
    return resourceBundle.getString(key);
    } catch (MissingResourceException e) {
    return key;
    } catch (NullPointerException e) {
    return "!" + key + "!";
    }
    } public Browser getBrowser() {
    return browser;
    }
      

  17.   

    void show(boolean owned, Point location, Point size, boolean addressBar,
    boolean menuBar, boolean statusBar, boolean toolBar) {
    final Shell shell = browser.getShell();
    if (owned) {
    if (location != null)
    shell.setLocation(location);
    if (size != null)
    shell.setSize(shell.computeSize(size.x, size.y));
    }
    FormData data = null;
    if (toolBar) {
    toolbar = new ToolBar(parent, SWT.NONE);
    data = new FormData();
    data.top = new FormAttachment(0, 5);
    toolbar.setLayoutData(data);
    itemBack = new ToolItem(toolbar, SWT.PUSH);
    itemBack.setText(getResourceString("Back"));
    itemForward = new ToolItem(toolbar, SWT.PUSH);
    itemForward.setText(getResourceString("Forward"));
    final ToolItem itemStop = new ToolItem(toolbar, SWT.PUSH);
    itemStop.setText(getResourceString("Stop"));
    final ToolItem itemRefresh = new ToolItem(toolbar, SWT.PUSH);
    itemRefresh.setText(getResourceString("Refresh"));
    final ToolItem itemHome = new ToolItem(toolbar, SWT.PUSH);
    itemHome.setText(getResourceString("Home")); itemBack.setEnabled(browser.isBackEnabled());
    itemForward.setEnabled(browser.isForwardEnabled());
    Listener listener = new Listener() {
    public void handleEvent(Event event) {
    ToolItem item = (ToolItem) event.widget;
    if (item == itemBack)
    browser.back();
    else if (item == itemForward)
    browser.forward();
    else if (item == itemStop)
    browser.stop();
    else if (item == itemRefresh)
    browser.refresh();
    else if (item == itemHome)
    browser.setUrl(getResourceString("Startup"));
    }
    };
    itemBack.addListener(SWT.Selection, listener);
    itemForward.addListener(SWT.Selection, listener);
    itemStop.addListener(SWT.Selection, listener);
    itemRefresh.addListener(SWT.Selection, listener);
    itemHome.addListener(SWT.Selection, listener); enter = new Button(parent, SWT.None);
    enter.setText(getResourceString("Enter"));
    enter.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
    browser.setUrl(locationBar.getText());
    }
    });
    data = new FormData();
    data.width = 24;
    data.height = 20;
    data.top = new FormAttachment(0, 5);
    data.right = new FormAttachment(100, -5);
    enter.setLayoutData(data);
    }
    if (addressBar) {
    locationBar = new Text(parent, SWT.BORDER);
    data = new FormData();
    if (toolbar != null) {
    data.top = new FormAttachment(toolbar, 0, SWT.TOP);
    data.left = new FormAttachment(toolbar, 5, SWT.RIGHT);
    data.right = new FormAttachment(enter, -5, SWT.DEFAULT);
    } else {
    data.top = new FormAttachment(0, 0);
    data.left = new FormAttachment(0, 0);
    data.right = new FormAttachment(100, 0);
    }
    locationBar.setLayoutData(data);
    locationBar.addListener(SWT.DefaultSelection, new Listener() {
    public void handleEvent(Event e) {
    browser.setUrl(locationBar.getText());
    }
    });
    }
    if (statusBar) {
    status = new Label(parent, SWT.NONE);
    progressBar = new ProgressBar(parent, SWT.NONE); data = new FormData();
    data.left = new FormAttachment(0, 5);
    data.right = new FormAttachment(progressBar, 0, SWT.DEFAULT);
    data.bottom = new FormAttachment(100, -5);
    status.setLayoutData(data); data = new FormData();
    data.right = new FormAttachment(100, -5);
    data.bottom = new FormAttachment(100, -5);
    progressBar.setLayoutData(data); browser.addStatusTextListener(new StatusTextListener() {
    public void changed(StatusTextEvent event) {
    status.setText(event.text);
    }
    });
    }
    parent.setLayout(new FormLayout()); Control aboveBrowser = toolBar ? (Control) enter
    : (addressBar ? (Control) locationBar : null);
    data = new FormData();
    data.left = new FormAttachment(0, 0);
    data.top = aboveBrowser != null ? new FormAttachment(aboveBrowser, 5,
    SWT.DEFAULT) : new FormAttachment(0, 0);
    data.right = new FormAttachment(100, 0);
    data.bottom = status != null ? new FormAttachment(status, -5,
    SWT.DEFAULT) : new FormAttachment(100, 0);
    browser.setLayoutData(data); if (statusBar || toolBar) {
    browser.addProgressListener(new ProgressListener() {
    public void changed(ProgressEvent event) {
    if (event.total == 0)
    return;
    int ratio = event.current * 100 / event.total;
    if (progressBar != null)
    progressBar.setSelection(ratio);
    } public void completed(ProgressEvent event) {
    if (progressBar != null)
    progressBar.setSelection(0);
    }
    });
    }
    if (addressBar || statusBar || toolBar) {
    browser.addLocationListener(new LocationListener() {
    public void changed(LocationEvent event) {
    if (event.top && locationBar != null)
    locationBar.setText(event.location);
    } public void changing(LocationEvent event) {
    }
    });
    }
    parent.layout(true);
    if (owned)
    shell.open();
    } /**
     * Grabs input focus
     */
    public void focus() {
    if (locationBar != null)
    locationBar.setFocus();
    else if (browser != null)
    browser.setFocus();
    else
    parent.setFocus();
    } public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    new SimpleBrowser(shell, true);
    shell.open();
    while (!shell.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    }
    display.dispose();
    }
    }
      

  18.   

    剩下的事你自己搞吧,如果没用开放的api,你就看下Browser 的源码漏了包引用import java.util.MissingResourceException;
    import java.util.ResourceBundle;import org.eclipse.swt.SWT;
    import org.eclipse.swt.SWTError;
    import org.eclipse.swt.browser.Browser;
    import org.eclipse.swt.browser.CloseWindowListener;
    import org.eclipse.swt.browser.LocationEvent;
    import org.eclipse.swt.browser.LocationListener;
    import org.eclipse.swt.browser.OpenWindowListener;
    import org.eclipse.swt.browser.ProgressEvent;
    import org.eclipse.swt.browser.ProgressListener;
    import org.eclipse.swt.browser.StatusTextEvent;
    import org.eclipse.swt.browser.StatusTextListener;
    import org.eclipse.swt.browser.VisibilityWindowListener;
    import org.eclipse.swt.browser.WindowEvent;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.layout.FormAttachment;
    import org.eclipse.swt.layout.FormData;
    import org.eclipse.swt.layout.FormLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Control;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.ProgressBar;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
    import org.eclipse.swt.widgets.ToolBar;
    import org.eclipse.swt.widgets.ToolItem;
      

  19.   

    先谢谢你了,其实swt是什么来的?
    你这个程序挺高深的,原本我只是想用robot去记录我按过的username和password,然后让程序自己去填而已,但苦于不知道怎么控制鼠标的指针去到要填username那个方框,因为robot类里面的方法要准确到屏幕的xy坐标,要是换了个不同尺寸的显示器就可能出问题了,我用jsk1.5api的中文版查了一下,给你看看,希望可以找到点头绪。******************************************************************************************************************************
    方法摘要 
     BufferedImage createScreenCapture(Rectangle screenRect) 
              创建包含从屏幕中读取的像素的图像。 
     void delay(int ms) 
              睡眠指定的时间。 
     int getAutoDelay() 
              返回此 Robot 在生成一个事件后睡眠的毫秒数。 
     Color getPixelColor(int x, int y) 
              返回给定屏幕坐标处的像素颜色。 
     boolean isAutoWaitForIdle() 
              返回此 Robot 在生成一个事件后是否自动调用 waitForIdle。 
     void keyPress(int keycode) 
              按下给定的键。 
     void keyRelease(int keycode) 
              释放给定的键。 
     void mouseMove(int x, int y) 
              将鼠标指针移动到给定屏幕坐标。 
     void mousePress(int buttons) 
              按下一个或多个鼠标按钮。 
     void mouseRelease(int buttons) 
              释放一个或多个鼠标按钮。 
     void mouseWheel(int wheelAmt) 
              在配有滚轮的鼠标上旋转滚轮。 
     void setAutoDelay(int ms) 
              设置此 Robot 在生成一个事件后睡眠的毫秒数。 
     void setAutoWaitForIdle(boolean isOn) 
              设置此 Robot 在生成一个事件后是否自动调用 waitForIdle。 
     String toString() 
              返回此 Robot 的字符串表示形式。 
     void waitForIdle() 
              在处理完当前事件队列中的所有事件之前,一直等待。
    ******************************************************************************************************************************还有你可以解析一下你给的程序大概是干什么的吗?讲个主要过程就行了。谢谢…… 
      

  20.   

    你叫我看browser的代码,指的是要我看浏览器本身的代码还是http://mail.163.com/这样一个网页的源码啊?浏览器的代码怎么可以看得到的呢?
      

  21.   

    要是我想获得鼠标点击了“用户名”输入框之时的x,y坐标,那我就可以用robot类mouseMove(x,y)。然后剩下的就是Keypress和KeyRelease了。
    问题是我不会怎么去弄到那个时候x,y的坐标。如果是一般的getpoint,你怎么知道取得的x,y就是我用鼠标点击了那个输入框时候的坐标呢?请你回答,谢谢
      

  22.   

    ie是没法告诉你的java,当前你点了那个文本框的。就像说中国话的人不能和说外国话的人不能沟通一样,他们之间没用通讯方式,按你的想法我认为根本实现不了(恕本人能力有限)马云有一句话我觉得说的很好只有需求决定技术,没有技术决定需求。我不会在回答此贴了,你可以不结贴等高人出现。