用.net导出Yahoo的地址簿

直接上代码:
using System;
using System.Collections.Generic;
using System.Collections.Specialized;  
using System.Net;  
using System.Text;
using System.Text.RegularExpressions;  

namespace Yahoo
{
   
public class YahooExtract
    {
        
private const string _addressBookUrl = "http://address.yahoo.com/yab/us/Yahoo_ab.csv?loc=us&.rand=1671497644&A=H&Yahoo_ab.csv";
        
private const string _authUrl = "https://login.yahoo.com/config/login?";
        
private const string _loginPage = "https://login.yahoo.com/config/login";
        
private const string _userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3";

        
public bool Extract(NetworkCredential credential, out MailContactList list)
        {
            
bool result = false;

            list 
= new MailContactList();

            
try
            {
                WebClient webClient 
= new WebClient();
                webClient.Headers[HttpRequestHeader.UserAgent] 
= _userAgent;
                webClient.Encoding 
= Encoding.UTF8;

                
byte[] firstResponse = webClient.DownloadData(_loginPage);
                
string firstRes = Encoding.UTF8.GetString(firstResponse);


                NameValueCollection postToLogin 
= new NameValueCollection();
                Regex regex 
= new Regex("type=\"hidden\" name=\"(.*?)\" value=\"(.*?)\"", RegexOptions.IgnoreCase);
                Match match 
= regex.Match(firstRes);
                
while (match.Success)
                {
                    
if (match.Groups[0].Value.Length > 0)
                    {
                        postToLogin.Add(match.Groups[
1].Value, match.Groups[2].Value);
                    }
                    match 
= regex.Match(firstRes, match.Index + match.Length);
                }


                postToLogin.Add(
".save""Sign In");
                postToLogin.Add(
".persistent""y");

                
string login = credential.UserName.Split('@')[0];
                postToLogin.Add(
"login", login);
                postToLogin.Add(
"passwd", credential.Password);

                webClient.Headers[HttpRequestHeader.UserAgent] 
= _userAgent;
                webClient.Headers[HttpRequestHeader.Referer] 
= _loginPage;
                webClient.Encoding 
= Encoding.UTF8;
                webClient.Headers[HttpRequestHeader.Cookie] 
= webClient.ResponseHeaders[HttpResponseHeader.SetCookie];

                webClient.UploadValues(_authUrl, postToLogin);
                
string cookie = webClient.ResponseHeaders[HttpResponseHeader.SetCookie];

                
if (string.IsNullOrEmpty(cookie))
                {
                    
return false;
                }

                
string newCookie = string.Empty;
                
string[] tmp1 = cookie.Split(',');
                
foreach (string var in tmp1)
                {
                    
string[] tmp2 = var.Split(';');
                    newCookie 
= String.IsNullOrEmpty(newCookie) ? tmp2[0] : newCookie + ";" + tmp2[0];
                }

                
// set login cookie  
                webClient.Headers[HttpRequestHeader.Cookie] = newCookie;
                
byte[] thirdResponse = webClient.DownloadData(_addressBookUrl);
                
string thirdRes = Encoding.UTF8.GetString(thirdResponse);

                
string crumb = string.Empty;
                Regex regexCrumb 
= new Regex("type=\"hidden\" name=\"\\.crumb\" id=\"crumb1\" value=\"(.*?)\"", RegexOptions.IgnoreCase);
                match 
= regexCrumb.Match(thirdRes);
                
if (match.Success && match.Groups[0].Value.Length > 0)
                {
                    crumb 
= match.Groups[1].Value;
                }


                NameValueCollection postDataAB 
= new NameValueCollection();
                postDataAB.Add(
".crumb", crumb);
                postDataAB.Add(
"vcp""import_export");
                postDataAB.Add(
"submit[action_export_yahoo]""Export Now");

                webClient.Headers[HttpRequestHeader.UserAgent] 
= _userAgent;
                webClient.Headers[HttpRequestHeader.Referer] 
= _addressBookUrl;

                
byte[] FourResponse = webClient.UploadValues(_addressBookUrl, postDataAB);
                
string csvData = Encoding.UTF8.GetString(FourResponse);

                
string[] lines = csvData.Split('\n');
                
foreach (string line in lines)
                {
                    
string[] items = line.Split(',');
                    
if (items.Length < 5)
                    {
                        
continue;
                    }
                    
string First = items[0];
                    
string Last = items[2];
                    
string NickName = items[3];
                    
string email = items[4];
                    
if (!string.IsNullOrEmpty(email)) //&& !string.IsNullOrEmpty(name)
                    {
                        email 
= email.Trim('\"');
                        
if (!email.Equals("Email")) //&& !name.Equals("Nickname")
                        {
                            MailContact mailContact 
= new MailContact();
                            mailContact.FirstName 
= First.Trim('\"');
                            mailContact.LastName 
= Last.Trim('\"');
                            mailContact.NickName 
= NickName.Trim('\"');
                            mailContact.Email 
= email;
                            list.Add(mailContact);
                        }
                    }
                }

                result 
= true;
            }
            
catch
            {
            }
            
return result;
        }

    }
   
public class MailContact
   {
       
public string FirstName
       {
           
get;
           
set;
       }

       
public string LastName
       {
           
get;
           
set;
       }

       
public string Email
       {
           
get;
           
set;
       }

       
public string NickName
       {
           
get;
           
set;
       }
   }
   
public class MailContactList : List<MailContact>
   {
   }
}

测试:
            YahooExtract yhe = new YahooExtract();
            NetworkCredential credential = new NetworkCredential(user,pwd);
            MailContactList list = new MailContactList(); 
            Console.WriteLine(yhe.Extract(credential, out list).ToString());
            //i = 1 
            for (int i = 1; i < list.Count; i++)
            {
                Console.WriteLine(list[i].FirstName + list[i].LastName );
            }
            Console.WriteLine(list.Count.ToString());
            Console.ReadKey();

可以到DataTable:
        public static DataTable ConvertCSVIntoDataTable(string strCSV)
        {
            DataTable table;
            try
            {
                Stream s = new MemoryStream(Encoding.UTF8.GetBytes(strCSV));
                DataTable table2 = new DataTable();
                using (CSVReader reader = new CSVReader(s))
                {
                    string[] cSVLine = reader.GetCSVLine();
                    foreach (string str in cSVLine)
                    {
                        table2.Columns.Add(str);
                    }
                    while ((cSVLine = reader.GetCSVLine()) != null)
                    {
                        DataRow row = table2.NewRow();
                        row.ItemArray = cSVLine;
                        table2.Rows.Add(row);
                    }
                }
                table = table2;
            }
            catch (Exception exception)
            {
                throw exception;
            }
            return table;
        }
posted on 2009-10-16 11:47  myx  阅读(511)  评论(0编辑  收藏  举报