如何登录到WordPress程序?
-
16-09-2019 - |
题
我需要以编程执行WordPress管理面板一些动作,但不能管理如何使用C#和HttpWebRequest的登录到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();
}
但不幸的是在性反应,我得到的登录页面的唯一HTML源代码,似乎cookie不包含会话ID。这是我的代码执行后,所有的请求也返回登录页面的HTML源代码,所以我可以假设它不能正确登录。
任何人可以帮助我解决这个问题,或给工作的例子吗?
这是我想达到
主要的是扫描在NextGen的画廊插件WordPress的新图像。有没有XML-RPC这样做的方法是什么?
预先感谢。
解决方案 3
感谢大家。我设法如何使用插座时,使其只工作。 WordPress的发送数的设置Cookie 强>头但HttpWebRequest
只处理一个这样的报头的实例,以便一些cookie丢失。当使用插座,我可以得到所有需要的饼干和登录到管理面板。
其他提示
由于WordPress的实施重定向,留下页(重定向)防止从的WebRequest得到适当的cookie中。
为了获取相关的cookie,必须防止重定向。
request.AllowAutoRedirect = false;
不是使用cookie的conatainer登录。
见下面的代码: (基于从阿尔巴哈利的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");
我不知道别人会有所帮助,但我只是用WordPress的API登录。我创建了一个用户(CRON_USR)谁“日志中的”晚上的cron作业的一部分,并做了一些工作。 该代码是这样的:
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/');
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"];
我看不出有什么明显的问题与您的代码,对不起。但WordPress的有一个XML-RPC接口,它有在管理界面中启用。我写了一些Python脚本这个接口和它的工作就像一个魅力。
我想这与我的WordPress.com帐户(具有SSL保护)。我发现,最简单的方法是使用.NET插槽来获得HTTP“设置Cookie”标题,然后解析头到.NET Cookie对象,然后用它来的CookieContainer与饼干的HttpWebRequest的。
最容易通过套接字与SSL工作方式是实施SslStream以上的NetworkStream绑定到套接字。
示例:
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());
}
}
的代码不是非常有效的,但它示出了登录到管理界面的过程。
希望它能帮助:)
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 !!!
}
接着对即将成为请求,则必须重新使用的CookieContainer。
TomerBu 的回答对我的作品有以下补充。我不得不在网站上安装SSL证书,增加对TLS1.2的支持,并设置用户代理为了这个工作。如果没有TLS1.2,web服务器立即拒绝了我的连接请求。如果没有SSL证书,WordPress网站没有考虑后续WebRequests要记录在我的C#BOT(即使登录成功)。
***约TLS重要提示:我是一个安全协议的新手,而且只提供我工作。我安装了.NET 4.7.2开发包,并改变了目标框架,我的C#项目到.NET 4.7.2,但我仍然需要修改ServicePointManager.SecurityProtocol,如下图所示。搜索查找最佳做法,包括更新.NET和按位或运算语句中指定多个TLS版本。
// Add support for TLS 1.2 (note bitwise OR)
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
...
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";