@backoff – пойми, твой метод подходит только при использовании в пределах одного кубика запроса. А если в проекте надо передавать куки от запроса к запросу, и они будут меняться сервером на каком-то шаге, то такой метод даст трещину, так что не подсаживай на него людей
.
Ну пока пример от
@Moadip самый прогрессивный в этой теме.
Сегодня как раз попался в руки проект с корявым поиском куки, пришлось переделывать. Поделюсь и своим кубиком, создавал его на основе отрывков, которые встречал тут на форуме (может аглоритм не идеален, я не кодер). Удобно что в финале куки выводятся как в переменную, так и в таблицу. И да, старые куки при совпадении имен заменяются новыми значениями, а пустые куки вообще удаляются в итоге:
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();
Ну или как уже писали выше используйте xNet библиотеку (
с передачей куки в project.Context от кубика к кубику).