/// <summary> /// Inject a JavaScript element into the document head /// </summary> /// <param name="javaScript">the script code</param> public void InjectJavaScript(string javaScript) { if (null == this.Document) { return; } try { HtmlElement headElement = this.Document.GetElementsByTagName("head")[0]; HtmlElement scriptElement = this.Document.CreateElement("script"); if (scriptElement == null) { return; } scriptElement.SetAttribute("type", "text/javascript"); // use the custom mshtml interface to append the script to the element IHtmlScriptElement element = (IHtmlScriptElement)scriptElement.DomElement; element.Text = "/* <![CDATA[ */ " + javaScript + " /* ]]> */"; headElement.AppendChild(scriptElement); } catch (InvalidOperationException ioex) { Debug.WriteLine("InjectJavascript: " + ioex, "GEWebBrowser"); } }
private static async Task <string> DecodeResponse(IHtmlDocument htmlDocument, HttpClient httpClient, HttpResponseMessage httpResponseMessage) { string responseString = await httpResponseMessage.Content.ReadAsStringAsync(); string responseJson = string.Empty; if (responseString.StartsWith("{")) { responseJson = responseString; } else { if (JintEngine == null) { IHtmlScriptElement appJsScript = htmlDocument.Scripts.FirstOrDefault(s => s.Source?.Contains("app.js") == true || s.Source?.Contains("app.min.js") == true); string appJsSource = await httpClient.GetStringAsync(appJsScript.Source); List <JavaScriptHelper.Function> functions = JavaScriptHelper.Parse(appJsSource); JavaScriptHelper.Function readFunction = functions.FirstOrDefault(f => f.Name == "read"); JintEngine = new Engine(); JintEngine.Execute(readFunction.Body); } JsValue jsValue = JintEngine.Invoke("read", responseString); responseJson = Encoding.UTF8.GetString(Convert.FromBase64String(jsValue.ToString())); } return(responseJson); }
private static async Task <string> DecodeResponse(IHtmlDocument htmlDocument, HttpClient httpClient, HttpResponseMessage httpResponseMessage) { string responseString = await httpResponseMessage.Content.ReadAsStringAsync(); string responseJson = string.Empty; if (responseString.StartsWith("{")) { responseJson = responseString; } else { lock (DecodeResponseLock) { if (JintEngine == null) { IHtmlScriptElement appJsScript = htmlDocument.Scripts.FirstOrDefault(s => s.Source?.Contains("app.js") == true || s.Source?.Contains("app.min.js") == true || s.Source?.Contains("app.obf.js") == true || s.Source?.Contains("app.obf.min.js") == true ); Obfuscated = appJsScript.Source.Contains("obf."); string appJsSource = httpClient.GetStringAsync(appJsScript.Source.Replace("obf.", string.Empty)).GetAwaiter().GetResult(); List <JavaScriptHelper.Function> functions = JavaScriptHelper.Parse(appJsSource); JintEngine = new Engine(); JintEngine.Execute(functions.FirstOrDefault(f => f.Name == "read").Body); if (Obfuscated) { Func <string, string> atob = str => Encoding.Latin1.GetString(Convert.FromBase64String(str)); JintEngine.SetValue("atob", atob); JintEngine.Execute(functions.FirstOrDefault(f => f.Name == "gdidecode").Body); } } JsValue jsValue = JintEngine.Invoke("read", responseString); if (Obfuscated) { jsValue = JintEngine.Invoke("gdidecode", jsValue.ToString()); responseJson = jsValue.ToString(); } else { responseJson = Encoding.UTF8.GetString(Convert.FromBase64String(jsValue.ToString())); } } } return(responseJson); }
/// <summary> /// Constructor /// </summary> /// <param name="scriptElement"></param> public Javascript(IHtmlScriptElement scriptElement) { ScriptElement = scriptElement; Content = scriptElement.Text; }
/// <summary> /// Converts AngleSharp Script to BrowseSharp Javascript /// </summary> /// <param name="scriptElement"></param> /// <returns></returns> private Javascript ConvertToJavascript(IHtmlScriptElement scriptElement) { Javascript javascript = new Javascript(scriptElement); return(javascript); }