2009-08-15 8 views
5

私はワードプレスの管理パネルでプログラムで実行する必要がありますが、C#とHttpWebRequestを使用してWordpressにログインする方法を管理することはできません。プログラムでWordPressにログインするには?

private void button1_Click(object sender, EventArgs e) 
     { 
      string url = "http://localhost/wordpress/wp-login.php"; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
      CookieContainer cookies = new CookieContainer(); 

      SetupRequest(url, request, cookies); 
      //request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      //request.Headers["Accept-Language"] = "uk,ru;q=0.8,en-us;q=0.5,en;q=0.3"; 
      //request.Headers["Accept-Encoding"] = "gzip,deflate"; 
      //request.Headers["Accept-Charset"] = "windows-1251,utf-8;q=0.7,*;q=0.7"; 


      string user = "test"; 
      string pwd = "test"; 

      request.Credentials = new NetworkCredential(user, pwd); 

      string data = string.Format(
       "log={0}&pwd={1}&wp-submit={2}&testcookie=1&redirect_to={3}", 
       user, pwd, 
       System.Web.HttpUtility.UrlEncode("Log In"), 
       System.Web.HttpUtility.UrlEncode("http://localhost/wordpress/wp-admin/")); 

      SetRequestData(request, data); 

      ShowResponse(request); 
} 

private static void SetupRequest(string url, HttpWebRequest request, CookieContainer cookies) 
     { 
      request.CookieContainer = cookies; 
      request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; uk; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"; 
      request.KeepAlive = true; 
      request.Timeout = 120000; 
      request.Method = "POST"; 
      request.Referer = url; 
      request.ContentType = "application/x-www-form-urlencoded"; 
     } 

     private void ShowResponse(HttpWebRequest request) 
     { 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      responseTextBox.Text = (((HttpWebResponse)response).StatusDescription); 
      responseTextBox.Text += "\r\n"; 
      StreamReader reader = new StreamReader(response.GetResponseStream()); 
      responseTextBox.Text += reader.ReadToEnd(); 
     } 

     private static void SetRequestData(HttpWebRequest request, string data) 
     { 
      byte[] streamData = Encoding.ASCII.GetBytes(data); 
      request.ContentLength = streamData.Length; 

      Stream dataStream = request.GetRequestStream(); 
      dataStream.Write(streamData, 0, streamData.Length); 
      dataStream.Close(); 
     } 

しかし残念ながらresponceに私は、ログインページの唯一のHTMLソースコードを取得し、クッキーはセッションIDが含まれていないようです:ここで

は、私が何をすべきかです。私がこのコードの後に​​実行するすべてのリクエストは、ログインページのHTMLソースも返すので、正しくログインしないと思います。

誰でも私がその問題の解決に役立つことができますか?


私が達成したい主なものは、WordpressのNextgen Galleryプラグインで新しい画像をスキャンすることです。 XML-RPCのやり方はありますか?

ありがとうございます。

答えて

1

皆様に感謝します。私はそれがソケットを使用するときにのみ動作するようにする方法を管理しました。 Wordpressは複数のセットクッキーヘッダーを送信しますが、HttpWebRequestはそのようなヘッダーのインスタンスを1つしか処理しないため、一部のクッキーは失われます。ソケットを使用する際には、必要なすべてのクッキーを取得し、管理パネルにログインすることができます。

+1

を次のようにUserAgentは、いくつかのコードは、他のように悪いことwouldntは定義する必要があります人々はおそらく解決策(私のようなもの)を探しています。それはフォーラムのポイントだよ... – C4u

+0

だから残酷!なぜソリューションはそこにないのですか? –

+0

これは受け入れられる回答ですか?コードなし?確かにあなたは – DidIReallyWriteThat

1

あなたのコードには明らかな問題はありません。申し訳ありません。しかしWordpressにはXML-RPCインターフェイスがあります。これは管理インターフェイスで有効にする必要があります。私はこのインタフェースのためのいくつかのpythonスクリプトを書いて、それは魅力的に働いた。

0

私はWordPress.comアカウント(SSLで保護されています)でこれを試しました。最も簡単な方法は、.NETソケットを使用してHTTPの「Set-Cookie」ヘッダーを取得し、ヘッダーを.NET Cookieオブジェクトに解析して、HttpWebRequestのCookieと共にCookieContainerに使用することです。

ソケットでSSLを使用する最も簡単な方法は、ソケットにバインドされたNetworkStreamを介してSslStreamを実装することです。

例:

private void LogIn() 
    { 
     string fulladdress = "hostname.wordpress.com"; 
     string username = HttpUtility.UrlEncode("username"); 
     string password = HttpUtility.UrlEncode("password"); 

     string formdata = "log={0}&pwd={1}&redirect_to=http%3A%2F%2F{2}%2Fwp-admin%2F&testcookie=1"; 
     formdata = string.Format(formdata, username, password, fulladdress); 
     IPHostEntry entry = Dns.GetHostEntry(fulladdress); 


     Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
     s.Connect(entry.AddressList[0], 443); 

     NetworkStream ns = new NetworkStream(s); 

     System.Net.Security.SslStream ssl = new System.Net.Security.SslStream(ns); 
     byte[] data = Encoding.UTF8.GetBytes(String.Format(WpfApplication2.Properties.Resources.LogRequest, "https://" + fulladdress, fulladdress, form.Length, username, password)); 

     ssl.AuthenticateAsClient(fulladdress); 
     ssl.Write(data, 0, data.Length); 

     StringBuilder sb = new StringBuilder(); 
     byte[] resp = new byte[128]; 
     int i = 0; 
     while (ssl.Read(resp, 0, 128) > 0) 
     { 
      sb.Append(Encoding.UTF8.GetString(resp)); 
     } 

     List<String> CookieHeaders = new List<string>(); 
     foreach (string header in sb.ToString().Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) 
     { 
      if (header.StartsWith("Set-Cookie")) 
      { 
       CookieHeaders.Add(header.Replace("Set-Cookie: ", "")); 
      } 
     } 

     CookieContainer jar = new CookieContainer(); 
     foreach (string cook in CookieHeaders) 
     { 
      string name, value, path, domain; 
      name = value = path = domain = ""; 

      string[] split = cook.Split(';'); 
      foreach (string part in split) 
      { 
       if (part.StartsWith(" path=")) 
       { 
        path = part.Replace(" path=", ""); 
       } 
       if (part.StartsWith(" domain=")) 
       { 
        domain = part.Replace(" domain=", ""); 
       } 
       if (!part.StartsWith(" path=") && !part.StartsWith(" domain=") && part.Contains("=")) 
       { 
        name = part.Split('=')[0]; 
        value = part.Split('=')[1]; 
       } 
      } 

      jar.Add(new Cookie(name, value, path, domain)); 
     } 

     HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://" + fulladdress + "/wp-admin/index.php"); 
     req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"; 
     req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     req.KeepAlive = false; 
     req.AllowAutoRedirect = false; 
     req.Referer = "https://" + fulladdress + "/wp-login.php"; 
     req.ContentType = "application/x-www-form-urlencoded"; 
     req.CookieContainer = jar; 
     req.AllowAutoRedirect = true; 
     req.AutomaticDecompression = DecompressionMethods.GZip; 
     req.Method = "GET"; 
     req.Timeout = 30000; 

     HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 

     using (System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8)) 
     { 
      MessageBox.Show(sr.ReadToEnd()); 
     } 
    } 

コードは非常に効率的ではないが、それは、管理インターフェースにログインするプロセスを示します。

はそれが役に立てば幸い:)

1
NameValueCollection loginData = new NameValueCollection(); 
loginData.Add("username", "your_username"); 
loginData.Add("password", "your_password"); 

WebClient client = new WebClient(); 
string source = Encoding.UTF8.GetString(client.UploadValues("http://www.site.com/login", loginData)); 

string cookie = client.ResponseHeaders["Set-Cookie"]; 
3

他の人は、これが参考になる場合、私は知らないが、私はただのログインにWordPressのAPIを使用していました。私は、ユーザー(CRON_USR)「ログの作成しました"夜のcron仕事の一環として、いくつかのタスクを行います。 WordPressのリダイレクトを実装しているため、適切なクッキーを得ることからWebRequestクラスを防ぐ(リダイレクト)ページを残し、

require(dirname(__FILE__) . '/wp-load.php'); 
$user = wp_authenticate(CRON_USR, CRON_PWD); 
wp_set_auth_cookie($user->ID, true, $secure_cookie); //$secure_cookie is an empty string 
do_action('wp_login', CRON_USR); 
wp_redirect('http://www.mysite.com/wp-admin/'); 
5

: コードはこれです。

関連するCookieを取得するには、リダイレクトを防止する必要があります。

request.AllowAutoRedirect = false; 

ログインにcookie-conatainerを使用するよりも、

は、次のコードを参照してください。(AlbahariのC#の本からの例に基づいて) を

 string loginUri = "http://www.someaddress.com/wp-login.php"; 
     string username = "username"; 
     string password = "pass"; 
     string reqString = "log=" + username + "&pwd=" + password; 
     byte[] requestData = Encoding.UTF8.GetBytes(reqString); 

     CookieContainer cc = new CookieContainer(); 
     var request = (HttpWebRequest)WebRequest.Create(loginUri); 
     request.Proxy = null; 
     request.AllowAutoRedirect = false; 
     request.CookieContainer = cc; 
     request.Method = "post"; 

     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = requestData.Length; 
     using (Stream s = request.GetRequestStream()) 
      s.Write(requestData, 0, requestData.Length); 

     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 
      foreach (Cookie c in response.Cookies) 
       Console.WriteLine(c.Name + " = " + c.Value); 
     } 

     string newloginUri = "http://www.someaddress.com/private/"; 
     HttpWebRequest newrequest = (HttpWebRequest)WebRequest.Create(newloginUri); 
     newrequest.Proxy = null; 
     newrequest.CookieContainer = cc; 
     using (HttpWebResponse newresponse = (HttpWebResponse)newrequest.GetResponse()) 
     using (Stream resSteam = newresponse.GetResponseStream()) 
     using (StreamReader sr = new StreamReader(resSteam)) 
      File.WriteAllText("private.html", sr.ReadToEnd()); 
     System.Diagnostics.Process.Start("private.html"); 
0

TomerBuは私にとって最良の答えを持っていますが、何かが欠けていました。彼のコードで

、remplace:

foreach (Cookie c in response.Cookies) 
      Console.WriteLine(c.Name + " = " + c.Value); 

if (response.Cookies != null) 
    { 
     foreach (Cookie currentcook in response.Cookies) 
      request.CookieContainer.Add(currentcook); //This is the key !!! 
    } 

次FUTUR要求に対する

することにより、あなたはCookieContainerを再利用する必要があります。

0

は、プログラムの共有ホスト(cPanelの)上のWordPressにログインするためには、TomerBu's答えは1に加えて私のためにトリックをした:

... 
request.Proxy = null; 
request.AllowAutoRedirect = false; 
request.CookieContainer = cc; 
request.Method = "post"; 


// Add UserAgent 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"; 
関連する問題