C# 远程服务器返回错误:(401)未经授权
我正在使用提取gmail联系人。I getC# 远程服务器返回错误:(401)未经授权,c#,gmail,http-status-code-401,networkcredentials,C#,Gmail,Http Status Code 401,Networkcredentials,我正在使用提取gmail联系人。I get远程服务器在执行此行时返回错误:(401)未经授权。 HttpWebResponse exportResponse=(HttpWebResponse)contactsRequest.GetResponse() 下面是完整的GmailExtract类 using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; us
远程服务器在执行此行时返回错误:(401)未经授权。
HttpWebResponse exportResponse=(HttpWebResponse)contactsRequest.GetResponse()代码>
下面是完整的GmailExtract
类
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using Utilities.Web;
namespace OpenContactsNet
{
public class GmailExtract : IMailContactExtract
{
private const string ContinueUrl = "http://mail.google.com/mail?ui=html&zy=l";
private const string ExportUrl = "https://mail.google.com/mail/contacts/data/export?exportType=ALL&groupToExport=&out=GMAIL_CSV";
private const string LoginRefererUrl = "https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl<mpl=default<mplcache=2";
private const string LoginUrl = "https://www.google.com/accounts/ServiceLoginAuth?service=mail";
private const string UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 1.0.3705; .NET CLR 3.0.04506.30)";
#region IMailContactExtract Members
public bool Extract( NetworkCredential credential, out MailContactList list )
{
bool result = false;
list = new MailContactList();
try
{
CookieCollection cookies = new CookieCollection();
// Prepare login form data
HttpValueCollection loginFormValues = new HttpValueCollection();
loginFormValues[ "ltmpl" ] = "default";
loginFormValues[ "ltmplcache" ] = "2";
loginFormValues[ "continue" ] = ContinueUrl;
loginFormValues[ "service" ] = "mail";
loginFormValues[ "rm" ] = "false";
loginFormValues[ "hl" ] = "en";
loginFormValues[ "Email" ] = credential.UserName;
loginFormValues[ "Passwd" ] = credential.Password;
loginFormValues[ "PersistentCookie" ] = "true";
loginFormValues[ "rmShown" ] = "1";
loginFormValues[ "null" ] = "Sign In";
// Convert to bytes
byte[] loginPostData = Encoding.UTF8.GetBytes( loginFormValues.ToString( true ) );
HttpWebRequest loginRequest = ( HttpWebRequest ) WebRequest.Create( LoginUrl );
loginRequest.Method = "POST";
loginRequest.UserAgent = UserAgent;
loginRequest.Referer = LoginRefererUrl;
loginRequest.ContentType = "application/x-www-form-urlencoded";
loginRequest.ContentLength = loginPostData.Length;
loginRequest.AllowAutoRedirect = false;
// Create cookie container
loginRequest.CookieContainer = new CookieContainer();
// Add post data to request
Stream stream;
using ( stream = loginRequest.GetRequestStream() )
{
stream.Write( loginPostData, 0, loginPostData.Length );
}
HttpWebResponse loginResponse = ( HttpWebResponse ) loginRequest.GetResponse();
cookies.Add( loginResponse.Cookies );
// Create request to export Google CSV page
HttpWebRequest contactsRequest = ( HttpWebRequest ) WebRequest.Create( ExportUrl );
contactsRequest.Method = "GET";
contactsRequest.UserAgent = UserAgent;
contactsRequest.Referer = loginResponse.ResponseUri.ToString();
// use cookie gotten from login page
contactsRequest.CookieContainer = new CookieContainer();
foreach ( Cookie cookie in cookies )
{
contactsRequest.CookieContainer.Add( cookie );
}
HttpWebResponse exportResponse = ( HttpWebResponse ) contactsRequest.GetResponse();
// Read data from response stream
string csvData;
using ( Stream responseStream = exportResponse.GetResponseStream() )
{
using ( StreamReader streamRead = new StreamReader( responseStream ) )
{
csvData = streamRead.ReadToEnd();
}
}
// parse google csv
string[] lines = csvData.Split( '\n' );
foreach ( string line in lines )
{
string[] values = line.Split( ',' );
if ( values.Length < 2 )
{
continue;
}
MailContact mailContact = new MailContact();
mailContact.Email = values[ 1 ];
mailContact.Name = values[ 0 ];
list.Add( mailContact );
}
result = true;
}
catch (Exception e)
{
throw e;
}
return result;
}
#endregion
}
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
Net系统;
使用系统文本;
使用Utilities.Web;
名称空间OpenContactsNet
{
公共类GmailExtract:IMailContactExtract
{
私有常量字符串ContinueUrl=”http://mail.google.com/mail?ui=html&;zy=l”;
私有常量字符串ExportUrl=”https://mail.google.com/mail/contacts/data/export?exportType=ALL&groupToExport=&out=GMAIL_CSV";
private const string LoginRefererUrl=”https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl<mpl=default<mplcache=2";
私有常量字符串LoginUrl=”https://www.google.com/accounts/ServiceLoginAuth?service=mail";
private const string UserAgent=“Mozilla/4.0(兼容;MSIE 7.0;Windows NT 5.1;EmbeddedWB 14.52来自:http://www.bsalsa.com/ EmbeddedWB 14.52;.NET CLR 1.1.4322;.NET CLR 2.0.50727;InfoPath.1;.NET CLR 1.0.3705;.NET CLR 3.0.04506.30)”;
#区域IMailContactExtract成员
公共bool摘录(网络凭证凭证、out-MailContactList列表)
{
布尔结果=假;
list=新邮件联系人列表();
尝试
{
CookieCollection cookies=新CookieCollection();
//准备登录表单数据
HttpValueCollection loginFormValues=新的HttpValueCollection();
loginFormValues[“ltmpl”]=“默认值”;
loginFormValues[“ltmplcache”]=“2”;
loginFormValues[“continue”]=ContinueUrl;
loginFormValues[“服务”]=“邮件”;
loginFormValues[“rm”]=“false”;
loginFormValues[“hl”]=“en”;
loginFormValues[“Email”]=凭证.UserName;
loginFormValues[“Passwd”]=凭证.密码;
loginFormValues[“PersistentCookie”]=“true”;
loginFormValues[“rmShowed”]=“1”;
loginFormValues[“null”]=“登录”;
//转换为字节
byte[]loginPostData=Encoding.UTF8.GetBytes(loginFormValues.ToString(true));
HttpWebRequest loginRequest=(HttpWebRequest)WebRequest.Create(LoginUrl);
loginRequest.Method=“POST”;
loginRequest.UserAgent=用户代理;
loginRequest.Referer=LoginRefererUrl;
loginRequest.ContentType=“应用程序/x-www-form-urlencoded”;
loginRequest.ContentLength=loginPostData.Length;
loginRequest.AllowAutoRedirect=false;
//创建cookie容器
loginRequest.CookieContainer=新CookieContainer();
//将post数据添加到请求
溪流;
使用(stream=loginRequest.GetRequestStream())
{
stream.Write(loginPostData,0,loginPostData.Length);
}
HttpWebResponse loginResponse=(HttpWebResponse)loginRequest.GetResponse();
cookies.Add(loginResponse.cookies);
//创建导出Google CSV页面的请求
HttpWebRequest contactsRequest=(HttpWebRequest)WebRequest.Create(ExportUrl);
contactsRequest.Method=“GET”;
contactsRequest.UserAgent=用户代理;
contactsRequest.Referer=loginResponse.ResponseUri.ToString();
//使用从登录页面获取的cookie
contactsRequest.CookieContainer=新CookieContainer();
foreach(cookies中的Cookie)
{
contactsRequest.CookieContainer.Add(cookie);
}
HttpWebResponse exportResponse=(HttpWebResponse)contactsRequest.GetResponse();
//从响应流读取数据
字符串csvData;
使用(Stream responseStream=exportResponse.GetResponseStream())
{
使用(StreamReader streamRead=新StreamReader(responseStream))
{
csvData=streamRead.ReadToEnd();
}
}
//解析谷歌csv
string[]line=csvData.Split('\n');
foreach(行中的字符串行)
{
string[]value=line.Split(',');
如果(值。长度<2)
{
继续;
}
MailContact MailContact=新的MailContact();
mailContact.Email=值[1];
mailContact.Name=值[0];
列表。添加(邮件联系人);
}
结果=真;
}
捕获(例外e)
{
投掷e;
}
返回结果;
}
#端区
}
}
我不熟悉谷歌的api,也不了解C。
但是,请检查您将表单发送到的URL。
看起来你的身份验证有效。否则你会得到403分。
401表示您(作为经过身份验证的用户)不允许访问请求的资源。10.4.2 401未经授权
请求需要用户身份验证。响应必须包括WWW Authenticate标头字段(第14.47节),其中包含适用于请求资源的质询。客户可能会重复
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using Utilities.Web;
namespace OpenContactsNet
{
public class GmailExtract : IMailContactExtract
{
private const string ContinueUrl = "http://mail.google.com/mail?ui=html&zy=l";
private const string ExportUrl = "https://mail.google.com/mail/contacts/data/export?exportType=ALL&groupToExport=&out=GMAIL_CSV";
private const string LoginRefererUrl = "https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl<mpl=default<mplcache=2";
private const string LoginUrl = "https://www.google.com/accounts/ServiceLoginAuth?service=mail";
private const string UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 1.0.3705; .NET CLR 3.0.04506.30)";
#region IMailContactExtract Members
public bool Extract( NetworkCredential credential, out MailContactList list )
{
bool result = false;
list = new MailContactList();
try
{
CookieCollection cookies = new CookieCollection();
// Prepare login form data
HttpValueCollection loginFormValues = new HttpValueCollection();
loginFormValues[ "ltmpl" ] = "default";
loginFormValues[ "ltmplcache" ] = "2";
loginFormValues[ "continue" ] = ContinueUrl;
loginFormValues[ "service" ] = "mail";
loginFormValues[ "rm" ] = "false";
loginFormValues[ "hl" ] = "en";
loginFormValues[ "Email" ] = credential.UserName;
loginFormValues[ "Passwd" ] = credential.Password;
loginFormValues[ "PersistentCookie" ] = "true";
loginFormValues[ "rmShown" ] = "1";
loginFormValues[ "null" ] = "Sign In";
// Convert to bytes
byte[] loginPostData = Encoding.UTF8.GetBytes( loginFormValues.ToString( true ) );
HttpWebRequest loginRequest = ( HttpWebRequest ) WebRequest.Create( LoginUrl );
loginRequest.Method = "POST";
loginRequest.UserAgent = UserAgent;
loginRequest.Referer = LoginRefererUrl;
loginRequest.ContentType = "application/x-www-form-urlencoded";
loginRequest.ContentLength = loginPostData.Length;
loginRequest.AllowAutoRedirect = false;
// Create cookie container
loginRequest.CookieContainer = new CookieContainer();
// Add post data to request
Stream stream;
using ( stream = loginRequest.GetRequestStream() )
{
stream.Write( loginPostData, 0, loginPostData.Length );
}
HttpWebResponse loginResponse = ( HttpWebResponse ) loginRequest.GetResponse();
cookies.Add( loginResponse.Cookies );
// Create request to export Google CSV page
HttpWebRequest contactsRequest = ( HttpWebRequest ) WebRequest.Create( ExportUrl );
contactsRequest.Method = "GET";
contactsRequest.UserAgent = UserAgent;
contactsRequest.Referer = loginResponse.ResponseUri.ToString();
// use cookie gotten from login page
contactsRequest.CookieContainer = new CookieContainer();
foreach ( Cookie cookie in cookies )
{
contactsRequest.CookieContainer.Add( cookie );
}
HttpWebResponse exportResponse = ( HttpWebResponse ) contactsRequest.GetResponse();
// Read data from response stream
string csvData;
using ( Stream responseStream = exportResponse.GetResponseStream() )
{
using ( StreamReader streamRead = new StreamReader( responseStream ) )
{
csvData = streamRead.ReadToEnd();
}
}
// parse google csv
string[] lines = csvData.Split( '\n' );
foreach ( string line in lines )
{
string[] values = line.Split( ',' );
if ( values.Length < 2 )
{
continue;
}
MailContact mailContact = new MailContact();
mailContact.Email = values[ 1 ];
mailContact.Name = values[ 0 ];
list.Add( mailContact );
}
result = true;
}
catch (Exception e)
{
throw e;
}
return result;
}
#endregion
}
}
public class GmailExtract : IMailContactExtract
{
private const string ContinueUrl = "https://mail.google.com/mail/?";
private const string ExportUrl = "https://mail.google.com/mail/contacts/data/export?exportType=ALL&groupToExport=&out=GMAIL_CSV";
private const string LoginRefererUrl = "https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl<mpl=default<mplcache=2";
private const string LoginUrl = "https://www.google.com/accounts/ServiceLoginAuth?service=mail";
private const string UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
#region IMailContactExtract Members
public bool Extract( NetworkCredential credential, out MailContactList list)
{
bool result = false;
list = new MailContactList();
DateTime jsStartDate = new DateTime(1970, 1, 1);
TimeSpan endTs = DateTime.Now.Subtract(jsStartDate);
TimeSpan startTs = DateTime.Now.AddMinutes(-2).Subtract(jsStartDate);
try
{
CookieCollection cookies = new CookieCollection();
// Prepare login form data
HttpValueCollection loginFormValues = new HttpValueCollection();
loginFormValues["Email"] = credential.UserName;
loginFormValues["Passwd"] = credential.Password;
loginFormValues["asts"] = "";
loginFormValues["continue"] = ContinueUrl;
loginFormValues["dsh"] = "1461574034599761425";
loginFormValues["hl"] = "en";
loginFormValues["ltmpl"] = "default";
loginFormValues["ltmplcache"] = "2";
loginFormValues["rm"] = "false";
loginFormValues["rmShown"] = "1";
loginFormValues["service"] = "mail";
loginFormValues["signIn"] = "Sign In";
loginFormValues["scc"] = "1";
loginFormValues["ss"] = "1";
loginFormValues["GALX"] = "rBTUs4OAJBI";
loginFormValues["ltmpl"] = "default";
loginFormValues["ltmpl"] = "default";
// Convert to bytes
byte[] loginPostData = Encoding.UTF8.GetBytes( loginFormValues.ToString( true ) );
HttpWebRequest loginRequest = ( HttpWebRequest ) WebRequest.Create( LoginUrl );
loginRequest.Method = "POST";
loginRequest.UserAgent = UserAgent;
loginRequest.Referer = LoginRefererUrl;
loginRequest.ContentType = "application/x-www-form-urlencoded";
loginRequest.ContentLength = loginPostData.Length;
loginRequest.AllowAutoRedirect = false;
// Create cookie container
loginRequest.CookieContainer = new CookieContainer();
loginRequest.CookieContainer.Add(new Cookie("GMAIL_LOGIN", "T" + startTs.Milliseconds.ToString() + "/" + startTs.Milliseconds.ToString() + "/" + endTs.Milliseconds.ToString(), "/", ".google.com"));
loginRequest.CookieContainer.Add(new Cookie("GALX", "rBTUs4OAJBI", "/accounts", ".google.com"));
// Add post data to request
Stream stream;
using ( stream = loginRequest.GetRequestStream())
{
stream.Write( loginPostData, 0, loginPostData.Length);
}
HttpWebResponse loginResponse = ( HttpWebResponse ) loginRequest.GetResponse();
cookies.Add( loginResponse.Cookies );
// Create request to export Google CSV page
HttpWebRequest contactsRequest = ( HttpWebRequest ) WebRequest.Create( ExportUrl );
contactsRequest.Method = "GET";
contactsRequest.UserAgent = UserAgent;
contactsRequest.Referer = loginResponse.ResponseUri.ToString();
// use cookie gotten from login page
contactsRequest.CookieContainer = new CookieContainer();
foreach ( Cookie cookie in cookies )
{
contactsRequest.CookieContainer.Add( cookie );
}
HttpWebResponse exportResponse = ( HttpWebResponse ) contactsRequest.GetResponse();
// Read data from response stream
string csvData;
using ( Stream responseStream = exportResponse.GetResponseStream())
{
using ( StreamReader streamRead = new StreamReader( responseStream ) )
{
csvData = streamRead.ReadToEnd();
}
}
// parse google csv
string[] lines = csvData.Split( '\n' );
foreach ( string line in lines )
{
string[] values = line.Split( ',' );
if ( values.Length < 2 )
{
continue;
}
MailContact mailContact = new MailContact();
mailContact.Email = values[ 28 ];
mailContact.Name = values[ 0 ];
if (mailContact.Email.Trim().Length > 0)
{
list.Add(mailContact);
}
}
result = true;
}
catch
{
}
return result;
}
#endregion
}