2

サイトの管理パネル (Joomla 2.5) に接続する必要があります。私の質問はこのトピックに非常に似ていますが、解決策が見つからないため、あなたの助けを求めています.

ここに私のサンプルコードがあります:

WebClient Client = new WebClient();
System.Collections.Specialized.NameValueCollection Collection = 
new System.Collections.Specialized.NameValueCollection();
Collection.Add("username", "--my username--");
Collection.Add("passwd", "--my password--");
Collection.Add("option", "com_login");
Collection.Add("lang", "");
Collection.Add("task", "login");
//I find the token
byte[] res = Client.UploadValues("http://mysite/administrator/index.php", "POST",     Collection);
string source =  Encoding.UTF8.GetString(res, 0, res.Length);
Regex regex = new Regex("([a-zA-z0-9]{32})")
Match match = regex.Match(source);
if (match.Success)
  string token = match.Value;
//add token value to collection (example value 3e2aedd3de46f8a55ec15a6eb58e1c19)
Collection.Add(token, "1");
//run authorization
byte[] res = Client.UploadValues("http://mysite/administrator/index.php", "POST",  Collection);
string source =  Encoding.UTF8.GetString(res, 0, res.Length);
//in the row, the other token (example 06f1740ef6d6e87ae004500edddd7d7d)

しかし、うまくいきません。「ソース」のトークン値が値「トークン」と等しくありません。私は何を間違っていますか?

4

3 に答える 3

1

誰にとっても、現在のjoomla2.5リリースの完全なソリューションは次のとおりです。

上記のように、WebClient-Classには次の拡張機能が必要です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace joomla.Util
{
    public class CookieAwareWebClient : WebClient
    {
        private CookieContainer cookie = new CookieContainer();

        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            if (request is HttpWebRequest)
                (request as HttpWebRequest).CookieContainer = cookie;

            return request;
        }
    }
}

さらに、joomlaログインにはこれが必要です。

public class JoomlaUserManagement
{
    private const string _USERCOM = "com_users";
    private const string _LOGINVIEW = "login";
    private const string _LOGINTASK = "user.login";
    private const string _REGEXTOKEN = "([a-zA-Z0-9]{32})";
    private const string _REGEXRETURN = "([a-zA-Z0-9]{27}=)";
    private const string _REGEXRETURNLOGOUT = "([a-zA-Z0-9]{52})";

    /// <summary>
    /// Gets the user name which is used to do the joomla login
    /// </summary>
    public String UserName { get; private set; }

    /// <summary>
    /// Gets the root uri to the joomla site.
    /// </summary>
    public Uri SiteRootUri { get; set; }

    /// <summary>
    /// Gets the last error occured when logging in
    /// </summary>
    public String LastError { get; private set; }

    private String _password { get; set; }

    private CookieAwareWebClient client;

    /// <summary>
    /// Initializes an instance for handling login or logoff
    /// </summary>
    /// <param name="userName">The username which is used to do the joomla login</param>
    /// <param name="password">The username which is used to do the joomla login</param>
    /// <param name="siteRoot">The root uri to the joomla site</param>
    public JoomlaUserManagement(String userName, String password, Uri siteRoot)
    {
        UserName = userName;
        _password = password;
        SiteRootUri = siteRoot;
        client = new CookieAwareWebClient();
    }

    /// <summary>
    /// Performs a joomla login.
    /// </summary>
    /// <returns>Returns true if succeeded. False if failed. If false, error will be written to <see cref="LastError"/></returns>
    public Boolean Login()
    {            
        NameValueCollection collection = new NameValueCollection();

        collection.Add("username", UserName);
        collection.Add("password", _password);
        collection.Add("option", _USERCOM);
        collection.Add("lang", "");
        collection.Add("view", _LOGINVIEW);

        // Request tokens.
        String token = null;
        String returnToken = null;

        byte[] result = client.UploadValues(SiteRootUri, "POST", collection);
        string resultingSource = Encoding.UTF8.GetString(result, 0, result.Length);

        Regex regex = new Regex(_REGEXTOKEN);
        Match match = regex.Match(resultingSource);            
        if (match.Success)            
            token = match.Value;

        regex = new Regex(_REGEXRETURN);
        match = regex.Match(resultingSource);
        if (match.Success)
            returnToken = match.Value;

        // Perform login
        if (returnToken != null && token != null)
        {
            collection.Add(token, "1");
            collection.Add("return", returnToken);
            collection.Add("task", "user.login");

            result = client.UploadValues(SiteRootUri, "POST", collection);
            resultingSource = Encoding.UTF8.GetString(result, 0, result.Length);

            // Invalid token?
            if (resultingSource.Length > 16)
                return true;
            else
            {
                LastError = "Unable to login.";
                return false;
            }
        }
        else
        {
            // We don't have all tokens
            LastError = "Unable to retrieve tokens.";
            return false;
        }
    }

    public Boolean Logout()
    {            
        NameValueCollection collection = new NameValueCollection();

        collection.Add("username", UserName);
        collection.Add("password", _password);
        collection.Add("option", _USERCOM);
        collection.Add("lang", "");
        collection.Add("view", _LOGINVIEW);

        // Request tokens.
        String token = null;
        String returnToken = null;

        byte[] result = client.UploadValues(SiteRootUri, "POST", collection);
        string resultingSource = Encoding.UTF8.GetString(result, 0, result.Length);

        Regex regex = new Regex(_REGEXTOKEN);
        Match match = regex.Match(resultingSource);
        if (match.Success)
            token = match.Value;

        regex = new Regex(_REGEXRETURNLOGOUT);
        match = regex.Match(resultingSource);
        if (match.Success)
            returnToken = match.Value;

        // Perform login
        if (returnToken != null && token != null)
        {
            collection.Add(token, "1");
            collection.Add("return", returnToken);
            collection.Add("task", "user.logout");

            result = client.UploadValues(SiteRootUri, "POST", collection);
            resultingSource = Encoding.UTF8.GetString(result, 0, result.Length);

            // Invalid token?
            if (resultingSource.Length > 16)
                return true;
            else
            {
                LastError = "Unable to logout.";
                return false;
            }
        }
        else
        {
            // We don't have all tokens
            LastError = "Unable to retrieve tokens.";
            return false;
        }
    }
}

次に、ログインまたはログアウトできます。

JoomlaUserManagement userMan = new JoomlaUserManagement("john.doe", "password", new Uri("http://www.customer.ltd"));
Boolean loginResult = userMan.Login();
Boolean logoutResult = userMan.Logout();
于 2013-01-06T16:41:47.230 に答える
1

Jérémie Bertrand さん、ヒントをありがとう。このスレ見つけた

WebResponse では理解できず、クラスを使用する

public class CookieAwareWebClient : WebClient
{
private CookieContainer cookie = new CookieContainer();

protected override WebRequest GetWebRequest(Uri address)
{
    WebRequest request = base.GetWebRequest(address);
    if (request is HttpWebRequest)
    {
        (request as HttpWebRequest).CookieContainer = cookie;
    }
    return request;
}
}

次のようにコードを書きました

CookieAwareWebClient Client = new CookieAwareWebClient();
//...on the same

できます :)!

于 2012-11-15T14:26:41.800 に答える
1

WebClient は、Web サイトの動作を模倣しようとする場合に最適な方法ではありません。代わりに HttpWebRequest と HttpWebResponse を使用してください。そして、リクエストの Connection プロパティを「Keep-alive」に設定します。

于 2012-11-15T12:14:35.320 に答える