Added link requesting & better captcha

This commit is contained in:
Filip Znachor 2023-02-06 21:43:07 +01:00
parent a04efa5042
commit 22b5017b8f
5 changed files with 40 additions and 31 deletions

View File

@ -1,26 +1,34 @@
# Ulož.to streamer
# Ulož.to Rychle
Stream ulož.to video content without downloading
Program na streamování a stahování obsahu z Ulož.to vysokou rychlostí.
## Instalation
## Instalace
### Python libraries
### Captcha solver
Install all python libraries for `captcha.py`:
Pro automatické řešení captchi používáme script `captcha.py`, pro nějž je potřeba nainstalovat Python a následující knihovny.
```
numpy, requests, tensorflow, PIL
```sh
pip install requests tflite_runtime Pillow
```
### Install node modules
Může se stát, že v nejnovější verzi Pythonu není **tflite_runtime** dostupný. Doporučujeme proto nainstalovat např. Python 3.9 a vytvořit spustitelný soubor pomocí programu **pyinstaller**.
```sh
pyinstaller captcha.py --onefile
```
### Instalce node modulů
Pro spuštění projektu je potřeba nainstalovat **Node.js** a následně potřebné knihovny pomocí tohoto příkazu.
```sh
npm i --save
```
### Setup Tor proxy
### Nastavení Tor proxy
Set `ControlPort`, `SocksPort` and `HashedControlPassword` in /etc/tor/torrc:
V konfiguračním souboru `/etc/tor/torrc` nastavte hodnoty `ControlPort`, `SocksPort` a `HashedControlPassword`.
```
SocksPort 9050
@ -28,7 +36,7 @@ ControlPort 9051
HashedControlPassword 16:872230D6EA809D4760AD5894ADB7A5A07191882EBCD188378544794F8F
```
Password can be generated with:
Hesla ke control portu je možno generovat následovně.
```
tor --hash-password giraffe

View File

@ -2,7 +2,8 @@ import numpy
import requests
import string
import sys
import tensorflow
#import tensorflow
import tflite_runtime.interpreter as tflite
from io import BytesIO
from PIL import Image
@ -16,7 +17,8 @@ def decode(li) -> string:
def solve(url: string) -> string:
interpreter = tensorflow.lite.Interpreter(
# for tensorflow tensorflow.lite.Interpreter
interpreter = tflite.Interpreter(
model_content=open("./model.tflite", "rb").read())
u = requests.get(url)
raw_data = u.content
@ -48,6 +50,6 @@ def solve(url: string) -> string:
try:
result = solve(sys.argv[1])
print(result, end = "")
print(result, end="")
except:
pass
pass

View File

@ -92,7 +92,7 @@ export class Links {
async captcha(url: string): Promise<string> {
return new Promise((resolve) => {
exec("python3 captcha.py "+url, (e, o) => {
exec("./captcha "+url, (e, o) => {
resolve(o);
});
});

View File

@ -5,9 +5,9 @@ import { random_int } from "./tools";
let links = new Links;
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let unixtime = () => {
return new Date().getTime()/1000;
};
export class UrlPool {
@ -20,11 +20,11 @@ export class UrlPool {
valid_to: Date;
generating = false;
last_generated: number = unixtime();
downloaders: Downloader[] = [];
total_size: number = 0;
is_direct = false;
ready = false;
constructor(storage: UrlPoolStorage, id: string) {
this.valid_to = new Date();
@ -53,7 +53,7 @@ export class UrlPool {
this.total_size = parseInt(r.headers["content-range"].split("/")[1]);
this.return(url[0]);
this.ready = true;
this.generating = true;
return true;
}
@ -75,6 +75,8 @@ export class UrlPool {
if(url) {
clearInterval(check);
complete(url);
} else {
this.request_generation();
}
}, 100);
});
@ -99,16 +101,13 @@ export class UrlPool {
return count ? available.slice(0, count) : available;
}
async start_generation() {
this.generating = true;
while(this.urls.length < 15 && this.generating) {
console.log(this.id, "| new link:", (await this.generate()) ? true : false);
await sleep(2000);
}
this.generating = false;
async request_generation() {
if(!this.generating || this.last_generated+10 > unixtime()) return;
console.log(this.id, "| new link:", (await this.generate()) ? true : false);
}
async generate(): Promise<string | undefined> {
this.last_generated = unixtime();
try {
let link = await (this.is_direct ? links.direct_link(this.id) : links.captcha_link(this.id));
if(link) this.add(link);
@ -159,7 +158,7 @@ export class UrlPoolStorage {
let pool = new UrlPool(this, id);
let check = await pool.init();
if(!check) return undefined;
pool.start_generation();
pool.request_generation();
this.pools[id] = pool;
return pool;
}

View File

@ -30,9 +30,9 @@ export class Webserver {
total: p.urls.length,
available: p.available().length,
generating: p.generating,
urls: p.urls,
total_size: p.total_size,
downloaders: p.downloaders.length
downloaders: p.downloaders.length,
urls: p.urls
}
}));
res.end();