You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
downkyi/DownKyi.Core/Utils/ObjectHelper.cs

173 lines
5.9 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
namespace DownKyi.Core.Utils
{
public static class ObjectHelper
{
/// <summary>
/// 解析二维码登录返回的url用于设置cookie
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static CookieContainer ParseCookie(string url)
{
CookieContainer cookieContainer = new CookieContainer();
if (url == null || url == "") { return cookieContainer; }
string[] strList = url.Split('?');
if (strList.Count() < 2) { return cookieContainer; }
string[] strList2 = strList[1].Split('&');
if (strList2.Count() == 0) { return cookieContainer; }
// 获取expires
string expires = strList2.FirstOrDefault(it => it.Contains("Expires")).Split('=')[1];
DateTime dateTime = DateTime.Now;
dateTime = dateTime.AddSeconds(int.Parse(expires));
foreach (var item in strList2)
{
string[] strList3 = item.Split('=');
if (strList3.Count() < 2) { continue; }
string name = strList3[0];
string value = strList3[1];
// 不需要
if (name == "Expires" || name == "gourl") { continue; }
// 添加cookie
cookieContainer.Add(new Cookie(name, value, "/", ".bilibili.com") { Expires = dateTime });
Debugging.Console.PrintLine(name + ": " + value + "\t" + cookieContainer.Count);
}
return cookieContainer;
}
/// <summary>
/// 将CookieContainer中的所有的Cookie读出来
/// </summary>
/// <param name="cc"></param>
/// <returns></returns>
public static List<Cookie> GetAllCookies(CookieContainer cc)
{
List<Cookie> lstCookies = new List<Cookie>();
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
foreach (object pathList in table.Values)
{
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
| System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
foreach (CookieCollection colCookies in lstCookieCol.Values)
{
foreach (Cookie c in colCookies)
{
lstCookies.Add(c);
}
}
}
return lstCookies;
}
/// <summary>
/// 写入cookies到磁盘
/// </summary>
/// <param name="file"></param>
/// <param name="cookieJar"></param>
/// <returns></returns>
public static bool WriteCookiesToDisk(string file, CookieContainer cookieJar)
{
return WriteObjectToDisk(file, cookieJar);
}
/// <summary>
/// 从磁盘读取cookie
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static CookieContainer ReadCookiesFromDisk(string file)
{
return (CookieContainer)ReadObjectFromDisk(file);
}
/// <summary>
/// 写入序列化对象到磁盘
/// </summary>
/// <param name="file"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static bool WriteObjectToDisk(string file, object obj)
{
try
{
using (Stream stream = File.Create(file))
{
Debugging.Console.PrintLine("Writing object to disk... ");
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
Debugging.Console.PrintLine("Done.");
return true;
}
}
catch (IOException e)
{
Debugging.Console.PrintLine("WriteObjectToDisk()发生IO异常: {0}", e);
Logging.LogManager.Error(e);
return false;
}
catch (Exception e)
{
Debugging.Console.PrintLine("WriteObjectToDisk()发生异常: {0}", e);
Logging.LogManager.Error(e);
return false;
}
}
/// <summary>
/// 从磁盘读取序列化对象
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static object ReadObjectFromDisk(string file)
{
try
{
using (Stream stream = File.Open(file, FileMode.Open))
{
Debugging.Console.PrintLine("Reading object from disk... ");
BinaryFormatter formatter = new BinaryFormatter();
Debugging.Console.PrintLine("Done.");
return formatter.Deserialize(stream);
}
}
catch (IOException e)
{
Debugging.Console.PrintLine("ReadObjectFromDisk()发生IO异常: {0}", e);
Logging.LogManager.Error(e);
return null;
}
catch (Exception e)
{
Debugging.Console.PrintLine("ReadObjectFromDisk()发生异常: {0}", e);
Logging.LogManager.Error(e);
return null;
}
}
}
}