这里是一一个向163取得特定邮箱的通讯录列表的联系人的JAVA程序,经过 检验,现在能够正确登录到163系统里面(用户名,密码)都正确的话,但现在遇到 了一个问题,久久不能解决 :
                  在登录到了163之后,
                 用下面的URL 得到 通讯录的页面,但就是不能进去,原因是这个里面的sid不知怎样得来,在做126的时候,这个sid是从cookies取得的
                  HttpGet httpget = new HttpGet("http://g2a10.mail.163.com/coremail/fcg/ldvcapp?funcid=prtsearchres&sid="+sid+"&listnum=20&tempname=address%2faddress.htm";
               SID:
                                List<Cookie> cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None";    
        } else {
            for (int i = 0; i < cookies.size(); i++)
                        {
                    if("NTES_SESS".equals(cookies.get(i).getName())) {
                System.out.println(cookies.get(i).getName()+"= " + cookies.get(i).getValue()); 
                                String temp=cookies.get(i).getValue();
                                //sid=temp.substring(temp.indexOf("%"+1,temp.length());
                                sid = temp;
                    }
            }
                        for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());    
            }
        }
                           但不问题就在于不知怎样截取这个temp ?而126的temp是 xxxxx%xxxxxxxxx以“%”库分隔符的,这样截取“%” 后面的为sid就行,
           
                    Coremail- WaagMaTaMrwaa%DAvqcKmmrwfnwflEoRmmaEqyUAIirYwM                  
像上面青色所示,我把sid=“青色“再传送到url就可得到通讯录的页面了。。呵呵而163的则不是:           NTES_SESS= 20w_MHQdAnGQeMer9YWUpl_I.mVznqftArn.cmm3F9AIB2k6ZBVkwedgU_1ne92FW7rr0ZG664LSHU2Mw8pqEDiJB
               NETEASE_SSN= yourname
               NETEASE_ADV= 10&20&1210502832071
               URSJESSIONID= aZfawMJBx_Hd
               像上面所示的结果,应该怎样处理,高手在吗,难道是思路错误,还是其它原因????高手来看看啦
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.UrlEncodedFormEntity;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
/**
* A example that demonstrates how HttpClient APIs can be used to perform 
* form-based logon.
*/
public class client163tFormLogin1 {    public static void main(String[] args) throws Exception {        DefaultHttpClient httpclient = new DefaultHttpClient();
        httpclient.getParams().setParameter(
                ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);       
        
        HttpPost httpost = new HttpPost("https://reg.163.com/logins.jsp?type=1&url=http://fm163.163.com/coremail/fcg/ntesdoor2?" +
                "lightweight=1&" +
                "verifycookie=1&" +
                "language=-1&" +
                "style=16" 
                );
       
        NameValuePair[] nvps = new NameValuePair[] {
                new BasicNameValuePair("username", "yourname",
                new BasicNameValuePair("password", "yourpassword",
                new BasicNameValuePair("product", "mail163",
                new BasicNameValuePair("selType", "jy"
        };
        
        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_);
        
                System.out.println(new java.util.Date());
                
        HttpResponse response = httpclient.execute(httpost);
        HttpEntity entity = response.getEntity();     
        
        System.out.println("Login form get: " + response.getStatusLine()); 
        
                //java.io.FileOutputStream htmlOutStream=new java.io.FileOutputStream("c:\\1.html";
                  //entity.writeTo(htmlOutStream);
                  //htmlOutStream.close();                
                        
                if (entity != null) {
            entity.consumeContent();
        }
                String sid="";
        System.out.println("ost logon cookies:";    
        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None";    
        } else {
            for (int i = 0; i < cookies.size(); i++)
                        {
                    if("NTES_SESS".equals(cookies.get(i).getName())) {
                System.out.println(cookies.get(i).getName()+"= " + cookies.get(i).getValue()); 
                                String temp=cookies.get(i).getValue();
                                //sid=temp.substring(temp.indexOf("%")+1,temp.length());
                                sid = temp;
                    }
            }
                        for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());    
            }
        }
System.out.println("sid------------" + sid);                
                HttpGet httpget = new HttpGet("http://g2a10.mail.163.com/coremail/fcg/ldvcapp?funcid=prtsearchres&sid="+sid+"&listnum=20&tempname=address%2faddress.htm");
                        
                String name="",email="";
                Pattern pLinePattern;
                Matcher pLineMatcher;
        System.out.println("Login form get: " + response.getStatusLine()); 
                BufferedReader bufferReader=new BufferedReader(new InputStreamReader(entity.getContent()));
                String lineString=bufferReader.readLine();
                while(lineString!=null)
                {
System.out.println(lineString);        
                        int i = 1;
                        pLinePattern=Pattern.compile("<td align=left nowrap><!-- 修改 -->(.*)|<td align=left nowrap><!-- 发信 -->(.*)</a></td>");
                
                        pLineMatcher=pLinePattern.matcher(lineString);
                    while(pLineMatcher.find())
                        {
                                String pMatchString=pLineMatcher.group(1);
                                if(pMatchString!=null && !pMatchString.equals(""))
                                        name=pMatchString;
                                pMatchString=pLineMatcher.group(2);
                                if(pMatchString!=null && !pMatchString.equals(""))
                                        email=pMatchString;
                    }
                        if(!email.equals("") && !name.equals(""))
                        {
                                System.out.println(name+"----"+email);
                                email=name="";
                        }
                        lineString=bufferReader.readLine();
                }
                
                System.out.println(new java.util.Date());
    }

解决方案 »

  1.   

    應該在第一次response 得到后
    再發一次httpost 
    url是:
    http://fm163.163.com/coremail/fcg/ntesdoor2?lightweight=1&username=****
    然後再讀取cookie中Coremail的值就是了!!
      

  2.   

    支持2楼的,我运行了,是正确的,能得到sid但执行第三步获得联系人的时候出现了错误,返回结果是:非法请求
      

  3.   

    g2a10
    这个好像会变的。。我做的已经到了收件箱的页面,但是它是一个框架,不晓得怎么取真正的BODY值了
      

  4.   

    [[email protected]]你好[/email]
      

  5.   

    都不知道引用的什么JAR包,我在网上搜索了一下,导入不是这个错就是那个错。