2013-03-15 200 views
1

我写一个小型的Java程序/ API以编程方式登录/(做了高温高压后的登录凭证)到这个http://web2sms.ke.airtel.comJava中,模拟浏览器

对我后,我需要的参数(key和value登录表单)。当我通过浏览器呈现表单时,键/名每次都会改变,但是当我通过键下面的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(); 
    } 


} 
+0

这当然取决于服务器 - 请给出更多的细节。另外,“我认为服务器中的服务器是差分”是什么意思? – jazzbassrob 2013-03-15 14:26:53

+0

嗨,我的意思是区别,即服务器可以告诉它不从浏览器 – 2013-03-15 14:35:33

回答

1

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

+0

嗨,我试图设置useragent仍然不能得到浏览器总是呈现的变化的名称/键。例如,如果您只能输入用户名和密码字段的密钥/名称。你要渲染的页面,它将成为一个新的地方,每当我从程序中渲染页面时,它总是有一个1. ie f_1.number和f_1.passw – 2013-03-15 14:39:58

+1

也许这不是导致差异的用户代理头。不知道更多关于服务器端的信息是不可能的。使用Firefox中的Web控制台等工具查看浏览器发送请求的所有详细信息,并尝试从程序中重现完全相同的请求。 – zagyi 2013-03-15 14:51:20