# cat /etc/init.d/nfqws
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=91
PROG=/etc/zapret/nfqws/nfqws
start_service() {
procd_open_instance
procd_set_param command "$PROG"
procd_append_param command --dpi-desync=fake
procd_append_param command --dpi-desync-fooling=md5sig,badseq
procd_append_param command --dpi-desync-split-pos=1
procd_append_param command --dpi-desync-repeats=12
procd_append_param command --dpi-desync-ttl=4
procd_append_param command --qnum=200
procd_append_param command --hostlist=/etc/zapret/nfqws/youtube.txt
# procd_append_param command --hostlist=/tmp/domains-export.txt
procd_set_param stdout 1 # forward stdout of the command to logd
procd_set_param stderr 1 # same for stderr
procd_close_instance
}
chain zapret_lan_hook {
type filter hook forward priority mangle;
# iifname {"br-lan"} \
ip daddr != {0.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 100.64.0.0/10, 169.254.0.0/16, 224.0.0.0/3, 255.255.255.255/32} \
tcp dport {80, 443} ct original packets lt 8 counter queue flags bypass to 200 comment "zapret IPv4 443 tcp"
# iifname {"br-lan"} \
ip6 daddr != {::ffff:0:0/96, fc00::/7, fe80::/10, ff00::/8} \
tcp dport {80, 443} ct original packets lt 8 counter queue flags bypass to 200 comment "zapret IPv6 443 tcp"
# iifname {"br-lan"} \
ip daddr != {0.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 100.64.0.0/10, 169.254.0.0/16, 224.0.0.0/3, 255.255.255.255/32} \
udp dport 443 ct original packets lt 8 counter queue flags bypass to 200 comment "zapret IPv4 443 udp"
# iifname {"br-lan"} \
ip6 daddr != {::ffff:0:0/96, fc00::/7, fe80::/10, ff00::/8} \
udp dport 443 ct original packets lt 8 counter queue flags bypass to 200 comment "zapret IPv6 443 udp"
}
config include 'zapret'
option type 'nftables'
option path '/etc/zapret/zapret.nft'
option position 'table-post'
option enabled '1'
youtube.com
youtu.be
googlevideo.com
googleapis.com
gvt1.com
ggpht.com
ytimg.com
youtube-nocookie.com
play.google.com
video.google.com
youtube-ui.l.google.com
youtubeeducation.com
youtubekids.com
from collections import Counter
from itertools import chain
data = [
(1, 'old;white'),
(2, 'old;green'),
(3, 'old;brown'),
(4, 'new;green'),
]
# генерирует последовательность ['old', 'white'], ['old', 'green'], ...
split_generator = (item[1].split(';') for item in data)
# генерирует последовательность 'old', 'white', 'old', 'green', ...
property_generator = chain.from_iterable(split_generator)
# исправляет регистр и удаляет пробелы - можно убрать, если не надо
property_fixed_generator = (item.strip().lower() for item in property_generator)
# поглощает данные из генераторов и считает вхождения
count = Counter(property_fixed_generator)
print(count) # Counter({'old': 3, 'green': 2, 'white': 1, 'brown': 1, 'new': 1})
import os
# выходим на верхний уровень
parentdir = os.path.dirname(os.path.dirname(__file__))
# и добавляем его к путям поиска
os.sys.path.insert(0,parentdir)
# после чего можем использовать импорт по вложенному пути
import module_name.module.ModuleFileOne
audiowaveform -i test.mp3 -o test.png -z 10000 --waveform-style bars --bar-width 3 --bar-gap 2 --bar-style rounded --no-axis-labels --amplitude-scale 1.25 --background-color 333333 --waveform-color BFBFBF
from typing import NamedTuple
class Result(NamedTuple):
text: str # текст запроса
success: bool # успешен ли запрос
status: str # статус
async def check_text(text: str) -> Result:
url = f'https://сайт.com/?query={text}'
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status != 200:
return Result(text=text, success=False, status='Не удалось определить результат')
html = await response.text()
soup = BeautifulSoup(html, 'html.parser')
status_element = soup.find('div', class_='table-block')
if not status_element:
return Result(text=text, success=False, status='Не удалось определить результат')
status_text = status_element.get_text().strip()
# тебе нужно будет решить, когда запрос был успешен (True), а когда нет (False)
if "ok" in status_text:
return Result(text=text, success=True, status='Можно')
elif "no" in status_text:
return Result(text=text, success=False, status='Данный вариант недоступен')
elif "no1" in status_text:
return Result(text=text, success=True, status='Можно под заказ')
else:
return Result(text=text, success=False, status='Неизвестно')
result = await check_text(text)
if result.success:
... # реагируем на успешный запрос
logger.info('%s: %s', result.text, result.status)
else:
... # реагируем на неудачный запрос
logger.info('%s: %s', result.text, result.status)
[Unit]
Description=My Script Service
After=multi-user.target
[Service]
User=user # Имя пользователя, от имени которого будет запускаться команда, указанная в ExecStart
WorkingDirectory=/home/user/program # Директория, в которую будет осуществлён переход перед запуском
ExecStart=/home/user/program/venv/bin/python /home/user/program/webui.py
Restart=always # Всегда перезапускать скрипт при его падениях
[Install]
WantedBy=multi-user.target
/etc/systemd/system
с расширением .service
, например, /etc/systemd/system/my_program.service
.activate
для активации виртуального окружения, но вместо этого указывается полный путь к интерпретатору Python внутри этого виртуального окружения.WorkingDirectory
.Unit
в качестве After
задайте network-online.target
вместо multi-user.target
:After=network-online.target
sudo systemctl daemon-reload
sudo systemctl enable --now my_program.service
def __getattribute__(self, name):
print(name)
return super().__getattribute__(name)
@router.message(F.text == "/lesmat")
async def lesmat(msg: Message):
await msg.answer_photo(FSInputFile("lesmat/lit1.png"))
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# Откройте исходное изображение
img = Image.open('3.png')
# Создайте копию изображения
img_copy = img.copy()
# Создайте изображение с текстом на черном фоне
mask = Image.new('L', img.size, 0)
draw = ImageDraw.Draw(mask)
font = ImageFont.truetype('3.ttf', size=54)
text_position = (297, 553)
draw.text(text_position, 'Your Text', font=font, fill=255)
# Размойте маску
blurred_mask = mask.filter(ImageFilter.GaussianBlur(10)) # Измените радиус размытия по вашему усмотрению
# Примените размытие к фону
img_copy.paste(img_copy.filter(ImageFilter.GaussianBlur(10)), (0, 0), blurred_mask)
# Наложите текст на размытый фон
draw = ImageDraw.Draw(img_copy)
draw.text(text_position, 'Your Text', font=font, fill=('#00bc44'))
# Сохраните результат
img_copy.save('output.png')