%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /data/ntb/vintedDown/
Upload File :
Create Path :
Current File : //data/ntb/vintedDown/User.cs

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Runtime.ConstrainedExecution;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace vintedDown
{
	public class User
	{
#if DEBUG
		private const string _BASE_FOLDER = "c:\\tmp\\vinted";
#else
		private const string _BASE_FOLDER = "/www/varak.cloud/img.varak.cloud/img/vinted_down";
#endif

		private List<string> photos;
		private CookieContainer cookieContainer;

		public User(string baseAddress, string id) 
		{
			BaseAddress = baseAddress;
			Id = id;
			UserId = id;

			photos = new List<string>();
			if (!Directory.Exists($"{_BASE_FOLDER}{BaseAddress}/{Id}"))
			{
				Directory.CreateDirectory($"{_BASE_FOLDER}/{BaseAddress}/{Id}");
			}
		}

		public User(string baseAddress, string id, bool isOneItem)
		{
			BaseAddress = baseAddress;
			Id = id;

			IsOneItem = isOneItem;
		}

		public string BaseAddress { get; set; }

		public string Id { get; set; }

		public string UserId { get; set; }

		public bool IsOneItem { get; set; } = false;

		public async Task LoadItems()
		{
			await GetAuthCookies();

			if (IsOneItem)
			{
				await LoadSingleItem();
				return;
			}

			var baseAddr = "https://" + BaseAddress + "/api/v2/users/" + Id + "/items?page={0}&per_page=96&order=relevance";
			var hasPage = true;
			for(var i = 1; hasPage; i++)
			{
				var jsonString = await GetAsync(string.Format(baseAddr, i));
				var data = JsonConvert.DeserializeObject<ApiUser.Root>(jsonString, new JsonSerializerSettings() { Error = (sender, error) => error.ErrorContext.Handled = true });
				foreach(var item in data.items) 
				{
					foreach(var photo in item.photos)
					{
						photos.Add(photo.full_size_url);
					}
				}
				if(i == data.pagination.total_pages)
				{
					hasPage = false;
				}
			}
		}

		public async Task SaveItems(string path = "")
		{
			foreach (var photo in photos)
			{
				await GetAsyncSave(photo);
			}
		}

		private async Task LoadSingleItem()
		{
			var baseAddr = "https://" + BaseAddress + "/api/v2/items/" + Id + "?localize=false";
			var jsonString = await GetAsync(baseAddr);
			var data = JsonConvert.DeserializeObject<ApiItemNew.Root>(jsonString, new JsonSerializerSettings() { Error = (sender, error) => error.ErrorContext.Handled = true });
			if (data == null) return;

			photos = new List<string>();
			UserId = data.item.user_id.ToString();
			if (!Directory.Exists($"{_BASE_FOLDER}/{BaseAddress}/{UserId}"))
			{
				Directory.CreateDirectory($"{_BASE_FOLDER}/{BaseAddress}/{UserId}");
			}

			foreach (var photo in data.item.photos)
			{
				photos.Add(photo.full_size_url);
			}
		}

		private async Task GetAuthCookies()
		{
			cookieContainer = new CookieContainer();
			var uri = $"https://{BaseAddress}/member/{Id}";
			Console.WriteLine("[{0}] GET {1}", DateTime.Now.ToString("u"), uri);
			using var handler = new HttpClientHandler() { CookieContainer = cookieContainer };
			var _client = new HttpClient(handler);
			_client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
			using HttpResponseMessage response = await _client.GetAsync(uri);
		}

		private async Task<string> GetAsync(string uri)
		{
			Console.WriteLine("[{0}] GET {1}", DateTime.Now.ToString("u"), uri);
			using var handler = new HttpClientHandler() { CookieContainer = cookieContainer };
			var _client = new HttpClient(handler);
			_client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
			using HttpResponseMessage response = await _client.GetAsync(uri);

			return await response.Content.ReadAsStringAsync();
		}

		private async Task GetAsyncSave(string uri)
		{
			Console.WriteLine("[{0}] GET {1}", DateTime.Now.ToString("u"), uri);
			using var handler = new HttpClientHandler() { CookieContainer = cookieContainer };
			var _client = new HttpClient(handler);
			_client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
			using HttpResponseMessage response = await _client.GetAsync(uri);

			var data = await response.Content.ReadAsByteArrayAsync();
			var bits = uri.Split("/", StringSplitOptions.RemoveEmptyEntries);
			var filename = GetFileNameFromUrl(uri).Split(".")[0] + "_" + bits[3] + ".jpg";

			File.WriteAllBytes($"{_BASE_FOLDER}/{BaseAddress}/{UserId}/" + filename, data);
		}

		private string GetFileNameFromUrl(string url)
		{
			Uri SomeBaseUri = new Uri("http://canbeanything");
			Uri uri;
			if (!Uri.TryCreate(url, UriKind.Absolute, out uri))
				uri = new Uri(SomeBaseUri, url);

			return Path.GetFileName(uri.LocalPath);
		}

	}
}

Zerion Mini Shell 1.0