%PDF- %PDF-
| Direktori : /data/down/pc_is/Desktop/vintedDown/ |
| Current File : //data/down/pc_is/Desktop/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_down3";
#endif
private string existingItemsFile;
private string csrf;
private string anonId;
private List<ItemPhoto> photos;
private CookieContainer cookieContainer;
private List<long> existingItemIds;
public User(string baseAddress, string id)
{
BaseAddress = baseAddress;
Id = id;
UserId = id;
photos = new List<ItemPhoto>();
if (!Directory.Exists($"{_BASE_FOLDER}{BaseAddress}/{Id}"))
{
Directory.CreateDirectory($"{_BASE_FOLDER}/{BaseAddress}/{Id}");
}
existingItemsFile = $"{_BASE_FOLDER}/{BaseAddress}/{UserId}/items.json";
LoadDone();
}
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=20&order=relevance";
string baseAddr = "https://www.vinted.fr/api/v2/wardrobe/" + 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)
{
if (existingItemIds.Any(x => x == item.id))
continue;
foreach(var photo in item.photos)
{
photos.Add(new ItemPhoto { ItemId = item.id, PhotoUrl = 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);
existingItemIds.Add(photo.ItemId);
}
await SaveDone();
}
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<ItemPhoto>();
UserId = data.item.user_id.ToString();
if (!Directory.Exists($"{_BASE_FOLDER}/{BaseAddress}/{UserId}"))
{
Directory.CreateDirectory($"{_BASE_FOLDER}/{BaseAddress}/{UserId}");
}
existingItemsFile = $"{_BASE_FOLDER}/{BaseAddress}/{UserId}/items.json";
LoadDone();
foreach (var photo in data.item.photos)
{
photos.Add(new ItemPhoto {ItemId = data.item.id, PhotoUrl = photo.full_size_url});
}
}
private void LoadDone()
{
if (File.Exists(existingItemsFile))
{
var data = File.ReadAllText(existingItemsFile);
existingItemIds = JsonConvert.DeserializeObject<List<long>>(data,
new JsonSerializerSettings()
{ Error = (sender, error) => error.ErrorContext.Handled = true }) ??
new List<long>();
}
else
{
existingItemIds = new List<long>();
}
}
private Task SaveDone()
{
var json = JsonConvert.SerializeObject(existingItemIds, Formatting.Indented);
return File.WriteAllTextAsync(existingItemsFile, json);
}
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);
var txt = await response.Content.ReadAsStringAsync();
int tokenIdx = txt.IndexOf("CSRF_TOKEN");
csrf = txt.Substring(tokenIdx + 15, 36);
tokenIdx = txt.IndexOf("\\\"anon_id\\\"");
anonId = txt.Substring(tokenIdx + 14, 36);
}
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");
_client.DefaultRequestHeaders.Add("X-CSRF-Token", csrf);
_client.DefaultRequestHeaders.Add("X-Money-Object", "true");
_client.DefaultRequestHeaders.Referrer = new Uri($"https://{BaseAddress}/member/{Id}");
_client.DefaultRequestHeaders.Add("x-Anon-Id", anonId);
using HttpResponseMessage response = await _client.GetAsync(uri);
return await response.Content.ReadAsStringAsync();
}
private async Task GetAsyncSave(ItemPhoto item)
{
Console.WriteLine("[{0}] GET {1}", DateTime.Now.ToString("u"), item.PhotoUrl);
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(item.PhotoUrl);
var data = await response.Content.ReadAsByteArrayAsync();
var bits = item.PhotoUrl.Split("/", StringSplitOptions.RemoveEmptyEntries);
var filename = item.ItemId.ToString("x16") + "_" + GetFileNameFromUrl(item.PhotoUrl).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);
}
}
}