/
Context.cs
122 lines (91 loc) · 4.19 KB
/
Context.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using AngleSharp;
using AngleSharp.Network;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
namespace NuScrap
{
public class Context
{
Account _account;
HttpClient _client;
public string AccessToken { get; set; }
public string TokenType { get; set; }
public string RefreshToken { get; set; }
public DateTime RefreshBefore { get; set; }
[JsonProperty("_links")]
public Dictionary<string, Link> Links { get; set; }
public HttpClient Client
{
set
{
_client = value;
}
}
public Account Account
{
get
{
if (_account == null)
{
var result = _client.GetStringAsync(this.Links["account"].Href);
_account = JsonConvert.DeserializeObject<AccountResponse>(result.Result, JsonConverters.Settings).Account;
}
return _account;
}
}
public static Context Create(string login, string password)
{
var config = Configuration
.Default
.WithDefaultLoader(setup => setup.IsResourceLoadingEnabled = true);
var address = "https://app.nubank.com.br/#/login";
var request = new DocumentRequest(new Url(address));
var browseContext = BrowsingContext.New(config);
var response = browseContext.OpenAsync(request, new CancellationToken()).Result;
var js = response.Scripts.First(x => x.Source != null && x.Source.Contains("config.js"));
request.Target.Href = browseContext.Active.BaseUri + js.Source;
var download = new StreamReader(browseContext.Loader.DownloadAsync(request).Task.Result.Content).ReadToEnd();
var urlDiscovery = download
.Substring(download.IndexOf("discovery:", StringComparison.InvariantCultureIgnoreCase) + 12
, download.IndexOf("/discovery", StringComparison.InvariantCultureIgnoreCase) - download.IndexOf("discovery:"
, StringComparison.InvariantCultureIgnoreCase) - 2);
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var stringTask = client.GetStringAsync(urlDiscovery);
var msg = JsonConvert.DeserializeObject<DiscoveryResponse>(stringTask.Result);
client = new HttpClient();
var loginResponse = client.PostAsync(msg.Login, new StringContent("{\"grant_type\":\"password\"," +
$"\"login\":\"{login}\"," +
$"\"password\":\"{password}\"," +
"\"client_id\":\"other.conta\"," +
"\"client_secret\":\"yQPeLzoHuJzlMMSAjC-LgNUJdUecx8XO\"}",
Encoding.UTF8,
"application/json"));
var context = JsonConvert.DeserializeObject<Context>(loginResponse.Result.Content.ReadAsStringAsync().Result, new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
}
});
client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {context.AccessToken}");
context.Client = client;
return context;
}
public class DiscoveryResponse
{
public string Login { get; set; }
}
}
}