Очистить куки и кэш

  • Автор темы Автор темы MaximTurbo
  • Дата начала Дата начала
Доступ к куки контейнеру ZB еще не сделали, а вот метод очистки кэша и куки сделали через API:
http://localhost:8160/scalar/?api=profilesv1#tag/profiles/POST/v1/profiles/{profileId}/cleanup
Это чистит только кеш же, он куки не чистит, проверил, остановил ЗБ, выполил пост запрос, 200 statusCode. открываю снова сайт - авторизация на месте
 
  • Оценить
Реакции: Dmitriy_Zenno
Проверил дополнительно, до чистки 3.1мб, остановил инстант, почистил, снова проверил объем кеша "Менее 1мб".
 
Это чистит только кеш же, он куки не чистит, проверил, остановил ЗБ, выполил пост запрос, 200 statusCode. открываю снова сайт - авторизация на месте
Уточню этот момент!
 
О ZennoBrowser речь идет если что, а то мало ли.

У меня аватарка загрузилась.
1780037705204.png
 
Это чистит только кеш же, он куки не чистит, проверил, остановил ЗБ, выполил пост запрос, 200 statusCode. открываю снова сайт - авторизация на месте
Действительно, данный метод очищает только кэш. Создам запрос на новую фичу — полную очистку профиля.
 
Действительно, данный метод очищает только кэш. Создам запрос на новую фичу — полную очистку профиля.
Добрый день! Хочу почистить профиля от кэша, попробовал этот метод и как-то ничего. Как были профиля полные кэша, так и остались. Я что-то не так делаю?
До запуска профиля ZB делаю запрос: http://localhost:8160/scalar/?api=profilesv1#tag/profiles/POST/v1/profiles/{profileId}/cleanup где вместо {profileId} подставляю id конкретного профиля.
 
Добрый день! Хочу почистить профиля от кэша, попробовал этот метод и как-то ничего. Как были профиля полные кэша, так и остались. Я что-то не так делаю?
До запуска профиля ZB делаю запрос: http://localhost:8160/scalar/?api=profilesv1#tag/profiles/POST/v1/profiles/{profileId}/cleanup где вместо {profileId} подставляю id конкретного профиля.
Здравствуйте,

Данный метод чистит только кэш, куки он не трогает, поэтому стоит обратить внимание на размер папки профиля. Также, чтобы работал данный метод, советую обновить ZB до последней версии, на очень старых версиях данный метод не работает.
 
Действительно, данный метод очищает только кэш. Создам запрос на новую фичу — полную очистку профиля.
А можно к этой фичи добавить возможность очистить куки только для определённого сайта?
 
А можно к этой фичи добавить возможность очистить куки только для определённого сайта?
Здравствуйте,

Данная фича не чистит куки в принципе. Пока доработке в плане полной очистки куки также не планируется.
Рекомендуется просто удалять и создавать новый профиль, также планируется добавить временные профили, которые после работы будут сами удаляться.
 
Здравствуйте,

Данная фича не чистит куки в принципе. Пока доработке в плане полной очистки куки также не планируется.
Рекомендуется просто удалять и создавать новый профиль, также планируется добавить временные профили, которые после работы будут сами удаляться.
А можно тогда уточнить, почему такую функцию вы сделать не хотите? Из за сложности реализации, или потому, что она не востребована?
 
А можно тогда уточнить, почему такую функцию вы сделать не хотите? Из за сложности реализации, или потому, что она не востребована?
Тут подходят оба вариант, данная функция не такая востребованная и есть сложности в ее реализации.
 
Удаление cookies в ZennoBrowser через C# во время работы инстанса.

Скрипт удаляет либо все куки профиля, либо только указанных доменов — режим переключается списком в первой строке: пустой список означает «все». Домен пишется как удобно, discord.com и .discord.com равнозначны; опционально захватываются поддомены. Забирает всё, включая httpOnly, Partitioned (CHIPS) и сессионные.

Как работает:

1. instance.GetCookie("", false) — дамп всех кук профиля разом.
2. Каждая строка правится на месте: дата → в прошлое, значение → пустое, признак сессионной → FALSE.
3. Строка возвращается через instance.SetCookie(string).

C#:
Развернуть Свернуть Копировать
string[] domains = new string[] {     // Если список domains пуст, то происходит полная очистка cookies
    "",                                // Если заполнен хотя бы один домен, то происходит очистка только заданных cookies
    "",
    ""
};

bool includeSubdomains = true;    // При true удаляет домен со всеми поддоменами. Например, для домена hcaptcha.com будут удалены куки hcaptcha.com, .hcaptcha.com, api.hcaptcha.com, newassets.hcaptcha.com
bool logDetails        = true;    // Печатать ли каждую удаляемую куку отдельной строкой в логе ProjectMaker
int  maxPasses         = 2;        // Максимум повторов цикла «прочитать дамп кук → погасить найденные»

Action<string> Log = delegate(string s) { project.SendInfoToLog("[cookies] " + s, false); };

Func<string,string> Norm = delegate(string d) {
    if (d == null) return "";
    d = d.Trim().ToLowerInvariant();
    while (d.StartsWith(".")) d = d.Substring(1);
    return d;
};

var targets = new List<string>();
if (domains != null) {
    for (int i = 0; i < domains.Length; i++) {
        string n = Norm(domains[i]);
        if (n.Length > 0 && !targets.Contains(n)) targets.Add(n);
    }
}
bool allMode = targets.Count == 0;

Log(allMode
    ? "режим: удаляю ВСЕ куки профиля"
    : "режим: только домены " + string.Join(", ", targets.ToArray())
      + (includeSubdomains ? " (+поддомены)" : ""));

Func<string,bool> Match = delegate(string cookieDomain) {
    if (allMode) return true;
    string cd = Norm(cookieDomain);
    for (int i = 0; i < targets.Count; i++) {
        if (cd == targets[i]) return true;
        if (includeSubdomains && cd.EndsWith("." + targets[i])) return true;
    }
    return false;
};

Func<object,string,object[],bool> Call = delegate(object target, string name, object[] args) {
    if (target == null) return false;
    int argc = args == null ? 0 : args.Length;
    try {
        foreach (var mi in target.GetType().GetMethods()) {
            if (mi.IsSpecialName || mi.Name != name) continue;
            if (mi.GetParameters().Length != argc) continue;
            mi.Invoke(target, args);
            return true;
        }
    } catch { }
    return false;
};

Func<string> Dump = delegate() {
    try { string s = instance.GetCookie("", false); return s == null ? "" : s; }
    catch { return ""; }
};

Func<int> Live = delegate() {
    int n = 0;
    string[] rows = Dump().Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
    for (int i = 0; i < rows.Length; i++) {
        string row = rows[i].Trim();
        if (row.Length == 0 || row.StartsWith("#")) continue;
        string[] f = row.Split('\t');
        if (f.Length < 7 || f[6].Trim().Length == 0) continue;
        if (Match(f[0])) n++;
    }
    return n;
};

System.Reflection.MethodInfo miSet = null;
try {
    foreach (var mi in instance.GetType().GetMethods()) {
        if (mi.IsSpecialName || mi.Name != "SetCookie") continue;
        var ps = mi.GetParameters();
        if (ps.Length == 1 && ps[0].ParameterType == typeof(string)) { miSet = mi; break; }
    }
} catch { }
if (miSet == null) { Log("instance.SetCookie не найден"); return "no-setcookie"; }

Action<string> Set = delegate(string line) {
    try { miSet.Invoke(instance, new object[] { line }); } catch { }
};

object cc = null;
try { cc = project.Profile.CookieContainer; } catch { }

int before = Live();
Log("до очистки: " + before + " кук");

var killed = new HashSet<string>();
int after = before, kept = 0;

for (int pass = 1; pass <= maxPasses && after > 0; pass++) {
    string dump = Dump();
    if (dump.Length == 0) break;

    string[] rows = dump.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
    int found = 0;
    kept = 0;
    for (int i = 0; i < rows.Length; i++) {
        string row = rows[i].Trim();
        if (row.Length == 0 || row.StartsWith("#")) continue;
        string[] f = row.Split('\t');
        if (f.Length < 7) continue;

        string dom = f[0].Trim(), name = f[5].Trim();
        if (dom.Length == 0 || name.Length == 0) continue;
        if (f[6].Trim().Length == 0) continue;

        if (!Match(dom)) { kept++; continue; }
        found++;

        string[] g = (string[])f.Clone();
        g[4] = "01/01/2000 00:00:00";
        g[6] = "";
        if (g.Length > 8) g[8] = "FALSE";
        Set(string.Join("\t", g));

        string[] h = (string[])g.Clone();
        h[4] = "1";
        Set(string.Join("\t", h));

        string[] k = (string[])g.Clone();
        k[0] = dom.StartsWith(".") ? dom.Substring(1) : "." + dom;
        Set(string.Join("\t", k));

        if (killed.Add(dom + "\t" + name) && logDetails) Log("  [" + dom + "] " + name);
    }

    Call(cc, "UpdateCookieContainer", null);
    if (allMode) {
        Call(cc, "Clear", null);
    } else {
        for (int i = 0; i < targets.Count; i++) {
            Call(cc, "Clear", new object[] { targets[i] });
            Call(cc, "Clear", new object[] { "." + targets[i] });
        }
    }
    Call(cc, "UpdateCookieInstance", null);

    after = Live();
    Log("проход " + pass + ": найдено " + found + ", осталось живых " + after
        + (allMode ? "" : ", чужих кук " + kept));
    if (found == 0) break;
}

if (after > 0) {
    Log("не удалились:");
    string[] rows = Dump().Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
    for (int i = 0; i < rows.Length && i < 20; i++) {
        string row = rows[i].Trim();
        if (row.Length == 0 || row.StartsWith("#")) continue;
        string[] f = row.Split('\t');
        if (f.Length < 7 || f[6].Trim().Length == 0 || !Match(f[0])) continue;
        Log("  " + f[0] + " | " + f[5]);
    }
}

Log((after == 0 ? "готово: удалено кук " + killed.Count : "ВНИМАНИЕ: осталось живых " + after)
    + (allMode ? "" : ", чужих кук не тронуто " + kept));
return "before=" + before + " after=" + after;

P.S. Понадобилось решение, помучал немного ClaudeCode. Мне такое решение подходит, и у меня работает стабильно.
 

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