open System open System.IO open Microsoft.WindowsAPICodePack.Dialogs open System.Net open System.Threading open Microsoft.WindowsAPICodePack.Taskbar open System.Drawing let UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0" let Referer = "https://www.pixiv.net/member_illust.php?mode=" let KoishiPath = @"K:\z 181009-181202\新建文件夹 (51)" let (|>>) x f = f x |> ignore ; x let Log (e : string) = Console.ForegroundColor <- ConsoleColor.White Console.WriteLine e let LogInfo (e : string) = Console.ForegroundColor <- ConsoleColor.Blue Console.WriteLine e let LogError (e : string) = Console.ForegroundColor <- ConsoleColor.Red Console.WriteLine e let LogFile path (e : string) = let sw = new StreamWriter(path, true) sw.WriteLine e sw.Close() let PathSeparator = Path.DirectorySeparatorChar.ToString() type UrlType = | Picture | Pictures | Zip type Pid = { url : string; urlType : UrlType } let rec Input _ = match Console.ReadLine().Trim().ToLower() with | "" -> [] | s -> s::Input() let PixivUrlDownload directory url index length = let path = match url.urlType with | UrlType.Pictures -> (directory + PathSeparator + (Path.GetFileNameWithoutExtension url.url).Split('_').[0] |>> (fun p -> match Directory.Exists p with | false -> Some(Directory.CreateDirectory p) | _ -> None)) + PathSeparator | _ -> directory + PathSeparator + Path.GetFileName url.url let webClient = new WebClient() webClient.Headers.Add("User-Agent",UserAgent) webClient.Headers.Add("Referer",Referer + (match url.urlType with | UrlType.Pictures -> "manga" | _ -> "medium") + "&illust_id=" + Path.GetFileNameWithoutExtension url.url) webClient.Headers.Add(HttpRequestHeader.Cookie,"") Log("[-] Downloading " + url.url) try webClient.DownloadFile(Uri(url.url), path) LogInfo(" | " + (index + 1).ToString() + "/" + length.ToString() + " Succeed!") with | e -> TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Error) (" | " + Path.GetFileName url.url + " " + e.Message) |>> LogError |> LogFile (directory + PathSeparator + "Error.log") let PixivUrlsDownload rawUrls = TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Indeterminate) match rawUrls |> List.length with | 0 -> () | _ -> let directory = Directory.CreateDirectory(KoishiPath + "\\" + ((((new DirectoryInfo(KoishiPath)).GetDirectories() |> Array.map (fun i -> Convert.ToInt32 i.Name) |> Array.max) + 1).ToString())).FullName rawUrls |> List.map (fun raw -> {url=raw; urlType= (match ('/' |> raw.Split |> List.ofArray |> List.rev) with | head::_ when head.Split('.').[1] = "zip" -> UrlType.Zip | head::_ when (rawUrls |> List.exists (fun ru -> ("p0","p1") |> head.Replace |> ru.Contains)) -> UrlType.Pictures | _ -> UrlType.Picture)}) |> List.iteri (fun i u -> PixivUrlDownload directory u i rawUrls.Length TaskbarManager.Instance.SetProgressValue(i + 1, rawUrls.Length)) TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress) [<STAThread>] [<EntryPoint>] let main _ = while true do Input() |> PixivUrlsDownload Log "Done." 0