Skip to content

Commit

Permalink
First ALPHA-Release
Browse files Browse the repository at this point in the history
  • Loading branch information
Osiris-Team committed Sep 4, 2021
1 parent ce52547 commit 9976369
Show file tree
Hide file tree
Showing 11 changed files with 175 additions and 49 deletions.
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Headless-Browser
A headless browser for Java.
```java
HBrowser hBrowser = new HBrowser();
HWindow hWindow = hBrowser.openNewWindow().load("https://wikipedia.org");
```

## Installation
- Java 8 or higher required.
- [Click here for maven/gradle/sbt/leinigen instructions.](https://jitpack.io/#Osiris-Team/Headless-Browser)
- Make sure to watch this repository to get notified of future updates.

## IN-DEV | CONTRIBUTIONS NEEDED!
To simulate a browser nowadays we need to provide all of these web apis: https://developer.mozilla.org/en-US/docs/Web/API
Expand Down Expand Up @@ -33,9 +42,6 @@ If you don't know how to import a GitHub project, check out this guide: [Intelli
## Links
Insert_important_links_here

## Installation
Insert_installation_steps_here

## Examples
Insert_usage_examples_here

Expand Down
10 changes: 5 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.author.project</groupId>
<artifactId>project</artifactId>
<version>0.1</version>
<groupId>com.osiris.headlessbrowser</groupId>
<artifactId>Headless-Browser</artifactId>
<version>ALPHA-0.0.1</version>
<packaging>jar</packaging>

<name>My Project Name</name>
<description>A creative but also precise description.</description>
<name>Headless-Browser</name>
<description>A headless browser entirely in Java.</description>

<properties>
<java.version>8</java.version>
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/com/osiris/headlessbrowser/HBrowser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.osiris.headlessbrowser;

/**
* Headless-Browser.
*
* @author Osiris-Team
*/
public class HBrowser {

public HBrowser() {
}

public HWindow openNewWindow() {
return new HWindow();
}

public void closeWindow(HWindow HWindow) {
HWindow.close();
}
}
88 changes: 88 additions & 0 deletions src/main/java/com/osiris/headlessbrowser/HWindow.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.osiris.headlessbrowser;


import com.osiris.headlessbrowser.data.chrome.ChromeHeaders;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;

/**
* Headless-Window.
*
* @author Osiris-Team
*/
public class HWindow implements AutoCloseable {
private final JSContext jsContext = new JSContext(this);
private Document document;
private String authority;
private String javaScriptCode;

public HWindow load(String url) throws IOException {
if (!url.startsWith("http"))
url = "https://" + url;

authority = new URL(url).getAuthority();
document = Jsoup.connect(url).headers(new ChromeHeaders().get())
.get();

int scriptElements = 0;
javaScriptCode = "";
for (Element e :
document.getElementsByTag("script")) {
if (e.hasAttr("src")) {
String externalScriptUrl = e.attr("src");
if (!externalScriptUrl.startsWith("http")) {
if (externalScriptUrl.startsWith("/"))
externalScriptUrl = "https://" + authority + externalScriptUrl;
else
externalScriptUrl = "https://" + authority + "/" + externalScriptUrl;
}

javaScriptCode = javaScriptCode + "\n" +
"//\n" +
"// Following lines are external JS-Code from " + externalScriptUrl + "\n" +
"//\n" +
"\n" +
"" + new String(Jsoup.connect(externalScriptUrl).ignoreContentType(true)
.get()
.connection().response().bodyAsBytes(), StandardCharsets.UTF_8);
} else {
javaScriptCode = javaScriptCode + "\n" +
"//\n" +
"// Following lines are JS-Code from <script> number " + (scriptElements++) + "\n" +
"//\n" +
"\n" +
"" + e.data();
}

// Execute code
jsContext.eval(javaScriptCode);
}
return this;
}

public Document getDocument() {
return document;
}

public JSContext getJsContext() {
return jsContext;
}

public String getAuthority() {
return authority;
}

public String getJavaScriptCode() {
return javaScriptCode;
}

@Override
public void close() {
//TODO
}
}
15 changes: 0 additions & 15 deletions src/main/java/com/osiris/headlessbrowser/HeadlessBrowser.java

This file was deleted.

16 changes: 0 additions & 16 deletions src/main/java/com/osiris/headlessbrowser/HeadlessWindow.java

This file was deleted.

11 changes: 8 additions & 3 deletions src/main/java/com/osiris/headlessbrowser/JSContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,17 @@
import java.io.Reader;
import java.util.*;

/**
* JavaScript-Context.
*
* @author Osiris-Team
*/
public class JSContext extends AbstractScriptRunner {
private final HeadlessWindow window;
private final HWindow window;
private final Context rawContext = Context.newBuilder("js").allowAllAccess(true).build();
private final Map<JavaScriptAPI, Boolean> loadedJSWebAPIs = new HashMap<>();

public JSContext(HeadlessWindow window) {
public JSContext(HWindow window) {
this.window = window;

// APIs in this list get loaded into this JSContext in the order they were added to this list.
Expand Down Expand Up @@ -155,7 +160,7 @@ public void eval(InputStream jsCodesInputStream) throws IOException {
eval(new InputStreamReader(jsCodesInputStream));
}

public HeadlessWindow getWindow() {
public HWindow getWindow() {
return window;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.osiris.headlessbrowser.data.chrome;

import java.util.HashMap;
import java.util.Map;

public class ChromeHeaders {


public Map<String, String> get() {
Map<String, String> headers = new HashMap<>();
headers.put("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
headers.put("accept-encoding", "gzip, deflate, br");
headers.put("accept-language", "en-US,en;");
headers.put("cache-control", "max-age=0");
headers.put("referer", "https://google.com/");
headers.put("sec-ch-ua", "\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"");
headers.put("sec-ch-ua-mobile", "?1");
headers.put("sec-fetch-dest", "document");
headers.put("sec-fetch-mode", "navigate");
headers.put("sec-fetch-site", "same-origin");
headers.put("sec-fetch-user", "?1");
headers.put("upgrade-insecure-requests", "1");
headers.put("user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Mobile Safari/537.36");
return headers;
}

}
14 changes: 14 additions & 0 deletions src/test/java/com/osiris/headlessbrowser/HBrowserTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.osiris.headlessbrowser;

import org.junit.jupiter.api.Test;

import java.io.IOException;

class HBrowserTest {

@Test
void test() throws IOException {
HBrowser hBrowser = new HBrowser();
HWindow hWindow = hBrowser.openNewWindow().load("https://wikipedia.org");
}
}
5 changes: 2 additions & 3 deletions src/test/java/com/osiris/headlessbrowser/JSContextTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.osiris.headlessbrowser;

import de.undercouch.citeproc.script.ScriptRunner;
import de.undercouch.citeproc.script.ScriptRunnerException;
import org.graalvm.polyglot.Context;
import org.junit.jupiter.api.Test;
Expand All @@ -12,7 +11,7 @@ class JSContextTest {

@Test
void testCallMethods() throws ScriptRunnerException, IOException {
HeadlessBrowser browser = new HeadlessBrowser();
HBrowser browser = new HBrowser();
JSContext jsContext = browser.openNewWindow().getJsContext();
jsContext.eval("" +
"function myMethod(params) {\n" +
Expand All @@ -23,7 +22,7 @@ void testCallMethods() throws ScriptRunnerException, IOException {

@Test
void testContextWebApis() throws IOException {
HeadlessBrowser browser = new HeadlessBrowser();
HBrowser browser = new HBrowser();
JSContext jsContext = browser.openNewWindow().getJsContext();
jsContext.eval("console.log('hi!');");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package com.osiris.headlessbrowser.javascript;

import com.osiris.headlessbrowser.HeadlessBrowser;
import com.osiris.headlessbrowser.HBrowser;
import org.junit.jupiter.api.Test;

import java.io.IOException;

import static org.junit.jupiter.api.Assertions.*;

class JS_API_ConsoleTest {

@Test
void test() throws IOException {
new HeadlessBrowser().openNewWindow().getJsContext()
new HBrowser().openNewWindow().getJsContext()
.eval("console.log('hello');");
}
}

0 comments on commit 9976369

Please sign in to comment.