rewrote the api in python
This commit is contained in:
parent
b6ef7be08f
commit
32db175944
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,2 @@
|
|||||||
blocks.db
|
blocks.db
|
||||||
apis/node_modules
|
__pycache__/
|
||||||
|
@ -5,8 +5,6 @@ Used to see which instances block yours.
|
|||||||
## software used:
|
## software used:
|
||||||
|
|
||||||
- python 3.10.2
|
- python 3.10.2
|
||||||
- [node v17.6.0](https://github.com/nodesource/distributions/blob/master/README.md#installation-instructions)
|
|
||||||
- [yarn 1.22.17](https://classic.yarnpkg.com/en/docs/install#debian-stable)
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@ -25,13 +23,6 @@ sudo -Hu fba cp blocks_preloaded.db blocks.db
|
|||||||
sudo cp services/* /etc/systemd/system
|
sudo cp services/* /etc/systemd/system
|
||||||
```
|
```
|
||||||
|
|
||||||
### Install node packages
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd apis
|
|
||||||
sudo -Hu fba yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
### start the services
|
### start the services
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
47
api.py
Normal file
47
api.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
from fastapi import FastAPI
|
||||||
|
import sqlite3
|
||||||
|
|
||||||
|
base_url = ""
|
||||||
|
app = FastAPI(docs_url=base_url+"/docs", redoc_url=base_url+"/redoc")
|
||||||
|
|
||||||
|
@app.get(base_url+"/info")
|
||||||
|
def info():
|
||||||
|
conn = sqlite3.connect("blocks.db")
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("select (select count(domain) from instances), (select count(domain) from instances where software in ('pleroma', 'mastodon')), (select count(blocker) from blocks)")
|
||||||
|
known, indexed, blocks = c.fetchone()
|
||||||
|
c.close()
|
||||||
|
return {
|
||||||
|
"known_instances": known,
|
||||||
|
"indexed_instances": indexed,
|
||||||
|
"blocks_recorded": blocks,
|
||||||
|
"source_code": "https://gitlab.com/EnjuAihara/fedi-block-api",
|
||||||
|
}
|
||||||
|
|
||||||
|
@app.get(base_url+"/domain/{domain}")
|
||||||
|
def blocked(domain: str):
|
||||||
|
conn = sqlite3.connect("blocks.db")
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("select blocker, block_level from blocks where blocked = ?", (domain,))
|
||||||
|
blocks = c.fetchall()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
result = {
|
||||||
|
"reject": [],
|
||||||
|
"media_removal": [],
|
||||||
|
"federated_timeline_removal": [],
|
||||||
|
"media_nsfw": [],
|
||||||
|
"quarantined_instances": [],
|
||||||
|
"report_removal": [],
|
||||||
|
"followers_only": [],
|
||||||
|
"accept": [],
|
||||||
|
"avatar_removal": [],
|
||||||
|
"banner_removal": [],
|
||||||
|
"reject_deletes": [],
|
||||||
|
}
|
||||||
|
|
||||||
|
for domain, block_level in blocks:
|
||||||
|
result[block_level].append(domain)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
@ -1,198 +0,0 @@
|
|||||||
const app = require("express")();
|
|
||||||
const sqlite3 = require('sqlite3').verbose();
|
|
||||||
const PORT = 8070;
|
|
||||||
const base_url = ""
|
|
||||||
|
|
||||||
const db = new sqlite3.Database("../blocks.db", sqlite3.OPEN_READONLY, err => {
|
|
||||||
if (err)
|
|
||||||
return console.error(err.message);
|
|
||||||
});
|
|
||||||
|
|
||||||
app.listen(PORT, "127.0.0.1", () => console.log("API started on http://127.0.0.1:"+PORT));
|
|
||||||
app.get(base_url+"/", (req, res) => {
|
|
||||||
res.status(400).json({"message":"use /blocker, /blocked or /info endpoint"});
|
|
||||||
});
|
|
||||||
app.get(base_url+"/blocker", (req, res) => {
|
|
||||||
res.status(400).json({"message":"insert a domain"});
|
|
||||||
});
|
|
||||||
app.get(base_url+"/blocked", (req, res) => {
|
|
||||||
res.status(400).json({"message":"insert a domain"});
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get(base_url+"/info", (req, res) => {
|
|
||||||
db.all("select (select count(domain) from instances) as known, (select count(domain) from instances where software in ('pleroma', 'mastodon')) as indexed, (select count(blocker) from blocks) as blocks", (err, result) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).json({"message": err});
|
|
||||||
console.log(err.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
res.status(200).json({
|
|
||||||
"known_instances": result[0]["known"],
|
|
||||||
"indexed_instances": result[0]["indexed"],
|
|
||||||
"blocks_recorded": result[0]["blocks"],
|
|
||||||
"source_code": "https://gitlab.com/EnjuAihara/fedi-block-api",
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function get_blocker(blocker, _callback, _err_callback) {
|
|
||||||
db.all("select blocked, block_level from blocks where blocker = ?", blocker, (err, result) => {
|
|
||||||
if (err) {
|
|
||||||
_err_callback(err);
|
|
||||||
console.log(err.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
reject = [];
|
|
||||||
media_removal = [];
|
|
||||||
federated_timeline_removal = [];
|
|
||||||
media_nsfw = [];
|
|
||||||
quarantined_instances = [];
|
|
||||||
report_removal = [];
|
|
||||||
followers_only = [];
|
|
||||||
accept = [];
|
|
||||||
avatar_removal = [];
|
|
||||||
banner_removal = [];
|
|
||||||
reject_deletes = [];
|
|
||||||
|
|
||||||
result.map(block => {
|
|
||||||
switch(block.block_level) {
|
|
||||||
case "reject":
|
|
||||||
reject.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "media_removal":
|
|
||||||
media_removal.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "federated_timeline_removal":
|
|
||||||
federated_timeline_removal.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "media_nsfw":
|
|
||||||
media_nsfw.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "quarantined_instances":
|
|
||||||
quarantined_instances.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "report_removal":
|
|
||||||
report_removal.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "followers_only":
|
|
||||||
followers_only.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "accept":
|
|
||||||
accept.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "avatar_removal":
|
|
||||||
avatar_removal.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "banner_removal":
|
|
||||||
banner_removal.push(block.blocked);
|
|
||||||
break;
|
|
||||||
case "reject_deletes":
|
|
||||||
reject_deletes.push(block.blocked);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
_callback({
|
|
||||||
reject,
|
|
||||||
media_removal,
|
|
||||||
federated_timeline_removal,
|
|
||||||
media_nsfw,
|
|
||||||
quarantined_instances,
|
|
||||||
report_removal,
|
|
||||||
followers_only,
|
|
||||||
accept,
|
|
||||||
avatar_removal,
|
|
||||||
banner_removal,
|
|
||||||
reject_deletes,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_blocked(blocked, _callback, _err_callback) {
|
|
||||||
db.all("select blocker, block_level from blocks where blocked = ?", blocked, (err, result) => {
|
|
||||||
if (err) {
|
|
||||||
_err_callback(err);
|
|
||||||
console.log(err.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
reject = [];
|
|
||||||
media_removal = [];
|
|
||||||
federated_timeline_removal = [];
|
|
||||||
media_nsfw = [];
|
|
||||||
quarantined_instances = [];
|
|
||||||
report_removal = [];
|
|
||||||
followers_only = [];
|
|
||||||
accept = [];
|
|
||||||
avatar_removal = [];
|
|
||||||
banner_removal = [];
|
|
||||||
reject_deletes = [];
|
|
||||||
|
|
||||||
result.map(block => {
|
|
||||||
switch(block.block_level) {
|
|
||||||
case "reject":
|
|
||||||
reject.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "media_removal":
|
|
||||||
media_removal.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "federated_timeline_removal":
|
|
||||||
federated_timeline_removal.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "media_nsfw":
|
|
||||||
media_nsfw.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "quarantined_instances":
|
|
||||||
quarantined_instances.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "report_removal":
|
|
||||||
report_removal.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "followers_only":
|
|
||||||
followers_only.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "accept":
|
|
||||||
accept.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "avatar_removal":
|
|
||||||
avatar_removal.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "banner_removal":
|
|
||||||
banner_removal.push(block.blocker);
|
|
||||||
break;
|
|
||||||
case "reject_deletes":
|
|
||||||
reject_deletes.push(block.blocker);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
_callback({
|
|
||||||
reject,
|
|
||||||
media_removal,
|
|
||||||
federated_timeline_removal,
|
|
||||||
media_nsfw,
|
|
||||||
quarantined_instances,
|
|
||||||
report_removal,
|
|
||||||
followers_only,
|
|
||||||
accept,
|
|
||||||
avatar_removal,
|
|
||||||
banner_removal,
|
|
||||||
reject_deletes,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
app.get(base_url+"/blocker/:domain", (req, res) => {
|
|
||||||
const {domain} = req.params;
|
|
||||||
get_blocker(
|
|
||||||
domain,
|
|
||||||
result => res.status(200).json(result),
|
|
||||||
err => res.status(500).json({"message": err}),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get(base_url+"/blocked/:domain", (req, res) => {
|
|
||||||
const {domain} = req.params;
|
|
||||||
get_blocked(
|
|
||||||
domain,
|
|
||||||
result => res.status(200).json(result),
|
|
||||||
err => res.status(500).json({"message": err}),
|
|
||||||
);
|
|
||||||
});
|
|
@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"dependencies": {
|
|
||||||
"express": "^4.17.3",
|
|
||||||
"sqlite3": "^5.0.2"
|
|
||||||
}
|
|
||||||
}
|
|
1186
apis/yarn.lock
1186
apis/yarn.lock
File diff suppressed because it is too large
Load Diff
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
beautifulsoup4
|
||||||
|
fastapi
|
||||||
|
uvicorn
|
@ -6,8 +6,8 @@ Type=simple
|
|||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=10
|
RestartSec=10
|
||||||
User=fba
|
User=fba
|
||||||
WorkingDirectory=/opt/fedi-block-api/apis
|
WorkingDirectory=/opt/fedi-block-api
|
||||||
ExecStart=node fedi_block_api.js
|
ExecStart=uvicorn api:app --port 8069
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
Loading…
x
Reference in New Issue
Block a user