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

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
824
Points
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
 
Категория
Полезно

Attachments

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

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

Last edited:

Nord

Client
Joined
Mar 22, 2012
Messages
2,417
Reaction score
1,482
Points
113
Спасибо! Крутая штука!
 
  • Thank you
Reactions: Moadip

Dimionix

Moderator
Joined
Apr 9, 2011
Messages
3,068
Reaction score
3,131
Points
113
Слишком замороченное решение, на мой взгляд. Всё отлично работает и решается в 130-150 строк кода без всяких доп. библиотек и на форуме даже где-то было такое решение.
 

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,650
Points
113
я единственный, кто рекапчу на кф встречает?
 

zortexx

Client
Joined
Sep 19, 2011
Messages
2,520
Reaction score
1,226
Points
113
Может прокси заюзанные?
Или уровень паранойи владельцев конкретного сайта повышенный.

Ни разу на прокладке кф рекапчи не видел.
 
  • Thank you
Reactions: Almaz-soft

itserviceinс

Активный пользователь
Joined
Nov 12, 2017
Messages
109
Reaction score
31
Points
28
я единственный, кто рекапчу на кф встречает?
blackhatworld мне постоянно выдаёт
 
  • Thank you
Reactions: TwistDanceR and doc

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
824
Points
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

Новичок
Joined
Mar 3, 2018
Messages
2
Reaction score
0
Points
1
Здравствуйте, пытался перенести ваш код в Visual Studio, вроде все нормально. ни на что не ругается, но программа зависает на client.SendAsync(msg).Wait(); и дальше не идет, в чем может быть проблема ?


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

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
824
Points
93
Решил проблему вытащить все в отдельный поток, не знаю как это связано, но работает
Раз проблема решилась вытаскиванием в отдельный поток, то значит до этого запуск был в основном, гуишном потоке.
Любые долговременные операции, скачивание, вычисления, надо обязательно выносить в отдельный поток, т.к. на их выполнение надо время, и пока данный код не выполнится, дальше программа работать не будет, соответственно и весь интерфейс подвисает.
 

StrategRus

Новичок
Joined
Mar 3, 2018
Messages
2
Reaction score
0
Points
1
Раз проблема решилась вытаскиванием в отдельный поток, то значит до этого запуск был в основном, гуишном потоке.
Любые долговременные операции, скачивание, вычисления, надо обязательно выносить в отдельный поток, т.к. на их выполнение надо время, и пока данный код не выполнится, дальше программа работать не будет, соответственно и весь интерфейс подвисает.
Проблема была не в том, что он подвисал, а в том, что программа просто не выполнялась дальше. Не через 5 минут, не через 30 ( чекал брейкпоинтом после данной строчки)
 

Bas

Client
Joined
Dec 15, 2013
Messages
636
Reaction score
263
Points
63
Не хрюкает ни на 1 из протестированных мной сайтов((( К примеру сайт: https://tiny-pool.com. Вставляю складчик в свой проект, сразу получаю куки, вставляю свой адрес любой - "CSharp OwnCode Ссылка на объект не указывает на экземпляр объекта."
 

-=eXclass=-

Client
Joined
Oct 10, 2017
Messages
23
Reaction score
7
Points
3
Как исправить ??
 

Attachments

Bas

Client
Joined
Dec 15, 2013
Messages
636
Reaction score
263
Points
63
Как исправить ??
Везде в общем коде вместо CookieContainer указать полный путь ZennoLab...
 
  • Thank you
Reactions: iBotovod

iBotovod

Client
Joined
Jul 1, 2017
Messages
56
Reaction score
19
Points
8
Везде в общем коде вместо CookieContainer указать полный путь ZennoLab...
Для всех, кому эта фраза показалась набором символов, а не осмысленной инфой (я в первую очередь себя имею ввиду) нужно сделать следующее: во всех строках, по которым идут ошибки, нужно вместо CookieContainer написать ZennoLab.CommandCenter.CookieContainer

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

iBotovod

Client
Joined
Jul 1, 2017
Messages
56
Reaction score
19
Points
8
Теперь новая проблема:
Ошибка при компиляции общего кода "CS0029" "Неявное преобразование типа "ZennoLab.CommandCenter.CookieContainer" в "System.Net.CookieContainer" невозможно". [Строка: 82; Cтолбец: 25]
Сейчас общий код выглядит вот так:
Code:
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;
        }
    }   
}
 
Last edited:

Bas

Client
Joined
Dec 15, 2013
Messages
636
Reaction score
263
Points
63
private ZennoLab.CommandCenter.CookieContainer GetCloudFlareCookies(string address, string userAgent, string proxy, int maxRetries)
61-я строка, здесь не выдавало никаких ошибок при компиляции (на сколько помню). В общем попробуйте вместо ZennoLab.CommandCenter здесь System.Net указать. Сейчас нет возможности посмотреть свой код, как там в итоге расставлены точки над "ё".
 
  • Thank you
Reactions: iBotovod

iBotovod

Client
Joined
Jul 1, 2017
Messages
56
Reaction score
19
Points
8
Bas, спасибо за ответ.
У задавшего вопрос в этой строке ошибки нет, но у меня она появляется.
По итогу при таком общем коде:
Code:
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
Joined
Sep 26, 2015
Messages
509
Reaction score
824
Points
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.
 

iBotovod

Client
Joined
Jul 1, 2017
Messages
56
Reaction score
19
Points
8
Ошибка возникла из за того, что в зенке в последних версиях появился свой CookieContainer.
вот блин. Я вижу что нестандартное поведение, но знаний не хватает понять почему.
После прописывания System.Net. все заработало.
СПАСИБО!
 

kiduep

Client
Joined
Jan 23, 2012
Messages
59
Reaction score
14
Points
8
вот блин. Я вижу что нестандартное поведение, но знаний не хватает понять почему.
После прописывания System.Net. все заработало.
СПАСИБО!
Не могли бы выложить рабочий код? А то уже вроде всё сменил, но не работает(
Спасибо
 

swiniks

Client
Joined
Feb 19, 2015
Messages
244
Reaction score
172
Points
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;
        }
    }
}
 
Last edited:

kiduep

Client
Joined
Jan 23, 2012
Messages
59
Reaction score
14
Points
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
Joined
Feb 19, 2015
Messages
244
Reaction score
172
Points
43
Спасибо, нашел альтернативный вариант на форуме.
Не за что, я тоже где то в 3 кубика вкладывал, но с библиотекой было бы лучше конечно.
 

ТРОН

Client
Joined
Jul 31, 2016
Messages
336
Reaction score
381
Points
63
Спасибо, нашел альтернативный вариант на форуме.
Продублируйте сюда, упростите жизнь тому, кто столкнется с таким же вопросом
 

kiduep

Client
Joined
Jan 23, 2012
Messages
59
Reaction score
14
Points
8
Продублируйте сюда, упростите жизнь тому, кто столкнется с таким же вопросом
Воспользовался этим решением. Немного более объемный проект (не в одном кубике), но работает и это главное. Спасибо автору за решение
 

ssXXXss

Client
Joined
Dec 23, 2014
Messages
7,375
Reaction score
2,042
Points
113
сегодня понадобилось обойти защиту на одном сайте, и не получилось, пришлось через Jint сделать
так же подключил xNet, там можно и соксы использовать
проверил на нескольких сайтах, работает
 

Attachments

kagorec

Client
Joined
Aug 24, 2013
Messages
1,034
Reaction score
559
Points
113
сегодня понадобилось обойти защиту на одном сайте, и не получилось, пришлось через Jint сделать
так же подключил xNet, там можно и соксы использовать
проверил на нескольких сайтах, работает
Альтернативную ссылку на архив предоставь пожалуйста, на облако (любое - mail.ru, yandex, mega ..)

 

ssXXXss

Client
Joined
Dec 23, 2014
Messages
7,375
Reaction score
2,042
Points
113
Альтернативную ссылку на архив предоставь пожалуйста, на облако (любое - mail.ru, yandex, mega ..)

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

samsonnn

Client
Joined
Jun 2, 2015
Messages
1,905
Reaction score
1,642
Points
113
сегодня понадобилось обойти защиту на одном сайте, и не получилось, пришлось через Jint сделать
так же подключил xNet, там можно и соксы использовать
проверил на нескольких сайтах, работает
Котяра не пашет твоя магия!

 

ssXXXss

Client
Joined
Dec 23, 2014
Messages
7,375
Reaction score
2,042
Points
113
я делал с локальным IP, и сейчас только заметил, xNet с протоколом прокси не работает, его надо вырезать
сейчас перезалью
 
  • Thank you
Reactions: samsonnn

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)