Advertisement
Guest User

Untitled

a guest
Jun 13th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.40 KB | None | 0 0
  1. // Decompiled with JetBrains decompiler
  2. // Type: Schokodonut.WebUntis.WebUntisClient
  3. // Assembly: Schokodonut, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
  4. // MVID: E4C15650-D23D-446E-A74E-73D81CFECC8B
  5. // Assembly location: C:\Users\hss-6182\Desktop\dll\Schokodonut.dll
  6.  
  7. using Newtonsoft.Json.Linq;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Diagnostics;
  11. using System.Linq;
  12. using System.Net;
  13. using System.Net.Http;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16.  
  17. namespace Schokodonut.WebUntis
  18. {
  19. public class WebUntisClient
  20. {
  21. private const string DesktopUserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/59.0";
  22. private const string MobileUserAgent = "Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; MSAppHost/3.0; Microsoft; Lumia 640 Dual SIM) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Mobile Safari/537.36 Edge/14.14393";
  23. private HttpClient client;
  24. private DateTime loginTimeout;
  25. private string id;
  26. private string school;
  27. private string server;
  28. private string user;
  29. private string password;
  30.  
  31. public WebUntisClient(string school, string server, string user, string password)
  32. {
  33. this.school = school;
  34. this.server = "https://" + server;
  35. this.user = user;
  36. this.password = password;
  37. }
  38.  
  39. public IReadOnlyList<HomeworkTask> HomeworkTasks { get; private set; }
  40.  
  41. public Timegrid Timegrid { get; private set; }
  42.  
  43. public IReadOnlyList<Lesson> Lessons { get; private set; }
  44.  
  45. public string StudentDisplayName { get; private set; }
  46.  
  47. public int MaxAllowedWeeksInAdvance { get; private set; }
  48.  
  49. public static async Task<ValueTuple<WebUntisRequestResult, IEnumerable<School>>> FindSchools(string name)
  50. {
  51. HttpClient httpClient = new HttpClient();
  52. httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; MSAppHost/3.0; Microsoft; Lumia 640 Dual SIM) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Mobile Safari/537.36 Edge/14.14393");
  53. HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "https://query.webuntis.com/schoolquery/?school=");
  54. httpRequestMessage.Headers.Add("Accept", "*/*");
  55. httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate");
  56. httpRequestMessage.Headers.Add("Accept-Language", "de-DE,de;q=0.5");
  57. httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
  58. httpRequestMessage.Headers.Add("ContentType", "application/json");
  59. httpRequestMessage.Content = (HttpContent) new StringContent("{\"id\":0,\"method\":\"searchSchool\",\"params\":[{\"search\":\"" + name + "\"}],\"jsonrpc\":\"2.0\"}");
  60. HttpResponseMessage response;
  61. try
  62. {
  63. response = await httpClient.SendAsync(httpRequestMessage);
  64. }
  65. catch (Exception ex)
  66. {
  67. return new ValueTuple<WebUntisRequestResult, IEnumerable<School>>(WebUntisRequestResult.ConnectionError, (IEnumerable<School>) null);
  68. }
  69. if (response.get_StatusCode() != HttpStatusCode.OK)
  70. return new ValueTuple<WebUntisRequestResult, IEnumerable<School>>(WebUntisRequestResult.StatusError, (IEnumerable<School>) null);
  71. try
  72. {
  73. string json = await response.Content.ReadAsStringAsync();
  74. return !json.Contains("too many results") ? new ValueTuple<WebUntisRequestResult, IEnumerable<School>>(WebUntisRequestResult.Success, School.ParseSchools(json)) : new ValueTuple<WebUntisRequestResult, IEnumerable<School>>(WebUntisRequestResult.TooManyResults, (IEnumerable<School>) null);
  75. }
  76. catch (Exception ex)
  77. {
  78. return new ValueTuple<WebUntisRequestResult, IEnumerable<School>>(WebUntisRequestResult.ParsingError, (IEnumerable<School>) null);
  79. }
  80. }
  81.  
  82. public async Task<WebUntisRequestResult> Login()
  83. {
  84. if (DateTime.Now < this.loginTimeout)
  85. return WebUntisRequestResult.Success;
  86. if (this.client != null)
  87. this.client.Dispose();
  88. this.client = new HttpClient();
  89. this.client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/59.0");
  90. HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, this.server + "/WebUntis/j_spring_security_check");
  91. httpRequestMessage.Headers.Add("Accept", "application/json");
  92. httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate, br");
  93. httpRequestMessage.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
  94. httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
  95. httpRequestMessage.Headers.Add("ContentType", "application/x-www-form-urlencoded");
  96. KeyValuePair<string, string>[] keyValuePairArray = new KeyValuePair<string, string>[4]
  97. {
  98. new KeyValuePair<string, string>("buttonName", "login"),
  99. new KeyValuePair<string, string>("school", this.school),
  100. new KeyValuePair<string, string>("j_username", this.user),
  101. new KeyValuePair<string, string>("j_password", this.password)
  102. };
  103. httpRequestMessage.Content = (HttpContent) new FormUrlEncodedContent((IEnumerable<KeyValuePair<string, string>>) keyValuePairArray);
  104. HttpResponseMessage response;
  105. try
  106. {
  107. response = await this.client.SendAsync(httpRequestMessage);
  108. }
  109. catch (TaskCanceledException ex)
  110. {
  111. return WebUntisRequestResult.Canceled;
  112. }
  113. catch (Exception ex)
  114. {
  115. return WebUntisRequestResult.ConnectionError;
  116. }
  117. if (response.get_StatusCode() != HttpStatusCode.OK)
  118. return WebUntisRequestResult.StatusError;
  119. string loginResponseString;
  120. try
  121. {
  122. loginResponseString = await response.Content.ReadAsStringAsync();
  123. }
  124. catch (Exception ex)
  125. {
  126. return WebUntisRequestResult.ParsingError;
  127. }
  128. if (!loginResponseString.Contains("SUCCESS"))
  129. return !loginResponseString.Contains("NO_MANDANT") ? (!loginResponseString.Contains("LOGIN_ERROR") ? WebUntisRequestResult.UnknownError : WebUntisRequestResult.InvalidCredentials) : WebUntisRequestResult.InvalidSchool;
  130. this.loginTimeout = DateTime.Now.AddMinutes(4.0);
  131. return WebUntisRequestResult.Success;
  132. }
  133.  
  134. public async Task<WebUntisRequestResult> LoadPageconfig()
  135. {
  136. if (this.id != null)
  137. return WebUntisRequestResult.Success;
  138. HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, this.server + "/WebUntis/api/public/timetable/weekly/pageconfig");
  139. httpRequestMessage.Headers.Add("Accept", "application/json");
  140. httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate, br");
  141. httpRequestMessage.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
  142. httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
  143. KeyValuePair<string, string>[] keyValuePairArray = new KeyValuePair<string, string>[2]
  144. {
  145. new KeyValuePair<string, string>("type", "5"),
  146. new KeyValuePair<string, string>("date", DateTime.Now.ToString("yyyy-MM-dd"))
  147. };
  148. httpRequestMessage.Content = (HttpContent) new FormUrlEncodedContent((IEnumerable<KeyValuePair<string, string>>) keyValuePairArray);
  149. HttpResponseMessage response;
  150. try
  151. {
  152. response = await this.client.SendAsync(httpRequestMessage);
  153. }
  154. catch (TaskCanceledException ex)
  155. {
  156. return WebUntisRequestResult.Canceled;
  157. }
  158. catch (Exception ex)
  159. {
  160. return WebUntisRequestResult.ConnectionError;
  161. }
  162. if (response.get_StatusCode() != HttpStatusCode.OK)
  163. return WebUntisRequestResult.StatusError;
  164. try
  165. {
  166. JToken jtoken = JObject.Parse(await response.Content.ReadAsStringAsync())["data"][(object) "elements"].Children().First<JToken>();
  167. this.id = (string) jtoken[(object) "id"];
  168. this.StudentDisplayName = (string) jtoken[(object) "forename"] + " " + (string) jtoken[(object) "longName"];
  169. return WebUntisRequestResult.Success;
  170. }
  171. catch (Exception ex)
  172. {
  173. return WebUntisRequestResult.ParsingError;
  174. }
  175. }
  176.  
  177. public Task<WebUntisRequestResult> LoadHomework()
  178. {
  179. throw new NotImplementedException();
  180. }
  181.  
  182. public async Task<WebUntisRequestResult> LoadTimegrid()
  183. {
  184. HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, this.server + "/WebUntis/jsonrpc_web/jsonTimegridService");
  185. httpRequestMessage.Headers.Add("Accept", "application/json");
  186. httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate, br");
  187. httpRequestMessage.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
  188. httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
  189. httpRequestMessage.Content = (HttpContent) new StringContent("{\"id\":0,\"method\":\"getTimegrid\",\"params\":[4],\"jsonrpc\":\"2.0\"}", Encoding.UTF8, "application/json");
  190. HttpResponseMessage response;
  191. try
  192. {
  193. response = await this.client.SendAsync(httpRequestMessage);
  194. }
  195. catch (TaskCanceledException ex)
  196. {
  197. return WebUntisRequestResult.Canceled;
  198. }
  199. catch (Exception ex)
  200. {
  201. return WebUntisRequestResult.ConnectionError;
  202. }
  203. if (response.get_StatusCode() != HttpStatusCode.OK)
  204. return WebUntisRequestResult.StatusError;
  205. try
  206. {
  207. this.Timegrid = Timegrid.Parse(await response.Content.ReadAsStringAsync());
  208. return WebUntisRequestResult.Success;
  209. }
  210. catch (Exception ex)
  211. {
  212. return WebUntisRequestResult.ParsingError;
  213. }
  214. }
  215.  
  216. public async Task<WebUntisRequestResult> LoadTimetables(int minWeekOffset, int maxWeekOffset)
  217. {
  218. List<Lesson> lessons = new List<Lesson>();
  219. for (int i = minWeekOffset; i <= maxWeekOffset; ++i)
  220. {
  221. WebUntisRequestResult untisRequestResult = await this.LoadLessonsForWeek(WebUntisClient.GetMonday(i, new DateTime()));
  222. if (untisRequestResult == WebUntisRequestResult.Success)
  223. {
  224. lessons.AddRange((IEnumerable<Lesson>) this.Lessons);
  225. this.MaxAllowedWeeksInAdvance = i;
  226. }
  227. if (untisRequestResult != WebUntisRequestResult.Success && untisRequestResult != WebUntisRequestResult.NotAllowed)
  228. return untisRequestResult;
  229. if (untisRequestResult == WebUntisRequestResult.NotAllowed)
  230. {
  231. this.MaxAllowedWeeksInAdvance = i - 1;
  232. break;
  233. }
  234. }
  235. this.Lessons = (IReadOnlyList<Lesson>) lessons;
  236. return WebUntisRequestResult.Success;
  237. }
  238.  
  239. public async Task<WebUntisRequestResult> LoadLessonsForWeek(DateTime monday)
  240. {
  241. string str = "LoadLessonsForWeek " + monday.ToString("dd.MM.");
  242. if (this.id == null)
  243. return WebUntisRequestResult.UnknownError;
  244. HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, this.server + "/WebUntis/api/public/timetable/weekly/data");
  245. httpRequestMessage.Headers.Add("Accept", "application/json");
  246. httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate, br");
  247. httpRequestMessage.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
  248. httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
  249. httpRequestMessage.Headers.Add("Origin", this.server);
  250. KeyValuePair<string, string>[] keyValuePairArray = new KeyValuePair<string, string>[4]
  251. {
  252. new KeyValuePair<string, string>("elementType", "5"),
  253. new KeyValuePair<string, string>("elementId", this.id),
  254. new KeyValuePair<string, string>("date", monday.ToString("yyyy-MM-dd")),
  255. new KeyValuePair<string, string>("formatId", "5")
  256. };
  257. httpRequestMessage.Content = (HttpContent) new FormUrlEncodedContent((IEnumerable<KeyValuePair<string, string>>) keyValuePairArray);
  258. HttpResponseMessage response;
  259. try
  260. {
  261. response = await this.client.SendAsync(httpRequestMessage);
  262. }
  263. catch (TaskCanceledException ex)
  264. {
  265. return WebUntisRequestResult.Canceled;
  266. }
  267. catch (Exception ex)
  268. {
  269. return WebUntisRequestResult.ConnectionError;
  270. }
  271. if (response.get_StatusCode() != HttpStatusCode.OK)
  272. return WebUntisRequestResult.StatusError;
  273. try
  274. {
  275. string json = await response.Content.ReadAsStringAsync();
  276. if (json.Contains("ERR_TTVIEW_NOTALLOWED_ONDATE"))
  277. return WebUntisRequestResult.NotAllowed;
  278. this.Lessons = (IReadOnlyList<Lesson>) Lesson.ParseLessons(json);
  279. return WebUntisRequestResult.Success;
  280. }
  281. catch (Exception ex)
  282. {
  283. return WebUntisRequestResult.ParsingError;
  284. }
  285. }
  286.  
  287. public void Cancel()
  288. {
  289. if (this.client == null)
  290. return;
  291. this.client.CancelPendingRequests();
  292. }
  293.  
  294. public static string RequestResultToString(WebUntisRequestResult result)
  295. {
  296. switch (result)
  297. {
  298. case WebUntisRequestResult.ConnectionError:
  299. return "Verbindung konnte nicht hergestellt werden";
  300. case WebUntisRequestResult.StatusError:
  301. return "HTTP Statusfehler";
  302. case WebUntisRequestResult.UnknownError:
  303. return "Unbekannter Fehler";
  304. case WebUntisRequestResult.InvalidCredentials:
  305. return "Ungültiger Benutzername oder Passwort";
  306. case WebUntisRequestResult.InvalidSchool:
  307. return "Schule konnte nicht gefunden werden";
  308. case WebUntisRequestResult.NotAllowed:
  309. return "Zugriff verweigert";
  310. case WebUntisRequestResult.ParsingError:
  311. return "Interner Datenverarbeitungsfehler";
  312. default:
  313. return (string) null;
  314. }
  315. }
  316.  
  317. public static DateTime GetMonday(int weekOffset = 0, DateTime date = default (DateTime))
  318. {
  319. if (date == new DateTime())
  320. date = DateTime.Today;
  321. int num = date.DayOfWeek == DayOfWeek.Sunday ? 7 : (int) date.DayOfWeek;
  322. return date.AddDays((double) (1 - num)).AddDays((double) (7 * weekOffset));
  323. }
  324.  
  325. [Conditional("DEBUG")]
  326. private static void WriteDebugWebUntisResult(string method, WebUntisRequestResult result, string extra = null)
  327. {
  328. }
  329.  
  330. [Conditional("DEBUG")]
  331. private static void WriteDebugError(string method, Exception exception)
  332. {
  333. }
  334. }
  335. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement