· 5 years ago · Dec 26, 2020, 08:20 AM
1using Microsoft.Win32;
2using Newtonsoft.Json.Linq;
3using System;
4using System.Collections.Generic;
5using System.ComponentModel;
6using System.Diagnostics;
7using System.Runtime.CompilerServices;
8using System.Threading;
9using System.Windows;
10using System.Windows.Controls;
11using VkNet.Enums.Filters;
12
13namespace VkWpfPlayer
14{
15 /// <summary>
16 /// Логика взаимодействия для VkLogin.xaml
17 /// </summary>
18
19 public class UserData : INotifyPropertyChanged
20 {
21 public string Name { get; set; }
22 public long Id { get; set; }
23 public string Token { get; set; }
24 private string avatarurl;
25 public string AvatarUrl { get { return avatarurl; } set { avatarurl = value; OnPropertyChanged("AvatarUrl"); } }
26
27 public event PropertyChangedEventHandler PropertyChanged;
28 public void OnPropertyChanged([CallerMemberName] string prop = "")
29 {
30 if (PropertyChanged != null)
31 PropertyChanged(this, new PropertyChangedEventArgs(prop));
32 }
33
34 }
35 public partial class VkLogin : Page
36 {
37 private bool twoAuthorize = false;
38 private bool codeSended = false;
39
40 private Border PreviewErrorBorder;
41 public VkLogin()
42 {
43 Uri AuthUrl = new Uri(
44 "https://oauth.vk.com/authorize?client_id=6121396&scope=1073737727&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token&revoke=1"
45 );
46
47
48 this.InitializeComponent();
49 AuthErrorBorder.Visibility = Visibility.Collapsed;
50 SaveAuthDataCheckBox.Visibility = Visibility.Collapsed;
51
52 TwoFactorCodeTextBox.Visibility = Visibility.Hidden;
53 showAccountList();
54 ShowActiveAccounts();
55 }
56 private void showAccountList()
57 {
58 LoginPanel.Visibility = Visibility.Hidden;
59 LoginBorder.Visibility = Visibility.Hidden;
60 AccountListPanelBorder.Visibility = Visibility.Visible;
61
62 }
63
64 private void HideAccountList()
65 {
66 LoginBorder.Visibility = Visibility.Visible;
67 LoginPanel.Visibility = Visibility.Visible;
68 AccountListPanelBorder.Visibility = Visibility.Hidden;
69 }
70 private void HideLoginComponents()
71 {
72
73 TwoFactorCodeTextBox.Visibility = Visibility.Hidden;
74 LoginLabel.Visibility = Visibility.Collapsed;
75 LoginTextBox.Visibility = Visibility.Collapsed;
76 PasswordTextbox.Visibility = Visibility.Collapsed;
77 }
78 private void HideTwoAuthComponents()
79 {
80 AuthButton.Content = "Авторизироваться ";
81 TwoFactorCodeTextBox.Visibility = Visibility.Hidden;
82 LoginLabel.Visibility = Visibility.Visible;
83 PasswordLabel.Content = "пароль";
84 LoginTextBox.Visibility = Visibility.Visible;
85 PasswordTextbox.Visibility = Visibility.Visible;
86 }
87
88 private void ShowTwoAuthComponents()
89 {
90 AuthButton.Content = "Отправить код авторизации";
91 TwoFactorCodeTextBox.Visibility = Visibility.Visible;
92 PasswordLabel.Content = "Введите код";
93 LoginLabel.Visibility = Visibility.Hidden;
94 LoginTextBox.Visibility = Visibility.Hidden;
95 PasswordTextbox.Visibility = Visibility.Hidden;
96 }
97 private void ShowActiveAccounts()
98 {
99 AccountList.Items.Clear();
100 List<long> Ids = new List<long>();
101
102 foreach (var account in GetSavedAuthData())
103 {
104 long lgp = long.Parse(account["ID"].ToString());
105 Ids.Add(lgp);
106 Debug.WriteLine(lgp);
107 AccountList.Items.Add(new UserData
108 {
109 Id = lgp,
110 Token = account["Token"].ToString(),
111 Name = account["Name"].ToString(),
112
113 });
114 }
115 var api = new VkNet.VkApi();
116 api.Authorize(new VkNet.Model.ApiAuthParams() { AccessToken = "4b0168fd4b0168fd4b0168fd8f4b676c6744b014b0168fd1093d8fdf1e3c0017422a04c" });
117 var data = api.Users.Get(Ids, ProfileFields.Photo50);
118
119 for (int i = 0; i < AccountList.Items.Count; i++)
120 {
121 if (data[i].Photo50 != null)
122 ((UserData)AccountList.Items[i]).AvatarUrl = data[i].Photo50.AbsoluteUri;
123 }
124
125 Ids.Clear();
126
127
128 }
129 private List<JObject> GetSavedAuthData()
130 {
131 List<JObject> objects = new List<JObject>();
132 var key = Registry.CurrentUser.OpenSubKey("SOFTWARE", true).CreateSubKey("VkPlayerByOneCellDM");
133 foreach (var val in key.GetValueNames())
134 {
135 if (val != "Settings")
136 try
137 {
138 objects.Add(JObject.Parse(key.GetValue(val).ToString()));
139 }
140 catch (Exception ex)
141 {
142 Debug.WriteLine(ex);
143 }
144 }
145 return objects;
146 }
147
148 private void SaveAuthData(VkNet.VkApi api)
149 {
150 var AccountInfo = api.Account.GetProfileInfo();
151
152
153 var data = new JObject {
154
155 { "ID", api.UserId },
156 { "Name", AccountInfo.FirstName +" "+ AccountInfo.LastName },
157 { "Token", api.Token }
158 };
159
160 var kay = Registry.CurrentUser.OpenSubKey("SOFTWARE", true).CreateSubKey("VkPlayerByOneCellDM");
161 kay.SetValue(api.UserId.ToString(), data);
162 kay.Close();
163
164 }
165
166
167 private void TwoFactorAuth()
168 {
169 var api = new VkNet.VkApi();
170 if (twoAuthorize == false)
171 {
172 var Awaiter = api.AuthorizeAsync(new VkNet.Model.ApiAuthParams()
173 {
174 Password = PasswordTextbox.Text,
175 Login = LoginTextBox.Text,
176 TwoFactorSupported = true,
177 ApplicationId = 6121396,
178 Settings = Settings.Audio | Settings.Friends | Settings.Offline,
179 TwoFactorAuthorization = () =>
180 {
181 this.Dispatcher.Invoke(() =>
182 {
183 ShowTwoAuthComponents();
184 });
185 string code = "";
186 try
187 {
188 twoAuthorize = true;
189 while (codeSended != true)
190 { Thread.Sleep(1000); }
191 this.Dispatcher.Invoke(() =>
192 {
193 codeSended = false;
194 code = TwoFactorCodeTextBox.Text;
195 TwoFactorCodeTextBox.Text = "";
196 });
197 }
198 catch (Exception ex)
199 {
200 Debug.WriteLine(ex.Message);
201 }
202 return code;
203 }
204 }).GetAwaiter();
205 Awaiter.OnCompleted(() =>
206 {
207 try
208 {
209
210 Awaiter.GetResult();
211 if (api.IsAuthorized == true)
212 {
213 SaveAuthData(api);
214 ShowActiveAccounts();
215 showAccountList();
216
217 }
218
219 }
220 catch (VkNet.Exception.VkAuthorizationException ex)
221 {
222
223 this.PreviewErrorBorder = LoginBorder;
224 this.PreviewErrorBorder.Visibility = Visibility.Collapsed;
225 this.AuthErrorBorder.Visibility = Visibility.Visible;
226
227
228 this.AuthErrorTextRun.Text = ex.Message;
229
230
231 Debug.WriteLine(ex.StackTrace);
232 }
233 catch (VkNet.Exception.UserAuthorizationFailException ex)
234 {
235 this.PreviewErrorBorder = LoginBorder;
236
237 this.AuthErrorBorder.Visibility = Visibility.Visible;
238
239 this.AuthErrorCodeTextRun.Text = "Код:" + ex.ErrorCode;
240 this.AuthErrorTextRun.Text = ex.Message;
241
242
243 Debug.WriteLine(ex.StackTrace);
244 }
245
246 });
247
248
249 }
250 else codeSended = true;
251 }
252
253 private void AuthButton_Click(object sender, RoutedEventArgs e)
254 {
255 TwoFactorAuth();
256 }
257
258 private void AuthBrowser_Click(object sender, RoutedEventArgs e)
259 {
260 }
261
262 private void GoToAuthButton_Click(object sender, RoutedEventArgs e)
263 {
264 PasswordTextbox.Text = "";
265 LoginTextBox.Text = "";
266 HideAccountList();
267 }
268
269 private void AccountList_SelectionChanged(object sender, SelectionChangedEventArgs e)
270 {
271 VkNet.VkApi api = new VkNet.VkApi();
272 var item = (UserData)AccountList.SelectedItem;
273 api.Authorize(new VkNet.Model.ApiAuthParams
274 {
275 AccessToken = item.Token,
276 UserId = (long)item.Id,
277
278 });
279 try
280 {
281
282 api.Account.GetInfo();
283 if (api.IsAuthorized)
284 ToolsAndsettings.VkApi = api;
285
286 }
287 catch (VkNet.Exception.UserAuthorizationFailException ex)
288 {
289 PreviewErrorBorder = this.AccountListPanelBorder;
290 PreviewErrorBorder.Visibility = Visibility.Collapsed;
291 this.AuthErrorBorder.Visibility = Visibility.Visible;
292
293 this.AuthErrorCodeTextRun.Text = "Код:" + ex.ErrorCode;
294 this.AuthErrorTextRun.Text = ex.Message;
295
296 }
297 }
298
299
300 private void CancelLoginButton_Click(object sender, RoutedEventArgs e)
301 {
302 this.AuthErrorBorder.Visibility = Visibility.Collapsed;
303 PreviewErrorBorder.Visibility = Visibility.Visible;
304
305 }
306
307 private void DeleteAccountButton_Click(object sender, RoutedEventArgs e)
308 {
309
310 var button = sender as Button;
311 var data = button.DataContext as UserData;
312 var key = Registry.CurrentUser.OpenSubKey("SOFTWARE", true).OpenSubKey("VkPlayerByOneCellDM", true);
313 foreach (var val in key.GetValueNames())
314 {
315 if (val != "Settings")
316 if (val == data.Id.ToString())
317 {
318 key.DeleteValue(val);
319 ShowActiveAccounts();
320 break;
321 }
322
323 }
324
325 }
326 }
327}