1

私は現在、FTP のユーザーを管理するための Web インターフェースを自動化しているところです。

私はHttpWebRequestでこれをやろうとしています.1回の呼び出しでサイトにログインし、2回目の呼び出しはFTPアクセス用の新しいユーザーを追加することを想定しています.

ブラウザで 2 つの URL を試してみましたが、それらは機能し、最終的にユーザーが作成されます。

string login = "https://www.ftpsite.net/./panel/index.php?txvUsername=myaccount&txvPassword=myPassword&submitButton=Login";

これにより、ブラウザのアドレスバーに入力するとログインできます。

ユーザーを作成するための 2 番目の呼び出しは次のとおりです。

string createUser = "https://www.ftpSite.net/panel/ftpsites/updatelogin?login_id=&login=toto123&realname=realnametoto&homedir=root&passwd=superpassword11&expdate=01-01-2100&neverExpire=on&quota_value=0&quota_unit=GB&group_id=0&status=on&ftp=on&filelist=on&ftp_download=on&http=on&web_filelist=on&web_download=on&email=";

これにより、ログインしたユーザーの後に続く場合、ブラウザのアドレスバーに入力するとユーザーが作成されます。

私の問題は、HttpWebRequest を使用してこれを実行しようとしていて、成功していないことです。ログインできますが、ユーザーを作成しようとすると、作成したユーザーが多すぎるという「悪い」エラーコードが返されるようです。これは、呼び出し後にさらに作成できるため、そうではありません。これが私がHttpRequestで使用するコードです

        _datCookie = new CookieContainer();
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(login);
        httpWebRequest.Method = "POST";
        httpWebRequest.CookieContainer = _datCookie;

        WebResponse response = httpWebRequest.GetResponse();
        referer = response.ResponseUri.AbsoluteUri;

        Stream requestStream = response.GetResponseStream();
        StreamReader streamReader = new StreamReader(requestStream);
        _datCookie = httpWebRequest.CookieContainer;
        response.Close();



        httpWebRequest = (HttpWebRequest)WebRequest.Create(createUser);
        httpWebRequest.CookieContainer = _datCookie;
        httpWebRequest.Referer = referer;
        httpWebRequest.Method = "POST";


        response = httpWebRequest.GetResponse();

        requestStream = response.GetResponseStream();
        streamReader = new StreamReader(requestStream);


        webBrowser.DocumentText = streamReader.ReadToEnd();

        response.Close();

ここで私が捕まえて真似しようとしたことは成功しませんでし

4

1 に答える 1

1

それらは POST 要求であるべきですか? URL には、クエリ文字列にすべてのフィールドが含まれているように見えます。これは、代わりに GET リクエストである必要があることを示唆しています。

Fiddler のスクリーンショットに基づいて、クエリ文字列ではなく、本文のフィールドを使用して POST 要求を行う必要があります。

var cookies = new CookieContainer();

// Request 1 : Login
var request = (HttpWebRequest)WebRequest.Create("https://www.ftpsite.net/./panel/index.php");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookies;

string postData = "txvUsername=myaccount&txvPassword=myPassword&submitButton=Login";
byte[] postBytes = Encoding.Default.GetBytes(postData);
request.ContentLength = postBytes.Length;
using (Stream bod = request.GetRequestStream())
{
   body.Write(postBytes, 0, postBytes.Length);
}

WebResponse response = request.GetResponse();
string referer = response.ResponseUri.AbsoluteUri;

// Request 2 : Create user
request = (HttpWebRequest)WebRequest.Create("https://www.ftpSite.net/panel/ftpsites/updatelogin");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookies;

postData = "login_id=&login=toto123&realname=realnametoto&homedir=root&passwd=superpassword11&expdate=01-01-2100&neverExpire=on&quota_value=0&quota_unit=GB&group_id=0&status=on&ftp=on&filelist=on&ftp_download=on&http=on&web_filelist=on&web_download=on&email=";
postBytes = Encoding.Default.GetBytes(postData);
request.ContentLength = postBytes.Length;
using (Stream bod = request.GetRequestStream())
{
   body.Write(postBytes, 0, postBytes.Length);
}

response = request.GetResponse();
requestStream = response.GetResponseStream();
streamReader = new StreamReader(requestStream);
webBrowser.DocumentText = streamReader.ReadToEnd();
response.Close();
于 2012-11-12T20:23:05.697 に答える