0

HttpWebRequest не могу авторизоваться. Логин и пароль правильные вот код выполнения https://repl.it/@SierieghaWend/TrustingBitesizedDataset

public static void Main (string[] args) {
const String CorrectAuthText = "Login successful";
var request = (HttpWebRequest)WebRequest.Create("http://bdonw.ru/index.php?do=login");
var postData = "send_btn=True";
postData += "&login_name=mail@mail.ru";
postData += "&login_password=dragon";
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{ stream.Write(data, 0, data.Length); }
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
if (responseString.Contains(CorrectAuthText))
{
Console.WriteLine ("successful");
}
else
{
Console.WriteLine ("no successful");
}

}

  • Где вы в исходном коде страницы нашли Login successful? – EvgeniyZ Mar 19 '19 at 20:50
  • @EvgeniyZ прошу прощения, там этого нету я взял код с сайта – Андрюха Рейз Mar 19 '19 at 20:58
  • Отловите запрос, который отправляет сайт к примеру через Fiddler и посмотрите что он точно отправляет (может Cookie, может заголовок или что то еще) и посмотрите ответ. Я мельком глянул и он меня редиректнул на 404 страницу почему то, на которой была кнопка "Выход", но точно не было "Login successful"... – EvgeniyZ Mar 19 '19 at 21:03
  • @EvgeniyZ знал бы я как ловить эти запросы давно бы сделал . – Андрюха Рейз Mar 19 '19 at 21:09
  • Поставили программу, запустили, включили отлов, запустили браузер (лучше без расширений), зашли на сайт, вошли под учеткой, выключаете в программе отлов, ищите запрос авторизации. – EvgeniyZ Mar 19 '19 at 21:14

2 Answers2

1

Могу предложить свой клиент авторизации (использую повседневно).

P.S. Авторизует на любом сайте, который использует DataLife Engine

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Threading.Tasks;

namespace DleAuthClient
{
    class Program
    {
        static void Main(string[] args)
        {
            using (DleEngineWebClient newWorldClient = new DleEngineWebClient(new Uri("http://bdonw.ru/")))
            {
                Console.Write("Enter your login: ");
                string userLogin = Console.ReadLine();
                Console.Write("Enter your password: ");
                string userPwd = Console.ReadLine();
                Console.WriteLine("Login Result: {0}\nPress Any Key to logout...", newWorldClient.AuthUser(userLogin, userPwd));

                Console.ReadKey(true);

                Console.WriteLine("Logout Result: {0}", newWorldClient.LogoutUser());
            }

            Console.ReadKey(false);
        }

        public struct UserLoginInfo
        {
            private string _userLogin;
            private string _userPassword;

            public UserLoginInfo(string login, string pwd)
            {
                _userLogin = login;
                _userPassword = pwd;
            }

            public HttpContent ZipToSend()
            {
                return new FormUrlEncodedContent(new KeyValuePair<string, string>[]
                {
                    new KeyValuePair<string, string>("login_name", _userLogin),
                    new KeyValuePair<string, string>("login_password", _userPassword),
                    new KeyValuePair<string, string>("login", "submit"), 
                });
            }
        }

        class DleEngineWebClient : IDisposable
        {
            private readonly HttpClient _httpClient;
            private readonly CookieContainer _cookies;
            private const string cookiesName = "bdo_nw_client.cookie"; // название кукисов

            private readonly string userDocumentsDirectory =
                Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments,
                    Environment.SpecialFolderOption.Create);

            public DleEngineWebClient(Uri siteAddress)
            {
                _cookies = TryLoadCookies();

                HttpClientHandler clientHandler = new HttpClientHandler
                {
                    UseCookies = true,
                    AllowAutoRedirect = true,
                    MaxAutomaticRedirections = 10,
                    CookieContainer = _cookies,
                };

                _httpClient = new HttpClient(clientHandler, true)
                {
                    BaseAddress = siteAddress,
                    Timeout = TimeSpan.FromSeconds(30.0D)
                };
            }

            /// <summary>
            /// Пытается найти существующие кукисы, и загрузить их.
            /// Если кукисов нет, создадим новые кукисы, и заполним пустыми данными.
            /// </summary>
            /// <returns><seealso cref="CookieContainer"/></returns>
            private CookieContainer TryLoadCookies()
            {
                Directory.CreateDirectory(Path.Combine(userDocumentsDirectory, "BdoNow"));
                string cookiesPath = Path.Combine(userDocumentsDirectory, "BdoNow", cookiesName);
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                if (File.Exists(cookiesPath))
                {
                    Debug.WriteLine("[{0}] [{1}] Cookies found, try to load...", "INFO", DateTime.Now);
                    using (FileStream fileCookies =
                        File.Open(Path.Combine(cookiesPath), FileMode.Open, FileAccess.Read))
                    {
                        return binaryFormatter.Deserialize(fileCookies) as CookieContainer;
                    }
                }

                Debug.WriteLine("[{0}] [{1}] Cookies not found! Create a cookies and write some empty data...",
                    "WARNING", DateTime.Now);
                using (FileStream cookies = File.Create(cookiesPath))
                {
                    binaryFormatter.Serialize(cookies, new CookieContainer());
                    return new CookieContainer();
                }
            }

            /// <summary>
            /// Сохраняет кукисы на диск для дальнейшего использования их клиентом.
            /// </summary>
            private void SaveCookies()
            {
                Directory.CreateDirectory(Path.Combine(userDocumentsDirectory, "BdoNow"));
                string cookiesPath = Path.Combine(userDocumentsDirectory, "BdoNow", cookiesName);
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                if (File.Exists(cookiesPath))
                {
                    Debug.WriteLine("[{0}] [{1}] Saving cookies to disk, before destroy the object...", "INFO", DateTime.Now);
                    using (FileStream fileCookies =
                        File.Open(Path.Combine(cookiesPath), FileMode.Open, FileAccess.Read))
                    {
                        binaryFormatter.Serialize(fileCookies, _cookies);
                    }
                }
            }

            public bool LogoutUser()
            {
                return LogoutUserAsync().GetAwaiter().GetResult();
            }

            public async Task<bool> LogoutUserAsync()
            {
                using (HttpResponseMessage message = await _httpClient.GetAsync(new Uri("/?action=logout", UriKind.Relative)))
                {
                    bool result = message.IsSuccessStatusCode;
                    CookieCollection collection = _cookies.GetCookies(_httpClient.BaseAddress);
                    foreach (Cookie cookie in collection)
                    {
                        if (cookie.Name.Equals("dle_user_id", StringComparison.InvariantCultureIgnoreCase) ||
                            cookie.Name.Equals("dle_user_password", StringComparison.InvariantCultureIgnoreCase))
                        {
                            return result && false;
                        }
                    }

                    return result;
                }
            }

            public async Task<bool> AuthUserAsync(string userlogin, string userPwd, CancellationToken ct = default(CancellationToken))
            {
                using (HttpResponseMessage message = await _httpClient.PostAsync(new Uri("/", UriKind.Relative),
                    new UserLoginInfo(userlogin, userPwd).ZipToSend(), ct))
                {
                    message.EnsureSuccessStatusCode();
                    CookieCollection collection = _cookies.GetCookies(_httpClient.BaseAddress);
                    foreach (Cookie cookie in collection)
                    {
                        if (cookie.Name.Equals("dle_user_id", StringComparison.InvariantCultureIgnoreCase) ||
                            cookie.Name.Equals("dle_user_password", StringComparison.InvariantCultureIgnoreCase))
                        {
                            return true;
                        }
                    }

                    return false;
                }
            }

            public bool AuthUser(string userlogin, string userPwd)
            {
                return AuthUserAsync(userlogin, userPwd).GetAwaiter().GetResult();
            }

            private void ReleaseUnmanagedResources()
            {
                _httpClient?.Dispose();
            }

            public void Dispose()
            {
                ReleaseUnmanagedResources();
                GC.SuppressFinalize(this);
            }

            ~DleEngineWebClient()
            {
                SaveCookies();
                ReleaseUnmanagedResources();
            }
        }
    }
}
  • Ого вот это код) я не дома , посмотрю позже . Спасибо тоже за ответ – Андрюха Рейз Mar 20 '19 at 08:03
  • в чем его особенность ? – Андрюха Рейз Mar 20 '19 at 08:06
  • Сохранение, загрузка кукисов, т.е. не надо при каждом запуске программы просить пользователя авторизоваться, но, что бы это дело проверить, вам стоит дописать один небольшой метод на подобии HasLoggedIn() который бы проверял кукисы на наличие авторизации после их загрузки. Плюс еще в том что он будет работать на любом сайте, который использует движок DataLife Engine –  Mar 20 '19 at 08:09
  • Вы знаите dle достаточно ? – Андрюха Рейз Mar 20 '19 at 08:14
  • Думаю вполне достаточно знаний. –  Mar 20 '19 at 08:19
  • Хорошо , задам вам вопрос мин через 15-20) – Андрюха Рейз Mar 20 '19 at 08:23
  • у меня есть база данных, в dle_users я добавил колонку с надписью subscirbe "тип data" , так вот мне нужно сделать что бы пользователь не смог авторизоваться если это число уже прошло – Андрюха Рейз Mar 20 '19 at 08:58
  • так вот в dle где то в engine\modules\sitelogin.tpl - этот файл отвечает за авторизацию как я понял – Андрюха Рейз Mar 20 '19 at 09:32
  • Если вы хотите получить ответ на интересующий вас вопрос из комментария, вам стоит задать специфичный вопрос, связанный с php и dle. –  Mar 20 '19 at 09:40
  • Ок ща задам 1 мин – Андрюха Рейз Mar 20 '19 at 09:42
0
string postCode = "login_name="+Email+"&login_password="+Password+"&login=submit";
        byte[] bytes = Encoding.Default.GetBytes(postCode);
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://bdonw.ru");
        req.Method = "POST";
        req.Host = "bdonw.ru";
        req.ContentLength = bytes.Length;
        req.Headers.Add(HttpRequestHeader.CacheControl, "max-age=0");
        req.Headers.Add("Origin", "http://bdonw.ru");
        req.Headers.Add("Upgrade-Insecure-Requests", "1");
        req.ContentType = "application/x-www-form-urlencoded";
        req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 OPR/58.0.3135.107";
        req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
        req.Referer = "http://bdonw.ru/";
        req.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
        req.Headers.Add(HttpRequestHeader.AcceptLanguage, "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");
        req.CookieContainer = new CookieContainer();

        using (Stream stream = req.GetRequestStream())
        {
            stream.Write(bytes, 0, bytes.Length);
        }

        HttpWebResponse response = (HttpWebResponse)req.GetResponse();
        string result = response.Headers.Get("Set-Cookie");
        var regLogin = new System.Text.RegularExpressions.Regex(@"dle_user_id[^ ]+");
        var regPass = new System.Text.RegularExpressions.Regex(@"dle_password[^ ]+");
        string login = regLogin.Match(result).Value;
        string pass = regPass.Match(result).Value;
        Console.WriteLine("Login {0}\nPassword {1}",login, pass);
Sergey_73
  • 170