1

我正在编写一个小型 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(); 
  }


}
4

1 回答 1

1

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

于 2013-03-15T14:31:36.710 回答