Сохранить куки в формате

Регистрация
28.06.2016
Сообщения
302
Благодарностей
17
Баллы
18
Добрый день. Сталкнулся с таким моментом. Мне нужно сохранять куки в формате Netscape и json
Я сохраняю так instance.SaveCookie(@"путь.txt"); как сохранить в формате Netscape и json
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 218
Благодарностей
5 843
Баллы
113
Попробуйте вот так:
 

Вложения

ezotonal

Client
Регистрация
13.01.2014
Сообщения
808
Благодарностей
227
Баллы
43
Еще бы аналогичный сниппет, для обратного направления)
 
Регистрация
28.06.2016
Сообщения
302
Благодарностей
17
Баллы
18

Stelsgrower

Client
Регистрация
21.12.2018
Сообщения
134
Благодарностей
62
Баллы
28

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 218
Благодарностей
5 843
Баллы
113

Stelsgrower

Client
Регистрация
21.12.2018
Сообщения
134
Благодарностей
62
Баллы
28
В неверном формате даты видимо)
Да, но как решить? Подскажите плиз.
Куки через instance.GetCookie возвращает даты в формате 12/26/2021 12:00:19, но DateTime принимает только такой вид 12.26.2021 12:00:19
Вставил следующее:
C#:
    par[4] = Macros.TextProcessing.Replace(par[4], "/", ".", "Regex", "All");
    par[4] = par[4].Remove(par[4].IndexOf(" "));
(криво, да, но знаний пока не хватает)


C#:
var cookie = instance.GetCookie("instagram.com", false);
var splited = cookie.Split(new []{"\r\n"}, StringSplitOptions.None)
    .Select(s => s.Split('\t')).Where(w => w.Length >= 6)
    .ToArray();
var result = new List<object>();
var locale = new System.Globalization.CultureInfo("en-US");
var baseDt = new DateTime(1970, 1, 1);
foreach (var par in splited){
    par[4] = Macros.TextProcessing.Replace(par[4], "/", ".", "Regex", "All");
    par[4] = par[4].Remove(par[4].IndexOf(" "));

    result.Add(new {
        domain = par[0],
        expirationDate = (long)(DateTime.Parse(par[4], locale) - baseDt).TotalSeconds,
        httpOnly = par[1] == "TRUE",
        name = par[5],
        path = par[2],
        secure = par[3] == "TRUE",
        value = par[6]
    });
}

return Global.ZennoLab.Json.JsonConvert.SerializeObject(result);
Но возвращает пустые скобки []
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113

Stelsgrower

Client
Регистрация
21.12.2018
Сообщения
134
Благодарностей
62
Баллы
28
В неверном формате даты видимо)
Понял в чем проблема, но как решить не знаю. Не все строки содержат дату и поэтому код выдает ошибку с датой, как этого избежать?
 

Вложения

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
Понял в чем проблема, но как решить не знаю. Не все строки содержат дату и поэтому код выдает ошибку с датой, как этого избежать?
Вот, маленько переписал - возвращает данные без ошибки.
C#:
string cookie = instance.GetCookie("instagram.com", false);
Func<string, long> time = delegate(string times){
    string format = @"M/d/yyyy HH:mm:ss"; // 12/26/2021 12:00:19
    TimeSpan ts = new TimeSpan();
    DateTime baseDt = new DateTime(1970, 1, 1);
    try{      
        DateTime d = DateTime.ParseExact(times, format, System.Globalization.CultureInfo.InvariantCulture);
        ts = d - baseDt;
    }
    catch (FormatException) {
        ts = baseDt - baseDt;
    }  
   // return (long)ts.TotalSeconds; // "expirationDate":1640536129 
return (long)ts.TotalMilliseconds; // "expirationDate":1640518129000 
};

string[][] splited = cookie.Split(new []{"\r\n"}, StringSplitOptions.None)
    .Select(s => s.Split('\t')).Where(w => w.Length >= 6)
    .ToArray();  
  
List<object> result = new List<object>();

foreach (var par in splited){
    result.Add(new {
        domain = par[0],      
        expirationDate = time(par[4].Trim()),
        httpOnly = par[1] == "TRUE",
        name = par[5],
        path = par[2],
        secure = par[3] == "TRUE",
        value = par[6]
    });
}

return Global.ZennoLab.Json.JsonConvert.SerializeObject(result);
Пример данных которые возвращает (вместо даты - 0)).
Код:
[{"domain":".instagram.com","expirationDate":1892814010,"httpOnly":true,"name":"ig_did","path":"/","secure":true,"value":"5F9756FD-29F8-43F1-A63C-398D0714D04D"},{"domain":".instagram.com","expirationDate":0,"httpOnly":true,"name":"rur","path":"/","secure":true,"value":"ATN"},{"domain":".instagram.com","expirationDate":1608905254,"httpOnly":true,"name":"csrftoken","path":"/","secure":true,"value":"2jgS6AcurdxkhcJAiq5Rs7mzfQokUxEo"},{"domain":".instagram.com","expirationDate":1892814011,"httpOnly":true,"name":"mid","path":"/","secure":true,"value":"XgXtmQALAAEvkRdswR75L6vUpQ-f"}]
 
Последнее редактирование:

Stelsgrower

Client
Регистрация
21.12.2018
Сообщения
134
Благодарностей
62
Баллы
28
Вот, маленько переписал - возвращает данные без ошибки.
C#:
string cookie = instance.GetCookie("instagram.com", false);

// Функция для работы с датой
Func<string, long> time = delegate(string times){
    string format = "MM/dd.yyyy HH:mm:ss"; // 12/26/2021 12:00:19
    TimeSpan ts = new TimeSpan();
    DateTime baseDt = new DateTime(1970, 1, 1);
    try{
        DateTime d = DateTime.ParseExact(times, format, new System.Globalization.CultureInfo("en-US"));
        ts = d - baseDt; // Если дата найдена - временной интервал положительный
    }
    catch (FormatException) {
        ts = baseDt - baseDt; // Если дата не найдена - временной интервал 0
    }
    return (long)ts.TotalSeconds;
};

string[][] splited = cookie.Split(new []{"\r\n"}, StringSplitOptions.None)
    .Select(s => s.Split('\t')).Where(w => w.Length >= 6)
    .ToArray();
    project.SendInfoToLog(splited.Length.ToString());

List<object> result = new List<object>();

foreach (var par in splited){
    result.Add(new {
        domain = par[0],
        expirationDate = time(par[4]),
        httpOnly = par[1] == "TRUE",
        name = par[5],
        path = par[2],
        secure = par[3] == "TRUE",
        value = par[6]
    });
}
return Global.ZennoLab.Json.JsonConvert.SerializeObject(result);
Точно, ошибок не выдает, спасибо. Однако сейчас новая проблема xD, все "expirationDate":0 (равны нулю)
Сравнил с куками из editthiscookie, все данные совпадают от того же акка, только даты по нулям

UPD: увидел траблу - MM/dd.yyyy
UPDD:
Из зенно с помощью вашего кода (Chrome):
[{"domain":".facebook.com","expirationDate":1640536129,"httpOnly":true,"name":"sb","path":"/","secure":true,"value":"j-oFXtDAVpN2xhQwBxc8JPBO"},{"domain":".facebook.com","expirationDate":1640536030,"httpOnly":true,"name":"datr","path":"/","secure":true,"value":"j-oFXvd-ec7d-G4cQ5X6SEr6"},{"domain":".facebook.com","expirationDate":1578071291,"httpOnly":true,"name":"wd","path":"/","secure":true,"value":"1600x900"},{"domain":".facebook.com","expirationDate":1585240126,"httpOnly":true,"name":"c_user","path":"/","secure":true,"value":"100002071204729"},{"domain":".facebook.com","expirationDate":1585240126,"httpOnly":true,"name":"xs","path":"/","secure":true,"value":"46%3ApelIQmXH6YZZQw%3A2%3A1577446129%3A9741%3A14590"},{"domain":".facebook.com","expirationDate":1577554130,"httpOnly":true,"name":"spin","path":"/","secure":true,"value":"r.1001569708_b.trunk_t.1577446132_s.1_v.2_"},{"domain":".facebook.com","expirationDate":1585240133,"httpOnly":true,"name":"fr","path":"/","secure":true,"value":"1NC5S9uMyQT0J4pQ3.AWXUeATHHo0aTWGVLAXIKMA-KoI.BeBeqP.aM.F4F.0.0.BeBer4.AWWFCagd"},{"domain":".facebook.com","expirationDate":0,"httpOnly":true,"name":"presence","path":"/","secure":true,"value":"EDvF3EtimeF1577448492EuserFA21B02071204729A2EstateFDt3F_5b_5dG577448492130CEchFDp_5f1B02071204729F1CC"}]
Из обычного хрома через editthiscookie (аккаунт тот же):
[{"domain":".facebook.com","expirationDate":1640518129000,"httpOnly":true,"name":"sb","path":"/","secure":true,"value":"j-oFXtDAVpN2xhQwBxc8JPBO"},{"domain":".facebook.com","expirationDate":1640518030000,"httpOnly":true,"name":"datr","path":"/","secure":true,"value":"j-oFXvd-ec7d-G4cQ5X6SEr6"},{"domain":".facebook.com","expirationDate":1578051485000,"httpOnly":true,"name":"wd","path":"/","secure":true,"value":"1600x900"},{"domain":".facebook.com","expirationDate":1585222126000,"httpOnly":true,"name":"c_user","path":"/","secure":true,"value":"100002071204729"},{"domain":".facebook.com","expirationDate":1585222126000,"httpOnly":true,"name":"xs","path":"/","secure":true,"value":"46%3ApelIQmXH6YZZQw%3A2%3A1577446129%3A9741%3A14590"},{"domain":".facebook.com","expirationDate":1577536130000,"httpOnly":true,"name":"spin","path":"/","secure":true,"value":"r.1001569708_b.trunk_t.1577446132_s.1_v.2_"},{"domain":".facebook.com","expirationDate":1585222133000,"httpOnly":true,"name":"fr","path":"/","secure":true,"value":"1NC5S9uMyQT0J4pQ3.AWXUeATHHo0aTWGVLAXIKMA-KoI.BeBeqP.aM.F4F.0.0.BeBer4.AWWFCagd"},{"domain":".facebook.com","expirationDate":null,"httpOnly":true,"name":"presence","path":"/","secure":true,"value":"EDvF3EtimeF1577446686EuserFA21B02071204729A2EstateFDt3F_5b_5dG577446686155CEchFDp_5f1B02071204729F1CC"},{"domain":"","expirationDate":null}]
Что то не так с датой, но что конкретно, до меня не доходит
 
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
Точно, ошибок не выдает, спасибо. Однако сейчас новая проблема xD, все "expirationDate":0 (равны нулю)
Увидел ошибку - исправил - теперь не должно всё выдавать 0.
Чтобы длина была "expirationDate":1640536129 - нужно return (long)ts.TotalSeconds;
Чтобы длина была "expirationDate":1640518129000 - нужно return (long)ts.TotalMilliseconds;
Собственно, я взял просто Ваш код, и внёс правки - не задумываясь о длине даты.

Что то не так с датой, но что конкретно, до меня не доходит
Внёс и данную правку в предыдущее сообщение - нужное можно будет раскомментировать.
Надеюсь теперь всё работает как Вы задумали?
 
  • Спасибо
Реакции: one и Stelsgrower

Stelsgrower

Client
Регистрация
21.12.2018
Сообщения
134
Благодарностей
62
Баллы
28
Увидел ошибку - исправил - теперь не должно всё выдавать 0.
Чтобы длина была "expirationDate":1640536129 - нужно return (long)ts.TotalSeconds;
Чтобы длина была "expirationDate":1640518129000 - нужно return (long)ts.TotalMilliseconds;
Собственно, я взял просто Ваш код, и внёс правки - не задумываясь о длине даты.


Внёс и данную правку в предыдущее сообщение - нужное можно будет раскомментировать.
Надеюсь теперь всё работает как Вы задумали?
Ну что я могу сказать, ВЫ - лучший. 2 дня голову ломал как все сделать, а Вы по щелчку пальцев решили проблему! Огромное спасибо!
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
Ну что я могу сказать, ВЫ - лучший. 2 дня голову ломал как все сделать, а Вы по щелчку пальцев решили проблему! Огромное спасибо!
Всё же одна проблема осталась - дату нужно заменить на null (вместо 0).
Но, тут я уже потерялся с тем что да как.
В документации пишет: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm

Но, когда пытаюсь вызвать, то expirationDate: null не подставляется.
Код:
return Global.ZennoLab.Json.JsonConvert.SerializeObject(result,settings:    new Global.ZennoLab.Json.JsonSerializerSettings {  }    );
Пробовал также впихнуть что-то в виде - но также не сработало - не знаю, как правильно указать настройки, чтобы подставлялось null в нужном месте.
Код:
// new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

return Global.ZennoLab.Json.JsonConvert.SerializeObject(result,settings:
    new Global.ZennoLab.Json.JsonSerializerSettings { Global.ZennoLab.Json.JsonSerializerSettings.NullValueHandling.Include }
    );
Собственно временное решение в строчке return (long)ts.TotalMilliseconds; // "expirationDate":1640518129000 проверить, если значение ==0 - тогда задать туда какое-то например 99999999999. После чего уже в сохраненном результате сделать замену: return Global.ZennoLab.Json.JsonConvert.SerializeObject(result).Replace("9999999999", "null");
Понятно, что это не правильно, но по другому пока я не знаю как решить эту задачу (может ещё кто-то подскажет по этому поводу).

P.S. Нашел как написать код:
Код:
Global.ZennoLab.Json.JsonSerializerSettings sett = new Global.ZennoLab.Json.JsonSerializerSettings();
sett.NullValueHandling = Global.ZennoLab.Json.NullValueHandling.Ignore;
return Global.ZennoLab.Json.JsonConvert.SerializeObject(result,settings: sett );

Global.ZennoLab.Json.JsonSerializerSettings sett = new Global.ZennoLab.Json.JsonSerializerSettings();
sett.NullValueHandling = Global.ZennoLab.Json.NullValueHandling.Include;
return Global.ZennoLab.Json.JsonConvert.SerializeObject(result,settings: sett );
Но, к сожалению это картину не изменило - мы не можем присвоить переменной expirationDate значение null (в визуал студии можно использовать переменные которым не присвоено значение, а в Зеннопостере этого делать нельзя)...
 
Последнее редактирование:
  • Спасибо
Реакции: orka13

Stelsgrower

Client
Регистрация
21.12.2018
Сообщения
134
Благодарностей
62
Баллы
28
Всё же одна проблема осталась - дату нужно заменить на null (вместо 0).
Но, тут я уже потерялся с тем что да как.
В документации пишет: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm

Но, когда пытаюсь вызвать, то expirationDate: null не подставляется.
Код:
return Global.ZennoLab.Json.JsonConvert.SerializeObject(result,settings:    new Global.ZennoLab.Json.JsonSerializerSettings {  }    );
Пробовал также впихнуть что-то в виде - но также не сработало - не знаю, как правильно указать настройки, чтобы подставлялось null в нужном месте.
Код:
// new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

return Global.ZennoLab.Json.JsonConvert.SerializeObject(result,settings:
    new Global.ZennoLab.Json.JsonSerializerSettings { Global.ZennoLab.Json.JsonSerializerSettings.NullValueHandling.Include }
    );
Собственно временное решение в строчке return (long)ts.TotalMilliseconds; // "expirationDate":1640518129000 проверить, если значение ==0 - тогда задать туда какое-то например 99999999999. После чего уже в сохраненном результате сделать замену: return Global.ZennoLab.Json.JsonConvert.SerializeObject(result).Replace("9999999999", "null");
Понятно, что это не правильно, но по другому пока я не знаю как решить эту задачу (может ещё кто-то подскажет по этому поводу).

P.S. Нашел как написать код:
Код:
Global.ZennoLab.Json.JsonSerializerSettings sett = new Global.ZennoLab.Json.JsonSerializerSettings();
sett.NullValueHandling = Global.ZennoLab.Json.NullValueHandling.Ignore;
return Global.ZennoLab.Json.JsonConvert.SerializeObject(result,settings: sett );

Global.ZennoLab.Json.JsonSerializerSettings sett = new Global.ZennoLab.Json.JsonSerializerSettings();
sett.NullValueHandling = Global.ZennoLab.Json.NullValueHandling.Include;
return Global.ZennoLab.Json.JsonConvert.SerializeObject(result,settings: sett );
Но, к сожалению это картину не изменило - мы не можем присвоить переменной expirationDate значение null (в визуал студии можно использовать переменные которым не присвоено значение, а в Зеннопостере этого делать нельзя)...
Да, я тоже посидел, подумал и решил не париться и применить replace ко всей полученной куке с заменой "expirationdate":0 на "expirationdate":null и это прокатило. Такое себе решение конечно, надо подумать как сделать. Однако все работает благодаря вам, еще раз спасибо!
 
  • Спасибо
Реакции: FRAPS и BAZAg

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