added file

This commit is contained in:
Godnessli committed 2026-10-18 15:44:55 +03:00
1 parent cc433bd065
commit c07cd997c9
10 files changed
+754 -1

No files matched your search

+117
View File
@@ -0,0 +1,117 @@
import os
import random
import subprocess
from bs4 import BeautifulSoup
class SCP:
__ANUBIS = os.path.expanduser("~/.nix-profile/bin/anubis-fetch")
def __init__(self, num = None):
self.__scp = {
"title" : "SCP Foundation"
}
self_num = False
if num != None:
self_num = True
while self.__scp["title"] == "SCP Foundation":
if num == None:
num = random.randint(1, 4000)
url = ""
if num == 1:
self.__scp = {
"title" : "SCP-001",
"text" : "ПРИВЕДЁННЫЕ НИЖЕ МАТЕРИАЛЫ ЗАСЕКРЕЧЕНЫ\nПРИКАЗОМ АДМИНИСТРАТОРА\nСОВЕРШЕННО СЕКРЕТНО"
}
return
if num < 10:
url = f"https://scpfoundation.net/scp-00{num}"
elif num < 100:
url = f"https://scpfoundation.net/scp-0{num}"
else:
url = f"https://scpfoundation.net/scp-{num}"
print(url)
scp_html = self.__fetch_with_anubis(url)
self.__scp = self.__parse_html(scp_html)
if self_num:
break
else:
num = None
def get_text(self) -> str:
return f"{self.__scp["title"]}\n{self.__scp["text"]}"
@staticmethod
def get_classified() -> str:
return "Основные классы SCP:\n" \
"«Безопасный» — это аномалии, которые проще всего содержать без последствий.\n" \
"«Евклид» — относятся недостаточно изученные или изначально непредсказуемые аномалии, надёжное" \
"содержание которых не всегда возможно или требует бо́льших затрат, чем на содержание «безопасных».\n" \
"Вторичные классы:\n" \
"«Кетер» — это аномалии, постоянное или надёжное содержание которых тяжело реализуемо и сопряжено со сложными процедурами сдерживания.\n" \
"«Таумиэль» применяются Фондом исключительно для содержания других аномалий.\n" \
"«Аполлион» являются аномалиями, которые или невозможно содержать, и они неминуемо нарушат" \
"условия содержания, или предполагается развитие событий по схожему сценарию.\n" \
"«Архонт» являются аномалиями, чье содержание теоретически возможно, но по каким-либо причинам их лучше не содержать.\n" \
"«Тикондерога» невозможно содержать, но в этом и нет необходимости." \
"Эти аномалии схожи с объектами класса «Архонт» в том, что их содержание не обязательно," \
"но отличны тем, что на данный момент для их содержания у Фонда недостаточно ресурсов и " \
"компетенции из-за повсеместной распространённости таких аномалий по Земле." \
"При этом их существование или аномальная природа непостижимы для широких масс. "
def __fetch_with_anubis(self, url: str) -> str:
try:
result = subprocess.run(
[self.__ANUBIS, url],
capture_output = True, text = True, check = True
)
return result.stdout
except subprocess.CalledProcessError as e:
print(f"anubis-fetch завершился с кодом {e.returncode}: {e.stderr}")
raise
except subprocess.TimeoutExpired:
print("anubis-fetch не успел завершиться за отведённое время")
raise
def __parse_html(self, text: str) -> dict:
soup = BeautifulSoup(text, "lxml")
for tag in soup(["script", "style", "nostyle"]):
tag.decompose()
content = soup.find(id = "page-content") or soup.find("div", id = "content")
parse_text = content.get_text("\n", strip = True) if content else None
if parse_text:
marker = "Класс объекта:"
indx = parse_text.find(marker)
if indx != -1:
parse_text = parse_text[indx:]
else:
marker = "Объект №:"
indx = parse_text.find(marker)
if indx != -1:
parse_text = parse_text[indx:]
marker = "«\n"
indx = parse_text.find(marker)
if indx != -1:
parse_text = parse_text[:indx]
return {
"title" : soup.title.string.strip() if soup.title else None,
#"heading" : content.find("h1").get_text(strip = True) if content and content.find("h1") else None,
"text" : parse_text
}