Cloud Flare - обход защиты на легке

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
upload_2018-3-4_1-34-51.jpeg

Периодически на форуме возникает вопрос, как же ее обойти.

Обойти ее можно несколькими вариантами.
На форуме уже выкладывались решения в том или ином формате, но в большинстве случаев это достаточно громоздкие решения, к примеру с кучей кубиков, которые не удобно таскать из проекта в проект.

Так как же сделать так, чтобы это было удобно?

По началу использовал Jint в который пихал js скрипт полученный с сайта при заходе на который всплывала защита cloudflare, парсил параметры, остылал запросы, и т.д.
Плюс пробить cloudflare с первой попытки бывает не всегда получается, т.е надо отсылать запросы, смотреть что получилось, и так несколько раз. В общем не совсем удобно.

Потом наткнулся на CloudFlareUtilites в котором уже есть все что надо, т.е. сам механизм обхода защиты. В итоге отдаются куки, которые можно использовать в дальнейшем.

Осталось поверх этого решения сделать свою обвязку из кода для удобства использования.:-)

В дальнейшем был сделан класс, который удобно юзать и в ZennoPoster, и в своих прогах.

В итоге, чтобы обойти защиту cloudflare в ZennoPoster, надо сделать несколько простых шагов.

1. Добавить в OwnCode класс CloudFlareBreaker и необходимые namespace
upload_2018-3-4_1-6-15.png


2. Добавить необходимые библиотеки
upload_2018-3-4_1-10-18.png

System.Net.Http и System.Runtime это системные библиотеки.
CloudFlareUtilites необходимо добавить в ExternalAssemblies в папке ZennoPoster


3. Использовать
upload_2018-3-4_1-30-33.png
Сделаем пробив защиты на примере известного сайта.:-)
Создаем объект класса CloudFlareBreaker, инициализируем св-ва.

Address - адрес сайта
Proxy - прокси
UserAgent - юзерагент
MaxRetries - кол-во попыток пробива cloudlfare

Дальше вызываем метод Break
upload_2018-3-4_1-30-12.png

После этого куки для обхода cloudlfare можно получить в двух форматах:
string - удобно юзать в ZennoPoster
CookieContainer - его удобно использовать в своих прогах, или в ZennoPoster, если работать с .Net классами напрямую. Также его можно передавать через project.Context в самом ZennoPoster.

Соответственно есть два метода GetCookieContainer и GetCookieStr через которые и получаем куки. Если эти методы возвращают null, то значит защиту пробить не получилось.

Дальше добавляем эти куки к основным и работаем.
upload_2018-3-4_1-26-29.png
 
Категория
Полезно

Вложения

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

Nord

Client
Регистрация
22.03.2012
Сообщения
2 406
Благодарностей
1 473
Баллы
113
Спасибо! Крутая штука!
 
  • Спасибо
Реакции: Moadip

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Слишком замороченное решение, на мой взгляд. Всё отлично работает и решается в 130-150 строк кода без всяких доп. библиотек и на форуме даже где-то было такое решение.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
я единственный, кто рекапчу на кф встречает?
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Может прокси заюзанные?
Или уровень паранойи владельцев конкретного сайта повышенный.

Ни разу на прокладке кф рекапчи не видел.
 
  • Спасибо
Реакции: Almaz-soft

itserviceinс

Активный пользователь
Регистрация
12.11.2017
Сообщения
108
Благодарностей
30
Баллы
28
  • Спасибо
Реакции: TwistDanceR и doc

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Слишком замороченное решение, на мой взгляд. Всё отлично работает и решается в 130-150 строк кода без всяких доп. библиотек и на форуме даже где-то было такое решение.
А чем замороченное? Что библиотеки добавлять? Ну хз для меня это не проблема.

Насчет 130-150 строчек. Ну тут все решение по сути укладывается в 35 строк кода. Можно поджать и до 25.:D
upload_2018-3-4_9-53-7.png

Остальное это вспомогательные методы, которые у меня вынесены в отдельный класс, тут же просто запихал все в один.

Защиту можно обойти двумя способами. Или выполнить js скрипт, чтобы сформировать урл для запроса, или расковырять js скрипт и из него самому сформировать урл.

Я делал через Jint, основное решение выглядело примерно так.
upload_2018-3-4_9-57-55.png

Про то что ты пишешь, там идет расковыривание js сркипта. И там скорее всего решение выдрано из CloudFlareUtilities.
Во сколько строчек кода, и только ли кода, не помню как там сделано.

https://github.com/elcattivo/CloudFlareUtilities/blob/master/CloudFlareUtilities/ChallengeSolver.cs
Вот тут собственно и формируется урл для запроса.
upload_2018-3-4_10-24-40.png

А насчет кол-ва строк, я не стремлюсь сделать все максимально компактно, пусть лучше будет больше кода, разнесено в отдельные классы и методы, но зато это воспринимается проще, чем когда все в кучу.

Но каждому свое.:-)
 

StrategRus

Новичок
Регистрация
03.03.2018
Сообщения
2
Благодарностей
0
Баллы
1
Здравствуйте, пытался перенести ваш код в Visual Studio, вроде все нормально. ни на что не ругается, но программа зависает на client.SendAsync(msg).Wait(); и дальше не идет, в чем может быть проблема ?


Решил проблему вытащить все в отдельный поток, не знаю как это связано, но работает :-) Автору темы большой спасибо!
 
Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Решил проблему вытащить все в отдельный поток, не знаю как это связано, но работает
Раз проблема решилась вытаскиванием в отдельный поток, то значит до этого запуск был в основном, гуишном потоке.
Любые долговременные операции, скачивание, вычисления, надо обязательно выносить в отдельный поток, т.к. на их выполнение надо время, и пока данный код не выполнится, дальше программа работать не будет, соответственно и весь интерфейс подвисает.
 

StrategRus

Новичок
Регистрация
03.03.2018
Сообщения
2
Благодарностей
0
Баллы
1
Раз проблема решилась вытаскиванием в отдельный поток, то значит до этого запуск был в основном, гуишном потоке.
Любые долговременные операции, скачивание, вычисления, надо обязательно выносить в отдельный поток, т.к. на их выполнение надо время, и пока данный код не выполнится, дальше программа работать не будет, соответственно и весь интерфейс подвисает.
Проблема была не в том, что он подвисал, а в том, что программа просто не выполнялась дальше. Не через 5 минут, не через 30 ( чекал брейкпоинтом после данной строчки)
 

Bas

Client
Регистрация
15.12.2013
Сообщения
637
Благодарностей
263
Баллы
63
Не хрюкает ни на 1 из протестированных мной сайтов((( К примеру сайт: https://tiny-pool.com. Вставляю складчик в свой проект, сразу получаю куки, вставляю свой адрес любой - "CSharp OwnCode Ссылка на объект не указывает на экземпляр объекта."
 

-=eXclass=-

Client
Регистрация
10.10.2017
Сообщения
24
Благодарностей
7
Баллы
3
Как исправить ??
 

Вложения

Bas

Client
Регистрация
15.12.2013
Сообщения
637
Благодарностей
263
Баллы
63
  • Спасибо
Реакции: iBotovod

iBotovod

Client
Регистрация
01.07.2017
Сообщения
56
Благодарностей
19
Баллы
8
Везде в общем коде вместо CookieContainer указать полный путь ZennoLab...
Для всех, кому эта фраза показалась набором символов, а не осмысленной инфой (я в первую очередь себя имею ввиду) нужно сделать следующее: во всех строках, по которым идут ошибки, нужно вместо CookieContainer написать ZennoLab.CommandCenter.CookieContainer

PS: Анекдот про подводную лодку и "Ты не выделывайся, ты рукой покажи!" будет актуален всегда.
 
  • Спасибо
Реакции: Reactor3000

iBotovod

Client
Регистрация
01.07.2017
Сообщения
56
Благодарностей
19
Баллы
8
Теперь новая проблема:
Ошибка при компиляции общего кода "CS0029" "Неявное преобразование типа "ZennoLab.CommandCenter.CookieContainer" в "System.Net.CookieContainer" невозможно". [Строка: 82; Cтолбец: 25]
Сейчас общий код выглядит вот так:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;


using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Collections;
using CloudFlareUtilities;


namespace ZennoLab.OwnCode
{
    public class CloudFlareBreaker
    {
        public string Address { get; set; }
        public string UserAgent { get; set; }
        public string Proxy { get; set; }
        public int MaxRetries { get; set; }

        private ZennoLab.CommandCenter.CookieContainer _cookieContainer;

        public void Break()
        {
            _cookieContainer = GetCloudFlareCookies(Address, UserAgent, Proxy, MaxRetries);
        }

        public ZennoLab.CommandCenter.CookieContainer GetCookieContainer()
        {
            return _cookieContainer;
        }

        public string GetCookieStr()
        {
            if (_cookieContainer == null) return null;

            var list = GetAllCookies(_cookieContainer)
                .Cast<Cookie>()
                .Select(c => c.Name + "=" + c.Value)
                .ToList();

            return string.Join(";", list);
        }

        private ZennoLab.CommandCenter.CookieContainer GetCloudFlareCookies(string address, string userAgent, string proxy, int maxRetries)
        {
            var currentTry = 0;

            while (currentTry < maxRetries)
            {
                try
                {
                    var cookies = new ZennoLab.CommandCenter.CookieContainer();

                    var msg = new HttpRequestMessage()
                    {
                        RequestUri = new Uri(address),
                        Method = HttpMethod.Get
                    };

                    msg.Headers.TryAddWithoutValidation("User-Agent", userAgent);

                    var client = new HttpClient(new ClearanceHandler(new HttpClientHandler
                    {
                        UseCookies = true,
                        CookieContainer = cookies,
                        Proxy = SetProxy(proxy)
                    }));

                    client.SendAsync(msg).Wait();

                    return cookies;
                }
                catch (Exception)
                {
                    currentTry += 1;
                }
            }

            return null;
        }

        private CookieCollection GetAllCookies(ZennoLab.CommandCenter.CookieContainer container)
        {
            var allCookies = new CookieCollection();
            var domainTableField = container.GetType().GetRuntimeFields().FirstOrDefault(x => x.Name == "m_domainTable");
            var domains = (IDictionary)domainTableField.GetValue(container);

            foreach (var val in domains.Values)
            {
                var type = val.GetType().GetRuntimeFields().First(x => x.Name == "m_list");
                var values = (IDictionary)type.GetValue(val);

                foreach (CookieCollection cookies in values.Values)
                {
                    allCookies.Add(cookies);
                }
            }
            return allCookies;
        }

        private WebProxy SetProxy(string proxy)
        {
            if (string.IsNullOrEmpty(proxy)) return null;

            WebProxy wp;

            var split = proxy.Split('@');

            if (split.Length == 1)
            {
                wp = new WebProxy(proxy);
            }
            else
            {
                var credential = split[0].Split(':');
                var addres = split[1];

                wp = new WebProxy(addres)
                {
                    Credentials = new NetworkCredential
                    {
                        UserName = credential[0],
                        Password = credential[1]
                    }
                };
            }

            return wp;
        }
    }   
}
 
Последнее редактирование:

Bas

Client
Регистрация
15.12.2013
Сообщения
637
Благодарностей
263
Баллы
63
private ZennoLab.CommandCenter.CookieContainer GetCloudFlareCookies(string address, string userAgent, string proxy, int maxRetries)
61-я строка, здесь не выдавало никаких ошибок при компиляции (на сколько помню). В общем попробуйте вместо ZennoLab.CommandCenter здесь System.Net указать. Сейчас нет возможности посмотреть свой код, как там в итоге расставлены точки над "ё".
 
  • Спасибо
Реакции: iBotovod

iBotovod

Client
Регистрация
01.07.2017
Сообщения
56
Благодарностей
19
Баллы
8
Bas, спасибо за ответ.
У задавшего вопрос в этой строке ошибки нет, но у меня она появляется.
По итогу при таком общем коде:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;


using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Collections;
using CloudFlareUtilities;


namespace ZennoLab.OwnCode
{
    public class CloudFlareBreaker
    {
        public string Address { get; set; }
        public string UserAgent { get; set; }
        public string Proxy { get; set; }
        public int MaxRetries { get; set; }

        private ZennoLab.CommandCenter.CookieContainer _cookieContainer;

        public void Break()
        {
            _cookieContainer = GetCloudFlareCookies(Address, UserAgent, Proxy, MaxRetries);
        }

        public ZennoLab.CommandCenter.CookieContainer GetCookieContainer()
        {
            return _cookieContainer;
        }

        public string GetCookieStr()
        {
            if (_cookieContainer == null) return null;

            var list = GetAllCookies(_cookieContainer)
                .Cast<Cookie>()
                .Select(c => c.Name + "=" + c.Value)
                .ToList();

            return string.Join(";", list);
        }

        private ZennoLab.CommandCenter.CookieContainer GetCloudFlareCookies(string address, string userAgent, string proxy, int maxRetries)
        {
            var currentTry = 0;

            while (currentTry < maxRetries)
            {
                try
                {
                    var cookies = new ZennoLab.CommandCenter.CookieContainer();

                    var msg = new HttpRequestMessage()
                    {
                        RequestUri = new Uri(address),
                        Method = HttpMethod.Get
                    };

                    msg.Headers.TryAddWithoutValidation("User-Agent", userAgent);

                    var client = new HttpClient(new ClearanceHandler(new HttpClientHandler
                    {
                        UseCookies = true,
                        CookieContainer = cookies,
                        Proxy = SetProxy(proxy)
                    }));

                    client.SendAsync(msg).Wait();

                    return cookies;
                }
                catch (Exception)
                {
                    currentTry += 1;
                }
            }

            return null;
        }

        private System.Net.CookieCollection GetAllCookies(ZennoLab.CommandCenter.CookieContainer container)
        {
            var allCookies = new CookieCollection();
            var domainTableField = container.GetType().GetRuntimeFields().FirstOrDefault(x => x.Name == "m_domainTable");
            var domains = (IDictionary)domainTableField.GetValue(container);

            foreach (var val in domains.Values)
            {
                var type = val.GetType().GetRuntimeFields().First(x => x.Name == "m_list");
                var values = (IDictionary)type.GetValue(val);

                foreach (CookieCollection cookies in values.Values)
                {
                    allCookies.Add(cookies);
                }
            }
            return allCookies;
        }

        private WebProxy SetProxy(string proxy)
        {
            if (string.IsNullOrEmpty(proxy)) return null;

            WebProxy wp;

            var split = proxy.Split('@');

            if (split.Length == 1)
            {
                wp = new WebProxy(proxy);
            }
            else
            {
                var credential = split[0].Split(':');
                var addres = split[1];

                wp = new WebProxy(addres)
                {
                    Credentials = new NetworkCredential
                    {
                        UserName = credential[0],
                        Password = credential[1]
                    }
                };
            }

            return wp;
        }
    }  
}
в 82 строке появляется ошибка Неявное преобразование типа "ZennoLab.CommandCenter.CookieContainer" в "System.Net.CookieContainer" невозможно". [Строка: 82; Cтолбец: 25]

И что бы я туда не вставлял - хоть ZennoLab.CommandCenter., хоть System.Net. - в любом случае даже на проверке синтаксиса выдает красные подчеркивания, и вываливает error-ы при выполнении.

Если будет возможность - помогите пожалуйста.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
И что бы я туда не вставлял - хоть ZennoLab.CommandCenter., хоть System.Net. - в любом случае даже на проверке синтаксиса выдает красные подчеркивания, и вываливает error-ы при выполнении.
В ошибке же четко пишет в чем причина - Неявное преобразование типа.
Идет попытка преобразовать объект одного типа, к другому.

Ошибка возникла из за того, что в зенке в последних версиях появился свой CookieContainer.
И это не вот этот https://msdn.microsoft.com/ru-ru/library/system.net.cookiecontainer(v=vs.110).aspx
Названия одинаковы, классы разные, отсюда и ошибка. Поэтому надо прописывать полное имя для CookieContainer - System.Net.CookieContainer
Везде.

upload_2018-9-6_12-54-23.png


upload_2018-9-6_12-59-21.png


upload_2018-9-6_12-59-53.png


Это не класс зенолаба, а класс .net. Везде где такая хрень, надо заменить на System.Net.CookieContainer.

upload_2018-9-6_12-55-19.png


HttpClientHandler
https://msdn.microsoft.com/en-us/library/system.net.http.httpclienthandler(v=vs.118).aspx

Это класс вообще не знает о существовании класса CookieContainer в зенке.:-)
Ему нужен .net класс CookieContainer.
 
  • Спасибо
Реакции: swiniks и iBotovod

iBotovod

Client
Регистрация
01.07.2017
Сообщения
56
Благодарностей
19
Баллы
8
Ошибка возникла из за того, что в зенке в последних версиях появился свой CookieContainer.
вот блин. Я вижу что нестандартное поведение, но знаний не хватает понять почему.
После прописывания System.Net. все заработало.
СПАСИБО!
 

kiduep

Client
Регистрация
23.01.2012
Сообщения
59
Благодарностей
14
Баллы
8
вот блин. Я вижу что нестандартное поведение, но знаний не хватает понять почему.
После прописывания System.Net. все заработало.
СПАСИБО!
Не могли бы выложить рабочий код? А то уже вроде всё сменил, но не работает(
Спасибо
 

swiniks

Client
Регистрация
19.02.2015
Сообщения
244
Благодарностей
172
Баллы
43
Не могли бы выложить рабочий код? А то уже вроде всё сменил, но не работает(
Спасибо
Так запускается, но увы защиту не проходит! Если защиты нет отрабатывает без ошибок.
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;


using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Collections;
using CloudFlareUtilities;


namespace ZennoLab.OwnCode
{
    public class CloudFlareBreaker
    {
        public string Address { get; set; }
        public string UserAgent { get; set; }
        public string Proxy { get; set; }
        public int MaxRetries { get; set; }

        private System.Net.CookieContainer _cookieContainer;

        public void Break()
        {
            _cookieContainer = GetCloudFlareCookies(Address, UserAgent, Proxy, MaxRetries);
        }

        public System.Net.CookieContainer GetCookieContainer()
        {
            return _cookieContainer;
        }

        public string GetCookieStr()
        {
            if (_cookieContainer == null) return null;

            var list = GetAllCookies(_cookieContainer)
                .Cast<Cookie>()
                .Select(c => c.Name + "=" + c.Value)
                .ToList();

            return string.Join(";", list);
        }

        private System.Net.CookieContainer GetCloudFlareCookies(string address, string userAgent, string proxy, int maxRetries)
        {
            var currentTry = 0;

            while (currentTry < maxRetries)
            {
                try
                {
                    var cookies = new System.Net.CookieContainer();

                    var msg = new HttpRequestMessage()
                    {
                        RequestUri = new Uri(address),
                        Method = HttpMethod.Get
                    };

                    msg.Headers.TryAddWithoutValidation("User-Agent", userAgent);

                    var client = new HttpClient(new ClearanceHandler(new HttpClientHandler
                    {
                        UseCookies = true,
                        CookieContainer = cookies,
                        Proxy = SetProxy(proxy)
                    }));

                    client.SendAsync(msg).Wait();

                    return cookies;
                }
                catch (Exception)
                {
                    currentTry += 1;
                }
            }

            // return null; // Вызывает ошибку! Выполнение действия CSharp OwnCode Ссылка на объект не указывает на экземпляр объекта.
            throw new System.Exception("CloudFlare - не пройдена!"); //Заменил вместо return null что бы null не вызывал ошибку.
        }

        private System.Net.CookieCollection GetAllCookies(System.Net.CookieContainer container)
        {
            var allCookies = new CookieCollection();
            var domainTableField = container.GetType().GetRuntimeFields().FirstOrDefault(x => x.Name == "m_domainTable");
            var domains = (IDictionary)domainTableField.GetValue(container);

            foreach (var val in domains.Values)
            {
                var type = val.GetType().GetRuntimeFields().First(x => x.Name == "m_list");
                var values = (IDictionary)type.GetValue(val);

                foreach (CookieCollection cookies in values.Values)
                {
                    allCookies.Add(cookies);
                }
            }
            return allCookies;
        }

        private WebProxy SetProxy(string proxy)
        {
            if (string.IsNullOrEmpty(proxy)) return null;

            WebProxy wp;

            var split = proxy.Split('@');

            if (split.Length == 1)
            {
                wp = new WebProxy(proxy);
            }
            else
            {
                var credential = split[0].Split(':');
                var addres = split[1];

                wp = new WebProxy(addres)
                {
                    Credentials = new NetworkCredential
                    {
                        UserName = credential[0],
                        Password = credential[1]
                    }
                };
            }

            return wp;
        }
    }
}
 
Последнее редактирование:

kiduep

Client
Регистрация
23.01.2012
Сообщения
59
Благодарностей
14
Баллы
8
Так запускается, но увы защиту не проходит! Если защиты нет отрабатывает без ошибок.
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;


using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Collections;
using CloudFlareUtilities;


namespace ZennoLab.OwnCode
{
    public class CloudFlareBreaker
    {
        public string Address { get; set; }
        public string UserAgent { get; set; }
        public string Proxy { get; set; }
        public int MaxRetries { get; set; }

        private System.Net.CookieContainer _cookieContainer;

        public void Break()
        {
            _cookieContainer = GetCloudFlareCookies(Address, UserAgent, Proxy, MaxRetries);
        }

        public System.Net.CookieContainer GetCookieContainer()
        {
            return _cookieContainer;
        }

        public string GetCookieStr()
        {
            if (_cookieContainer == null) return null;

            var list = GetAllCookies(_cookieContainer)
                .Cast<Cookie>()
                .Select(c => c.Name + "=" + c.Value)
                .ToList();

            return string.Join(";", list);
        }

        private System.Net.CookieContainer GetCloudFlareCookies(string address, string userAgent, string proxy, int maxRetries)
        {
            var currentTry = 0;

            while (currentTry < maxRetries)
            {
                try
                {
                    var cookies = new System.Net.CookieContainer();

                    var msg = new HttpRequestMessage()
                    {
                        RequestUri = new Uri(address),
                        Method = HttpMethod.Get
                    };

                    msg.Headers.TryAddWithoutValidation("User-Agent", userAgent);

                    var client = new HttpClient(new ClearanceHandler(new HttpClientHandler
                    {
                        UseCookies = true,
                        CookieContainer = cookies,
                        Proxy = SetProxy(proxy)
                    }));

                    client.SendAsync(msg).Wait();

                    return cookies;
                }
                catch (Exception)
                {
                    currentTry += 1;
                }
            }

            // return null; // Вызывает ошибку! Выполнение действия CSharp OwnCode Ссылка на объект не указывает на экземпляр объекта.
            throw new System.Exception("CloudFlare - не пройдена!"); //Заменил вместо return null что бы null не вызывал ошибку.
        }

        private System.Net.CookieCollection GetAllCookies(System.Net.CookieContainer container)
        {
            var allCookies = new CookieCollection();
            var domainTableField = container.GetType().GetRuntimeFields().FirstOrDefault(x => x.Name == "m_domainTable");
            var domains = (IDictionary)domainTableField.GetValue(container);

            foreach (var val in domains.Values)
            {
                var type = val.GetType().GetRuntimeFields().First(x => x.Name == "m_list");
                var values = (IDictionary)type.GetValue(val);

                foreach (CookieCollection cookies in values.Values)
                {
                    allCookies.Add(cookies);
                }
            }
            return allCookies;
        }

        private WebProxy SetProxy(string proxy)
        {
            if (string.IsNullOrEmpty(proxy)) return null;

            WebProxy wp;

            var split = proxy.Split('@');

            if (split.Length == 1)
            {
                wp = new WebProxy(proxy);
            }
            else
            {
                var credential = split[0].Split(':');
                var addres = split[1];

                wp = new WebProxy(addres)
                {
                    Credentials = new NetworkCredential
                    {
                        UserName = credential[0],
                        Password = credential[1]
                    }
                };
            }

            return wp;
        }
    }
}
Спасибо, нашел альтернативный вариант на форуме.
 

swiniks

Client
Регистрация
19.02.2015
Сообщения
244
Благодарностей
172
Баллы
43

ТРОН

Client
Регистрация
31.07.2016
Сообщения
336
Благодарностей
381
Баллы
63

kiduep

Client
Регистрация
23.01.2012
Сообщения
59
Благодарностей
14
Баллы
8
Продублируйте сюда, упростите жизнь тому, кто столкнется с таким же вопросом
Воспользовался этим решением. Немного более объемный проект (не в одном кубике), но работает и это главное. Спасибо автору за решение
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
сегодня понадобилось обойти защиту на одном сайте, и не получилось, пришлось через Jint сделать
так же подключил xNet, там можно и соксы использовать
проверил на нескольких сайтах, работает
 

Вложения

kagorec

Client
Регистрация
24.08.2013
Сообщения
979
Благодарностей
523
Баллы
93
сегодня понадобилось обойти защиту на одном сайте, и не получилось, пришлось через Jint сделать
так же подключил xNet, там можно и соксы использовать
проверил на нескольких сайтах, работает
Альтернативную ссылку на архив предоставь пожалуйста, на облако (любое - mail.ru, yandex, mega ..)

 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Альтернативную ссылку на архив предоставь пожалуйста, на облако (любое - mail.ru, yandex, mega ..)

да сейчас хром всё блокирует почти ))
либы все открытые если знаешь как открывать, если есть сомнения то открой и просмотри их
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 777
Благодарностей
1 448
Баллы
113
сегодня понадобилось обойти защиту на одном сайте, и не получилось, пришлось через Jint сделать
так же подключил xNet, там можно и соксы использовать
проверил на нескольких сайтах, работает
Котяра не пашет твоя магия!

 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
  • Спасибо
Реакции: samsonnn

Кто просматривает тему: (Всего: 4, Пользователи: 0, Гости: 4)