Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
на самом деле вы и раньше моглиб уже давно реализовать автоматическое взятие куков в гет и пост запросах .
вопрос: почему еще такого нет ?
етао нужная функция которая секономилаб уйму нервов и времени при написании шаблонов на запросах . Я прав на все 1000 проц . я об етом знаю .
Так что давайте = реализуйте . а то как то уже и в минипостере такая функция по дефолту есть а у вас нет.
Спасибо за прочитаный текст и ваши каменты - они для меня оч важны ))
Я за! )) Чем больше автоматизации, тем лучше) Думаю всё не получится получать и прописывать, т.к. часто куки пересекаются с данными из кода выдачи и тем самым, тут все равно придется руками. Буду правым и в ближайшем будущем увидеть от разработчиков решение))
Главное если разработчики всетаки надумают ето сделать - ТО обезательно сделайте чтобы взятые куки с предыдушего запроса переносились в следуший а если нуки совпадают то заменялись на новые .. или как то так.. я не разработчик я нне знаю как ето нужно реализовать но ето нужно свем = потому что очень сложно писать в пост гете когда кучу по факту ненужных действий (парсинг куков вручную) нужно выполнять. когда все ето моглоб делаться програмно и по дефолту самой зенкой . блин - эта функция нужна уе сейчас .
ps: лично у меня слабый пк и арендовать vds я не хочу . по етому мне лучше писать на пост гет шаблоны . но ето сложно так как приходится парсить фиг знает какие именно куки ))
P.S. чтобы они не делали они все куки не вытащят, так как используя гет запросы бывает что кука скрывается в самом html коде которую приходится ещё поискать
ты просто не замечаешь как ты все куки вытаскиваешь которые в браузере не используются
у кук есть значение, бывает после первого запроса оно 0, бывает deleted, по сути ты палишься уже вставив её во второй запрос, уже понятно что бот епашит хавая всё с запроса
using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace External
{
public sealed class HttpClientEx : HttpClient
{
private readonly CookieContainer container;
private const string userAgent = @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3343.3 Safari/537.36"
public HttpClientEx()
{
UserAgent = userAgent;
}
public HttpClientEx(HttpClientHandler handler) : base(handler)
{
try
{
UserAgent = userAgent;
handler.AllowAutoRedirect = false;
}
catch (Exception e)
{
//обработка ошибок
}
}
public HttpClientEx(HttpClientHandler handler, CookieContainer container) : this(handler)
{
try
{
this.container = container;
handler.CookieContainer = container;
}
catch (Exception e)
{
//обработка ошибок
}
}
public string UserAgent
{
get => userAgent;
set
{
userAgent = value;
DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", userAgent);
}
}
public async Task<HttpResponseMessage> PostAsync(string requestUri, HttpContent content, bool isCookie = true)
{
var result = await base.PostAsync(requestUri, content);
if (isCookie) ReadCookies(result);
return result;
}
public async Task<HttpResponseMessage> SendAsync(HttpRequestMessage content, bool isCookie = true)
{
var result = await base.SendAsync(content);
if (isCookie) ReadCookies(result);
return result;
}
public async Task<HttpResponseMessage> GetAsync(string url, bool isCookie = true)
{
var result = await base.GetAsync(url);
if (isCookie) ReadCookies(result);
return result;
}
private void ReadCookies(HttpResponseMessage r)
{
if (!r.Headers.TryGetValues("Set-Cookie", out var result)) return;
foreach (var item in result)
try
{
container.SetCookies(r.RequestMessage.RequestUri, item);
}
catch (CookieException)
{
AddParceCookie(item);
}
}
private void AddParceCookie(string item)
{
bool boolPath;
bool boolDomain;
bool boolExpress;
var cookieArr = item.Split(';');
var cookie = new Cookie();
foreach (var parts in cookieArr.Select(c => c.Split(new[] {'='}, 2)))
{
var cookieName = parts[0].Trim();
boolPath = cookieName.Contains("Path") || cookieName.Contains("path");
boolDomain = cookieName.Contains("Domain") || cookieName.Contains("domain");
boolExpress = cookieName.Contains("Expires") || cookieName.Contains("expires");
var cookieValue = parts.Length == 1 ? string.Empty : parts[1];
if (boolDomain)
{
cookie.Domain = cookieValue;
}
else if (boolPath)
{
cookie.Path = cookieValue;
}
else if (!boolPath && !boolDomain && !boolExpress)
{
cookie.Name = cookieName;
cookie.Value = cookieValue;
}
}
container.Add(cookie);
}
}
}
Переопределенный класс HttpClient. Все очень просто и доступно написано, возможно в некоторых случаях не совсем корректно, но работает стабильно) Автоматически собирает и сохраняет Cookie в обьект CookieContainer, который вы сами и создаете. В принципе с ним можно делать что угодно.
1- после гет запроса, берем куки
2- после гет запроса к странице формы куки не берем, но парсим токен
3. после пост запроса берем куки (после отправки мыла и паса)
4. после проверки почты активируем ссылку и берем куки после активации (хотя можно не брать в этом примере)
ну и гет или пост запрос должен быть развернутым, с заголовками, иначе работать не будет
Так помимо того что вытащить куки из запроса, надо обновить еще старые куки из других запросов.
Другими словами, от запроса к запросу таскается переменная с куками.
И после каждого запроса вытаскиваются новые куки и затем "старые" куки обновляются/добавляются/удаляются.
Да мне то что теоретничать, у меня свой кусок кода есть для работы с куки.
Про автозамену не понял.
string get_cookie = project.Variables["get_info"].Value;
У тебя что в переменной get_info лежит? Я так понимаю ответ от запроса.
var Cookie = string.Join("; ", Regex.Matches(get_cookie, @"(?<=Set-Cookie:\ ).*?(?=").Cast<Match>().Select(x=>x.Value));
Тут ты регуляркой вытаскиваешь куки.
И потом их возвращаешь
return Cookie;
Ну если у тебя дальше где то еще есть код, который работает с кукисами, то ок.
Я писал примерно про следующее.
Допустим в пером запросе есть куки
user1=вася
user2=петя
Мы сохраняем эти куки в переменную.
Потом в следующем запросе куки
user1=иван
Т.е. надо обновить куки user1. И в итоге куки будут
user1=иван
user2=петя
А в следующем запросе приходит такое
user1=
Т.е. куки user1 вообще надо убрать из набора кукисов. И в итоге для следующего запроса будет такие куки:
user2=петя
всё удачный пример, @Moadip тебе объясняет что ты с одной кукой ходишь даже не обновляя её, думаю это +100500 понятно что бот
а во втором запросе кука user1 сдохла по времени и она null или deleted а ты с ней шаришься
Пример к тому, что одна и та же кука, от запроса к запросу может менять свое значение. А также что набор кук может тоже меняться от запроса к запросу.
А не так, что ты сделал запрос, получил куки, и дальше с ними постоянно работаешь.
Да, может быть и так. Пришли куки и больше не меняются, а может и не так быть.
вот пример, майл ру, попадая на главную там выдаёт куку со значением 0, но как видно в следующем переходе её нет, а если ты спарсишь то ты с ней пожизнено ходить будешь
с куками, которые берет браузер все понятно.
А как их брать из пост-гет запроса?
Там может быть что угодно.
Как это автоматизировать.
Конечно, идея столько же привлекательная как кнопка Бабло, но на практике - только идея.
Тут лишь самому можно разобраться.
Смотреть ответы сервера, вытаскиать куки, сохранять в файлы.
Лично я когда делаю Post/Get запросы, предпочитаю для каждого запроса парсить именно те куки, которые нужны для следующего запроса, потом делаю проверку, спарсило то что нам нужно или нет.
Разумеется все это делаю на C#
P.S Хотел бы выразить отдельную благодарность Dimionix, огромное спасибо за заготовку, теперь у меня проблем нету, только регулярки меняю и все)))
@backoff – пойми, твой метод подходит только при использовании в пределах одного кубика запроса. А если в проекте надо передавать куки от запроса к запросу, и они будут меняться сервером на каком-то шаге, то такой метод даст трещину, так что не подсаживай на него людей .
Ну пока пример от @Moadip самый прогрессивный в этой теме.
Сегодня как раз попался в руки проект с корявым поиском куки, пришлось переделывать. Поделюсь и своим кубиком, создавал его на основе отрывков, которые встречал тут на форуме (может аглоритм не идеален, я не кодер). Удобно что в финале куки выводятся как в переменную, так и в таблицу. И да, старые куки при совпадении имен заменяются новыми значениями, а пустые куки вообще удаляются в итоге:
C#:
IZennoTable Table_Cookies = project.Tables["Table_Cookies"]; // получаем таблицу проекта "Table_Cookies", с которым будем работать. Просто создайте такую таблицу, без лишних настроек.
// А если в таблице уже есть куки из прошлого запроса, то в нее добавляются новые куки, а дубли заменятся новыми значениями.
Table_Cookies.ColSeparator = "=";
List<string> List_Temp_1 = new List<string>();
string Get_Result_1 = project.Variables["Get_gif_Result"].Value; // считываем в переменную Get_Result_1 наш код страницы (вместе с заголовками)
Regex reg1 = new Regex(@"(?<=Set-Cookie:\ ).*?(?=;)"); // это регулярка для поиска куки
List_Temp_1.AddRange(from Match match in reg1.Matches(Get_Result_1) select match.Value); // здесь добавляем найденные куки в промежуточный список "List_Temp_1"
// из списка "List_Temp_1" перегоняем куки в таблицу (название куки в первый столбец, значение куки во второй столбец):
foreach (var res in List_Temp_1)
{
var Cookies_String = res.Split('=').ToList();
Table_Cookies.AddRow(new [] { Cookies_String[0], Cookies_String[1] });
}
// Ниже с помощью промежуточного списка "List_Temp_2" мы удаляем куки-дубли из таблицы, оставляя при этом имеено последнее значение.
// П.С. Обычный кубик "Таблица > Удалить дубли" оставляет первое (старое значение), так что он нам здесь не подойдет.
List<string> List_Temp_2 = new List<string>();
for(int i=Table_Cookies.RowCount-1; i>=0; i--){
var s = Table_Cookies.GetCell(0, i);
if (List_Temp_2.Contains(s))
{
Table_Cookies.DeleteRow(i);
}
else
{
List_Temp_2.Add(s);
}
}
// Ниже удаляем из таблицы пустые куки:
for(int i=Table_Cookies.RowCount-1; i>=0; i--){
var s = Table_Cookies.GetCell(1, i);
if (s == "")
{
Table_Cookies.DeleteRow(i);
}
}
string Cookie_All = Table_Cookies.ToString().Trim(); // Объединяем таблицу в переменную.
Cookie_All = System.Text.RegularExpressions.Regex.Replace(Cookie_All, @"\r\n", "; "); // Заменяем переносы строк на "; ", чтобы привести куки в стандартный вид
project.Variables["e_all_cookie"].Value = Cookie_All; // присваеваем куки нашей переменной "e_all_cookie". Финал.
// Если надо очистить таблицу, то раскомментируйте строку ниже:
// Table_Cookies.Clear();
бро, я прекрасно понимаю, никого не подсаживаю, просто те люди, которые такое просят/спрашивают - они знакомятся с гет постом с этим методом, не думаю что сразу будут регу акков на гугле писать
а мой (точнее не мой) варик, самы простой, рабочий, оптимальный, легкий для понимания и быстрый
зачем народу забивать голову инфой, не нужной на этом этапе ? да и пока реально не попадал в такую ситуевину, чтобы кубик этот не справился, так как где-то изменились куки)))
короче, бразы, все огонь.
не понимаю зачем развели такую демагогию )))
@backoff – пойми, твой метод подходит только при использовании в пределах одного кубика запроса. А если в проекте надо передавать куки от запроса к запросу, и они будут меняться сервером на каком-то шаге, то такой метод даст трещину, так что не подсаживай на него людей .
Ну пока пример от @Moadip самый прогрессивный в этой теме.
Сегодня как раз попался в руки проект с корявым поиском куки, пришлось переделывать. Поделюсь и своим кубиком, создавал его на основе отрывков, которые встречал тут на форуме (может аглоритм не идеален, я не кодер). Удобно что в финале куки выводятся как в переменную, так и в таблицу. И да, старые куки при совпадении имен заменяются новыми значениями, а пустые куки вообще удаляются в итоге:
C#:
IZennoTable Table_Cookies = project.Tables["Table_Cookies"]; // получаем таблицу проекта "Table_Cookies", с которым будем работать. Просто создайте такую таблицу, без лишних настроек.
// А если в таблице уже есть куки из прошлого запроса, то в нее добавляются новые куки, а дубли заменятся новыми значениями.
Table_Cookies.ColSeparator = "=";
List<string> List_Temp_1 = new List<string>();
string Get_Result_1 = project.Variables["Get_gif_Result"].Value; // считываем в переменную Get_Result_1 наш код страницы (вместе с заголовками)
Regex reg1 = new Regex(@"(?<=Set-Cookie:\ ).*?(?=;)"); // это регулярка для поиска куки
List_Temp_1.AddRange(from Match match in reg1.Matches(Get_Result_1) select match.Value); // здесь добавляем найденные куки в промежуточный список "List_Temp_1"
// из списка "List_Temp_1" перегоняем куки в таблицу (название куки в первый столбец, значение куки во второй столбец):
foreach (var res in List_Temp_1)
{
var Cookies_String = res.Split('=').ToList();
Table_Cookies.AddRow(new [] { Cookies_String[0], Cookies_String[1] });
}
// Ниже с помощью промежуточного списка "List_Temp_2" мы удаляем куки-дубли из таблицы, оставляя при этом имеено последнее значение.
// П.С. Обычный кубик "Таблица > Удалить дубли" оставляет первое (старое значение), так что он нам здесь не подойдет.
List<string> List_Temp_2 = new List<string>();
for(int i=Table_Cookies.RowCount-1; i>=0; i--){
var s = Table_Cookies.GetCell(0, i);
if (List_Temp_2.Contains(s))
{
Table_Cookies.DeleteRow(i);
}
else
{
List_Temp_2.Add(s);
}
}
// Ниже удаляем из таблицы пустые куки:
for(int i=Table_Cookies.RowCount-1; i>=0; i--){
var s = Table_Cookies.GetCell(1, i);
if (s == "")
{
Table_Cookies.DeleteRow(i);
}
}
string Cookie_All = Table_Cookies.ToString().Trim(); // Объединяем таблицу в переменную.
Cookie_All = System.Text.RegularExpressions.Regex.Replace(Cookie_All, @"\r\n", "; "); // Заменяем переносы строк на "; ", чтобы привести куки в стандартный вид
project.Variables["e_all_cookie"].Value = Cookie_All; // присваеваем куки нашей переменной "e_all_cookie". Финал.
// Если надо очистить таблицу, то раскомментируйте строку ниже:
// Table_Cookies.Clear();
Люди, подскажите, пожалуйста, такой момент...
Есть кука:
Set-Cookie: ename=6101bf7f61e2f98cdce95509819b2c668d31a6; expires=Thu, 20-Feb-2020 06:21:45 GMT; path=/
В одном из последующих запросов мне подсовывают вот такую:
Set-Cookie: ename=deleted; expires=Tue, 20-Feb-2018 06:29:47 GMT; path=/
Как видно, срок жизни обновленной куки истек ранее, чем её подсунули. Как поступать в таком случае:
- удалять полностью куку;
- игнорировать подсовываемую и пользоваться той, что была выдана ранее;
- какой-то иной вариант