워드프레스에 프로그래밍 방식으로 로그인하는 방법
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 소스 코드만 받고 쿠키에는 세션 ID가 없는 것 같습니다.그 코드 이후에 실행하는 모든 요청은 로그인 페이지의 HTML 소스도 반환하기 때문에 정상적으로 로그인되지 않을 수 있습니다.
누가 그 문제를 해결하거나 예를 들어줄 수 있나요?
제가 이루고 싶은 주된 것은 워드프레스용 Nextgen Gallery 플러그인에서 새로운 이미지를 스캔하는 것입니다.XML-RPC의 방법이 있습니까?
잘 부탁드립니다.
WordPress는 리디렉션을 구현하므로 페이지를 떠나면(리다이렉트) 웹 요청이 적절한 쿠키를 가져올 수 없습니다.
관련 쿠키를 얻으려면 리다이렉트를 방지해야 합니다.
request.AllowAutoRedirect = false;
로그인에 cookie-conator 를 사용합니다.
다음 코드를 참조하십시오(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");
다른 사람들이 도움이 될지는 모르겠지만 WordPress API를 사용하여 로그인했습니다.cron 작업의 일부로 야간에 "로그인"하여 몇 가지 작업을 수행하는 사용자(CRON_USR)를 만들었습니다.코드는 다음과 같습니다.
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/');
여러분 덕분이에요.소켓을 사용할 때만 작동하도록 관리했습니다.워드프레스는 여러 Set-Cookie 헤더를 전송하지만HttpWebRequest는 이러한 헤더의 인스턴스를 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"];
TomerBu의 답변은 다음과 같은 추가사항과 함께 적용됩니다.웹 사이트에 SSL 증명서를 설치하고 TLS 1.2에 대한 지원을 추가하고 UserAgent를 설정해야 합니다.TLS1.2를 사용하지 않을 경우 웹 서버는 내 연결 요청을 즉시 거부했습니다.SSL 증명서가 없으면 WordPress 사이트에서는 (로그인에 성공했음에도 불구하고) C# 봇이 후속 WebRequests에 로그인하는 것으로 간주되지 않았습니다.
*** TLS에 관한 중요사항: 저는 보안 프로토콜 초보자이며 저에게 도움이 되는 것만 제공하고 있습니다.를 인스톨 했습니다.NET 4.7.2 Developer Pack을 사용하여 C# 프로젝트의 타깃 프레임워크를 로 변경하였습니다.NET 4.7.2. 단, ServicePoint Manager를 변경해야 합니다.Security Protocol은 다음과 같습니다.를 검색하여 업데이트를 포함한 베스트 프랙티스를 찾습니다.NET 및 비트 ORed 스테이트먼트에 여러 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";
코드에는 명백한 문제가 없습니다. 죄송합니다.단, Wordpress에는 XML-RPC 인터페이스가 있어 관리 인터페이스에서 활성화해야 합니다.이 인터페이스용 파이썬 스크립트를 작성했는데 아주 잘 작동했어요.
WordPress.com 계정(SSL로 보호)으로 시도했습니다.가장 쉬운 방법은 을 사용하는 것임을 알게 되었습니다.NET 소켓을 사용하여 HTTP "Set-Cookie" 헤더를 얻은 후 헤더를 에 해석합니다.NET Cookie 오브젝트를 사용하여 Cookie Container를 HttpWebRequest용 쿠키와 함께 사용합니다.
SSL over 소켓을 사용하는 가장 쉬운 방법은 소켓에 바인드된 네트워크 스트림을 통해 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());
}
}
이 코드는 그다지 효율적이지 않지만 관리 인터페이스에 로그인하는 프로세스를 나타냅니다.
도움이 되었으면 좋겠다:)
토머부가 내게 가장 좋은 답을 줬는데, 뭔가 빠진 게 있어.
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 !!!
}
다음으로는 Cookie Container를 재사용해야 합니다.
언급URL : https://stackoverflow.com/questions/1282602/how-to-login-to-wordpress-programmatically
'programing' 카테고리의 다른 글
| 특정 어레이 항목 내의 단일 값을 redx로 업데이트하는 방법 (0) | 2023.04.01 |
|---|---|
| django REST 프레임워크에서 request.data를 수정하는 방법 (0) | 2023.04.01 |
| 결과가 반환되지 않는 경우의 ExecuteScalar() 처리 (0) | 2023.04.01 |
| IE8의 스타일 특성 내에서 AngularJS 식이 작동하지 않습니다. (0) | 2023.04.01 |
| 코드 가능을 사용하여 JSON으로 시리얼화할 때 Swift 문자열 이스케이프 (0) | 2023.04.01 |