最近,做了个百度“阳光牧场”网页游戏的外挂,其中的核心环节是“登录”,在一个月以前,我的外挂能正常运行,可最近一段时间,不能正常登录了,现在我将我的登录部分贴出来,请求高手帮我看一下。谢谢。HTTP请求类using System;
using System.Net;
using System.IO;
using System.Text;namespace Farm
{
/// <summary>
/// HTTP请求类
/// </summary>
public class MyHttp
{
public MyHttp()
{
        }        #region 通过Post方式发送数据
        /// <summary>
/// 通过Post方式发送数据
/// </summary>
/// <param name="Url">Url</param>
/// <param name="postDataStr">Post数据</param>
/// <param name="cookie">cookie</param>
        /// <returns>返回数据</returns>
        public static string SendDataByPost(string Url, string postDataStr, ref CookieContainer cookie)
        {
try
{
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
if (cookie.Count == 0)
{
request.CookieContainer = new CookieContainer();
cookie = request.CookieContainer;
}
else 
{
request.CookieContainer = cookie;
}

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
// new Add
//request.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
request.ContentLength = postDataStr.Length;
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
myStreamWriter.Write(postDataStr);
myStreamWriter.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312"));
string retString= myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();

return retString;
}
catch
{
return "";
}
        }
        #endregion        #region 同步通过GET方式发送数据
        /// <summary>
   /// 通过GET方式发送数据
   /// </summary>
   /// <param name="Url">url</param>
   /// <param name="postDataStr">GET数据</param>
   /// <param name="cookie">GET容器</param>
   /// <returns></returns>
   public static string SendDataByGET(string Url, string postDataStr, ref CookieContainer cookie)
   {
    string sendurl = Url +(postDataStr == "" ? "" : "?") + postDataStr;    
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sendurl);
    //HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url +(postDataStr == "" ? "" : "?") + postDataStr);
if (cookie.Count == 0)
{
request.CookieContainer = new CookieContainer();
cookie = request.CookieContainer;
}
else
{
request.CookieContainer = cookie;
}

request.Method = "GET";
request.ContentType = "text/html;charset=utf-32";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();

return retString;
   }
   #endregion

}
}登录方法 private bool LoginGame(string name, string pwd)
{
string Url0 = "https://passport.baidu.com/?login&tpl=sp&tpl_reg=spsp&u=http%3A%2F%2Fapps.hi.baidu.com%2Fsunfarm";
string Url1 = "https://passport.baidu.com/?login";
string Url2 = "http://apps.hi.baidu.com/sunfarm";
string Url3 = "http://sunfarm.baiduapp.com";
string Url4 = "http://sunfarm.baiduapp.com/embed_swf/";
string KeyWord = "session_name=sessionid";
string SesssionIdKeyWord = "session_value=";
string UidKeyWord = "uid=";
string strRet = ""; CommandParams cpm = this.GetLoginParams(name, pwd);
CookieContainer cc = new CookieContainer(); strRet = MyHttp.SendDataByGET(Url1, cpm.Cp, ref cc);
//strRet = MyHttp.SendDataByPost(Url1, cpm.Cp, ref cc);
//WriteLog("Length:" + strRet.Length.ToString());
//WriteLog(strRet);
if (strRet.IndexOf(Url2) == -1)
{
return false;
}

try
{
strRet = MyHttp.SendDataByGET(Url2, "", ref cc);
//WriteLog(strRet);
if (strRet.IndexOf(Url3) == -1)
{
return false;
}

string UrlData1 = AnalyzingHtmlCode(strRet);
//WriteLog(UrlData1);
strRet = MyHttp.SendDataByGET(Url3, UrlData1, ref cc);
//WriteLog(strRet);
if (strRet.IndexOf(Url4) == -1)
{
return false;
}

string UrlData2 = AnalyzingHtmlCode(strRet, Url4);
//WriteLog(UrlData2);
strRet = MyHttp.SendDataByGET(Url4, UrlData2, ref cc);
//WriteLog(strRet);
if (strRet.IndexOf(KeyWord) == -1)
{
return false;
}
else
{
this.SessionId = Tools.GetValueByKey(strRet, SesssionIdKeyWord, "&", "\"").Replace(SesssionIdKeyWord, "");
this.Uid = Tools.GetValueByKey(strRet, UidKeyWord, "&", "\"").Replace(UidKeyWord, "");
}
}
catch
{
return false;
}

return true;
}

解决方案 »

  1.   

    你post请求的时候得到返回值那里有问题!可能是哪里的到百度返回给你的数据截取出问题了
      

  2.   

    分析每一步的登陆过程.一个HTTP请求类
      

  3.   

    http://blog.csdn.net/sckoo/archive/2010/01/02/5122741.aspx
      

  4.   

    HttpAnalyzerStdV3
    专业的捉包工具。。
      

  5.   

                    PostData = "tpl_ok=&next_target=&tpl=&skip_ok=&aid=&need_pay=&need_coin=&pay_method=&u=.%2F&return_method=get&more_param=&return_type=&psp_tt=0&password=" + HttpUtility.UrlEncode(UserPass, PG.MyCode) + "&safeflg=0&username=" + HttpUtility.UrlEncode(UserName, PG.MyCode) + "&verifycode=" + HttpUtility.UrlEncode(UserYZM.Trim(), PG.MyCode);
                    WebCodes = PG.PostDataSSL("https://passport.baidu.com/?login", "http://hi.baidu.com", PostData, "POST", UserCookie, "");