Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Decompiled with JetBrains decompiler
- // Type: Schokodonut.WebUntis.WebUntisClient
- // Assembly: Schokodonut, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
- // MVID: E4C15650-D23D-446E-A74E-73D81CFECC8B
- // Assembly location: C:\Users\hss-6182\Desktop\dll\Schokodonut.dll
- using Newtonsoft.Json.Linq;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Text;
- using System.Threading.Tasks;
- namespace Schokodonut.WebUntis
- {
- public class WebUntisClient
- {
- private const string DesktopUserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/59.0";
- 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";
- private HttpClient client;
- private DateTime loginTimeout;
- private string id;
- private string school;
- private string server;
- private string user;
- private string password;
- public WebUntisClient(string school, string server, string user, string password)
- {
- this.school = school;
- this.server = "https://" + server;
- this.user = user;
- this.password = password;
- }
- public IReadOnlyList<HomeworkTask> HomeworkTasks { get; private set; }
- public Timegrid Timegrid { get; private set; }
- public IReadOnlyList<Lesson> Lessons { get; private set; }
- public string StudentDisplayName { get; private set; }
- public int MaxAllowedWeeksInAdvance { get; private set; }
- public static async Task<ValueTuple<WebUntisRequestResult, IEnumerable<School>>> FindSchools(string name)
- {
- HttpClient httpClient = new HttpClient();
- 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");
- HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "https://query.webuntis.com/schoolquery/?school=");
- httpRequestMessage.Headers.Add("Accept", "*/*");
- httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate");
- httpRequestMessage.Headers.Add("Accept-Language", "de-DE,de;q=0.5");
- httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
- httpRequestMessage.Headers.Add("ContentType", "application/json");
- httpRequestMessage.Content = (HttpContent) new StringContent("{\"id\":0,\"method\":\"searchSchool\",\"params\":[{\"search\":\"" + name + "\"}],\"jsonrpc\":\"2.0\"}");
- HttpResponseMessage response;
- try
- {
- response = await httpClient.SendAsync(httpRequestMessage);
- }
- catch (Exception ex)
- {
- return new ValueTuple<WebUntisRequestResult, IEnumerable<School>>(WebUntisRequestResult.ConnectionError, (IEnumerable<School>) null);
- }
- if (response.get_StatusCode() != HttpStatusCode.OK)
- return new ValueTuple<WebUntisRequestResult, IEnumerable<School>>(WebUntisRequestResult.StatusError, (IEnumerable<School>) null);
- try
- {
- string json = await response.Content.ReadAsStringAsync();
- 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);
- }
- catch (Exception ex)
- {
- return new ValueTuple<WebUntisRequestResult, IEnumerable<School>>(WebUntisRequestResult.ParsingError, (IEnumerable<School>) null);
- }
- }
- public async Task<WebUntisRequestResult> Login()
- {
- if (DateTime.Now < this.loginTimeout)
- return WebUntisRequestResult.Success;
- if (this.client != null)
- this.client.Dispose();
- this.client = new HttpClient();
- this.client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/59.0");
- HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, this.server + "/WebUntis/j_spring_security_check");
- httpRequestMessage.Headers.Add("Accept", "application/json");
- httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate, br");
- httpRequestMessage.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
- httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
- httpRequestMessage.Headers.Add("ContentType", "application/x-www-form-urlencoded");
- KeyValuePair<string, string>[] keyValuePairArray = new KeyValuePair<string, string>[4]
- {
- new KeyValuePair<string, string>("buttonName", "login"),
- new KeyValuePair<string, string>("school", this.school),
- new KeyValuePair<string, string>("j_username", this.user),
- new KeyValuePair<string, string>("j_password", this.password)
- };
- httpRequestMessage.Content = (HttpContent) new FormUrlEncodedContent((IEnumerable<KeyValuePair<string, string>>) keyValuePairArray);
- HttpResponseMessage response;
- try
- {
- response = await this.client.SendAsync(httpRequestMessage);
- }
- catch (TaskCanceledException ex)
- {
- return WebUntisRequestResult.Canceled;
- }
- catch (Exception ex)
- {
- return WebUntisRequestResult.ConnectionError;
- }
- if (response.get_StatusCode() != HttpStatusCode.OK)
- return WebUntisRequestResult.StatusError;
- string loginResponseString;
- try
- {
- loginResponseString = await response.Content.ReadAsStringAsync();
- }
- catch (Exception ex)
- {
- return WebUntisRequestResult.ParsingError;
- }
- if (!loginResponseString.Contains("SUCCESS"))
- return !loginResponseString.Contains("NO_MANDANT") ? (!loginResponseString.Contains("LOGIN_ERROR") ? WebUntisRequestResult.UnknownError : WebUntisRequestResult.InvalidCredentials) : WebUntisRequestResult.InvalidSchool;
- this.loginTimeout = DateTime.Now.AddMinutes(4.0);
- return WebUntisRequestResult.Success;
- }
- public async Task<WebUntisRequestResult> LoadPageconfig()
- {
- if (this.id != null)
- return WebUntisRequestResult.Success;
- HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, this.server + "/WebUntis/api/public/timetable/weekly/pageconfig");
- httpRequestMessage.Headers.Add("Accept", "application/json");
- httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate, br");
- httpRequestMessage.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
- httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
- KeyValuePair<string, string>[] keyValuePairArray = new KeyValuePair<string, string>[2]
- {
- new KeyValuePair<string, string>("type", "5"),
- new KeyValuePair<string, string>("date", DateTime.Now.ToString("yyyy-MM-dd"))
- };
- httpRequestMessage.Content = (HttpContent) new FormUrlEncodedContent((IEnumerable<KeyValuePair<string, string>>) keyValuePairArray);
- HttpResponseMessage response;
- try
- {
- response = await this.client.SendAsync(httpRequestMessage);
- }
- catch (TaskCanceledException ex)
- {
- return WebUntisRequestResult.Canceled;
- }
- catch (Exception ex)
- {
- return WebUntisRequestResult.ConnectionError;
- }
- if (response.get_StatusCode() != HttpStatusCode.OK)
- return WebUntisRequestResult.StatusError;
- try
- {
- JToken jtoken = JObject.Parse(await response.Content.ReadAsStringAsync())["data"][(object) "elements"].Children().First<JToken>();
- this.id = (string) jtoken[(object) "id"];
- this.StudentDisplayName = (string) jtoken[(object) "forename"] + " " + (string) jtoken[(object) "longName"];
- return WebUntisRequestResult.Success;
- }
- catch (Exception ex)
- {
- return WebUntisRequestResult.ParsingError;
- }
- }
- public Task<WebUntisRequestResult> LoadHomework()
- {
- throw new NotImplementedException();
- }
- public async Task<WebUntisRequestResult> LoadTimegrid()
- {
- HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, this.server + "/WebUntis/jsonrpc_web/jsonTimegridService");
- httpRequestMessage.Headers.Add("Accept", "application/json");
- httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate, br");
- httpRequestMessage.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
- httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
- httpRequestMessage.Content = (HttpContent) new StringContent("{\"id\":0,\"method\":\"getTimegrid\",\"params\":[4],\"jsonrpc\":\"2.0\"}", Encoding.UTF8, "application/json");
- HttpResponseMessage response;
- try
- {
- response = await this.client.SendAsync(httpRequestMessage);
- }
- catch (TaskCanceledException ex)
- {
- return WebUntisRequestResult.Canceled;
- }
- catch (Exception ex)
- {
- return WebUntisRequestResult.ConnectionError;
- }
- if (response.get_StatusCode() != HttpStatusCode.OK)
- return WebUntisRequestResult.StatusError;
- try
- {
- this.Timegrid = Timegrid.Parse(await response.Content.ReadAsStringAsync());
- return WebUntisRequestResult.Success;
- }
- catch (Exception ex)
- {
- return WebUntisRequestResult.ParsingError;
- }
- }
- public async Task<WebUntisRequestResult> LoadTimetables(int minWeekOffset, int maxWeekOffset)
- {
- List<Lesson> lessons = new List<Lesson>();
- for (int i = minWeekOffset; i <= maxWeekOffset; ++i)
- {
- WebUntisRequestResult untisRequestResult = await this.LoadLessonsForWeek(WebUntisClient.GetMonday(i, new DateTime()));
- if (untisRequestResult == WebUntisRequestResult.Success)
- {
- lessons.AddRange((IEnumerable<Lesson>) this.Lessons);
- this.MaxAllowedWeeksInAdvance = i;
- }
- if (untisRequestResult != WebUntisRequestResult.Success && untisRequestResult != WebUntisRequestResult.NotAllowed)
- return untisRequestResult;
- if (untisRequestResult == WebUntisRequestResult.NotAllowed)
- {
- this.MaxAllowedWeeksInAdvance = i - 1;
- break;
- }
- }
- this.Lessons = (IReadOnlyList<Lesson>) lessons;
- return WebUntisRequestResult.Success;
- }
- public async Task<WebUntisRequestResult> LoadLessonsForWeek(DateTime monday)
- {
- string str = "LoadLessonsForWeek " + monday.ToString("dd.MM.");
- if (this.id == null)
- return WebUntisRequestResult.UnknownError;
- HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, this.server + "/WebUntis/api/public/timetable/weekly/data");
- httpRequestMessage.Headers.Add("Accept", "application/json");
- httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate, br");
- httpRequestMessage.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
- httpRequestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
- httpRequestMessage.Headers.Add("Origin", this.server);
- KeyValuePair<string, string>[] keyValuePairArray = new KeyValuePair<string, string>[4]
- {
- new KeyValuePair<string, string>("elementType", "5"),
- new KeyValuePair<string, string>("elementId", this.id),
- new KeyValuePair<string, string>("date", monday.ToString("yyyy-MM-dd")),
- new KeyValuePair<string, string>("formatId", "5")
- };
- httpRequestMessage.Content = (HttpContent) new FormUrlEncodedContent((IEnumerable<KeyValuePair<string, string>>) keyValuePairArray);
- HttpResponseMessage response;
- try
- {
- response = await this.client.SendAsync(httpRequestMessage);
- }
- catch (TaskCanceledException ex)
- {
- return WebUntisRequestResult.Canceled;
- }
- catch (Exception ex)
- {
- return WebUntisRequestResult.ConnectionError;
- }
- if (response.get_StatusCode() != HttpStatusCode.OK)
- return WebUntisRequestResult.StatusError;
- try
- {
- string json = await response.Content.ReadAsStringAsync();
- if (json.Contains("ERR_TTVIEW_NOTALLOWED_ONDATE"))
- return WebUntisRequestResult.NotAllowed;
- this.Lessons = (IReadOnlyList<Lesson>) Lesson.ParseLessons(json);
- return WebUntisRequestResult.Success;
- }
- catch (Exception ex)
- {
- return WebUntisRequestResult.ParsingError;
- }
- }
- public void Cancel()
- {
- if (this.client == null)
- return;
- this.client.CancelPendingRequests();
- }
- public static string RequestResultToString(WebUntisRequestResult result)
- {
- switch (result)
- {
- case WebUntisRequestResult.ConnectionError:
- return "Verbindung konnte nicht hergestellt werden";
- case WebUntisRequestResult.StatusError:
- return "HTTP Statusfehler";
- case WebUntisRequestResult.UnknownError:
- return "Unbekannter Fehler";
- case WebUntisRequestResult.InvalidCredentials:
- return "Ungültiger Benutzername oder Passwort";
- case WebUntisRequestResult.InvalidSchool:
- return "Schule konnte nicht gefunden werden";
- case WebUntisRequestResult.NotAllowed:
- return "Zugriff verweigert";
- case WebUntisRequestResult.ParsingError:
- return "Interner Datenverarbeitungsfehler";
- default:
- return (string) null;
- }
- }
- public static DateTime GetMonday(int weekOffset = 0, DateTime date = default (DateTime))
- {
- if (date == new DateTime())
- date = DateTime.Today;
- int num = date.DayOfWeek == DayOfWeek.Sunday ? 7 : (int) date.DayOfWeek;
- return date.AddDays((double) (1 - num)).AddDays((double) (7 * weekOffset));
- }
- [Conditional("DEBUG")]
- private static void WriteDebugWebUntisResult(string method, WebUntisRequestResult result, string extra = null)
- {
- }
- [Conditional("DEBUG")]
- private static void WriteDebugError(string method, Exception exception)
- {
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement