Java,模拟浏览器

时间:2013-03-15 14:23:50

标签: java html httpurlconnection

我正在编写一个小的java程序/ api以编程方式登录/(使用登录凭据执行hthp帖子)到http://web2sms.ke.airtel.com

我要发帖,我需要参数(登录表单的键和值)。当我通过浏览器呈现表单时,键/名称每次都在不断变化,但是当我通过下面的java代码获取页面时,键始终是联系f_1.number,因此意味着我认为服务器正在区分页面是否是页面是否从浏览器中获取。如何模拟浏览器并获取浏览器呈现的数字?

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 *
 * @author Dell
 */
public class AirtelWeb2Sms {

    String link = "http://web2sms.ke.airtel.com";
    /**
     * @param args the command line arguments
     */
    private boolean on = false;

    public static void main(String[] args) {
        new AirtelWeb2Sms();
    }

    public AirtelWeb2Sms() {
        login();
    }

  private void login(){
      Map <String, String> parameters = new HashMap();
      try{
           URL url = new URL(link);
           URLConnection yc = url.openConnection();
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                yc.getInputStream()));
            String inputLine;

            while ((inputLine = in.readLine()) != null)
            {
                if(inputLine.contains("<div id=\"loginform\">"))
                {
                    on=true; 
                }

                if(on && (inputLine.contains("input")||inputLine.contains("select"))&& inputLine.contains("name")&& inputLine.contains("value")){
                 //   System.out.println(inputLine);
                  String[] tokens = inputLine.split("\" ");
                    String key="", value="";
                    for(String str: tokens){
                        if(str.contains("name=")){
                            key=str.substring(str.indexOf("\"")+1);
                         }
                        if(str.startsWith("value")){
                            value=str.substring(str.indexOf("\"")+1);
                         }
                        if(key.contains(".number")){
                            value="+25473DummyNumber";
                        }
                        if(key.contains(".passwd")){
                            value="dymmerPassword";
                        }
                        if(key.contains(".language")){
                            value="en";
                        }
                     }
                    parameters.put(key, value=value.replace("&quot;", "\""));
                    System.out.println(key+":"+value);
                }
                if(inputLine.contains("<input type=\"submit\""))
                {
                    on=false; 
                }
            }
            doSubmit(link+"index.hei", parameters);
           }
            catch(Exception ex){
               System.out.println(ex.getLocalizedMessage());
            }
  } 
  public void doSubmit(String url, Map<String, String> data) throws Exception 
  { 
      URL siteUrl = new URL(url); 
      HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection(); 
            conn.setRequestMethod("POST"); conn.setDoOutput(true); 
      conn.setDoInput(true); DataOutputStream out = new DataOutputStream(conn.getOutputStream()); 
      Set keys = data.keySet(); 
      Iterator keyIter = keys.iterator(); String content = "";
      for(int i=0; keyIter.hasNext(); i++) {
          Object key = keyIter.next(); 
          if(i!=0) { 
              content += "&"; 
          } 
          content += key + "=" +data.get(key);
      } 
      System.out.println(content); 
      out.writeBytes(content); 
      out.flush(); 
      out.close(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      String line = ""; 
      while((line=in.readLine())!=null) {
          System.out.println(line); } in.close(); 
  }


}

1 个答案:

答案 0 :(得分:1)

尝试将"User-Agent" HTTP标头设置为真实浏览器将发送的某个值。您可以访问http://whatsmyuseragent.com/来查看浏览器的用户代理字符串。