Je dois effectuer une action dans le panneau d'administration WordPress Programmatiquement mais ne peut pas gérer comment vous connecter à WordPress à l'aide de C # et httpwebrequest.
Voici ce que je fais: p>
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(); }
8 Réponses :
Je ne vois aucun problème évident avec votre code, désolé. Mais WordPress dispose d'une interface XML-RPC, qui doit être activée dans l'interface administrative. J'ai écrit des scripts python pour cette interface et cela a fonctionné comme un charme. P>
Merci à tout le monde. J'ai réussi à le faire fonctionner uniquement lorsque vous utilisez des sockets. WordPress envoie plusieurs Gère une seule instance de cet en-tête de sorte que certains cookies sont perdus. Lorsque vous utilisez des sockets, je peux obtenir tous les cookies nécessaires et vous connecter au panneau d'administration. P>
Certains codes ne seraient pas mauvais, car d'autres personnes cherchent également une solution (comme moi). C'est le point d'un forum ...
Si cruel! Pourquoi la solution n'est pas là?
Vous en effet! Où f *** est le code? essayé de résoudre cela pendant des heures.
J'ai essayé cela avec mon compte WordPress.com (protégé avec SSL). J'ai découvert que le moyen le plus simple est d'utiliser des sockets .NET pour obtenir les en-têtes HTTP "Set-Cookie", puis analyser les en-têtes sur des objets de cookie .NET, puis utiliser pour Cookiecontainer avec les cookies pour httpwebrequest.
La meilleure façon de travailler avec SSL sur les sockets consiste à implémenter SSLSTREAM sur NetworkStream lié à la prise. p>
Exemple: p> Le code n'est pas très efficace, mais il illustre la processus de journalisation dans l'interface d'administration. P> espère qu'il aide :) p> p>
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"];
Je ne sais pas si les autres trouveront cela utiles, mais je viens d'utiliser l'API WordPress pour vous connecter. J'ai créé un utilisateur (Cron_USR) qui "se connecte" la nuit dans le cadre d'un travail cron et fait quelques tâches .
Le code est-ce:
Puisque WordPress implémente une redirection, laissant la page (redirection) empêche le WebRequest d'obtenir le cookie approprié.
Pour obtenir le cookie concerné, il faut empêcher les redirections. P>
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");
Tomerbu a la meilleure réponse pour moi, mais quelque chose manquait.
Dans son code, Remplace: p> par p> Suivant pour la demande futur, vous devrez réutiliser Cookiecontainer. P> P>
La réponse de Tomerbu fonctionne pour moi avec les ajouts suivants. J'ai dû installer un certificat SSL sur le site Web, ajoutez prise en charge de TLS1.2 et définissez le utilisateur pour que cela fonctionne. Sans TLS1.2, le serveur Web Web a immédiatement rejeté ma demande de connexion. Sans le certificat SSL, le site WordPress n'a pas considéré que mon C # Bot est connecté pour être connecté à des webreux ultérieurs (même si la connexion a été réussie).
*** Note importante sur TLS: Je suis un protocole de sécurité novice et je suis Fournir uniquement ce qui a fonctionné pour moi. J'ai installé le pack de développeur .NET 4.7.2 et modifié le cadre cible de mon projet C # à .NET 4.7.2, mais je devais toujours modifier le servicepointManager.securityProtocol comme indiqué ci-dessous. Recherchez dans la recherche de meilleures pratiques, y compris la mise à jour .NET et la spécification de plusieurs versions TLS dans une instruction DERDWWise. P>
// 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";