Pull to refresh
4K+
5
Алексей Вячеславович Мухин@Hiddenath

User

11
Rating
1
Subscribers
Send message

Благодарю

Вообще не планировал, редко встречаю это формат, чаще встречаю дежавю. По мне, самый лучший формат для книги fb2, так как в нем есть разметка, выделение глав, форматирование текста, и даже поддержка картинок, последнее я еще не реализовал. Если это актуально я попробую сделать под него парсер.

Спасибо

Развернуть очень просто, скачиваете, устанавливаете питон, ничего дополнительно не нужно, и командой python3 server.py сервер создастся и в командной строке появится ссылка для открытия интерфейса.

Вам добавить опцию его отключения? Мне просто приятно зрительно, так как делал под себя.

На прямую с апи взаимодействовать не придется, это что бы веб интерфейс мог сохранять не только в память браузера, но и локально на сервер.

Можно положить в папку, можно через кнопку на странице библиотеки добавить или перетащить на страницу библиотеки

Не благодарите, вот парсер на питоне, вывводит все смс. думаю дальше смодите из запомните в переменную и новые пересылать в телеграм, как делаю я )

Скрытый текст
import re
import requests
from bs4 import BeautifulSoup

SMS_URL = "http://10.20.30.7/default/en_US/tools.html?type=sms_inbox"
USERNAME = "admin"
PASSWORD = "admin"

def fetch_page():
    response = requests.get(
        SMS_URL,
        auth=(USERNAME, PASSWORD),
        timeout=10
    )
    response.raise_for_status()
    return response.text

def decode_mojibake(text):
    """Исправляет двойное кодирование (mojibake)"""
    try:
        # Сначала пробуем как Latin-1, затем как UTF-8
        return text.encode('latin1').decode('utf-8')
    except:
        return text

def extract_sms_from_js(html):
    # Ищем все вызовы sms_row_insert
    pattern = r'sms_row_insert\((\w+_sms_store),\s*sms,\s*pos,\s*(\d+)\);'
    matches = re.findall(pattern, html)

    messages = []
    for store_id, line in matches:
        # Ищем массив sms перед вызовом функции
        start = html.rfind('sms= [', 0, html.find(f'sms_row_insert({store_id}'))
        if start == -1:
            continue

        end = html.find('];', start) + 2
        sms_array_str = html[start:end]

        # Парсим массив SMS
        try:
            # Убираем sms= и ; в конце
            array_content = sms_array_str[5:-2].strip()

            # Используем регулярное выражение для извлечения элементов массива
            items = re.findall(r'"(.*?)"', array_content)

            for item in items:
                if not item or item == '""':
                    continue

                # Разбиваем по запятым (максимум 2 разбиения)
                parts = item.split(',', 2)
                if len(parts) >= 3:
                    time_part = parts[0].strip()
                    sender = parts[1].strip()
                    text = parts[2].strip()

                    # Исправляем кодировку
                    time_part = decode_mojibake(time_part)
                    sender = decode_mojibake(sender)
                    text = decode_mojibake(text)

                    # Дополнительная очистка текста
                    text = text.replace('\\n', '\n')
                    text = text.replace('\\r', '')
                    text = text.replace('\\t', ' ')

                    messages.append({
                        'line': line,
                        'time': time_part,
                        'from': sender,
                        'text': text
                    })
        except Exception as e:
            print(f"Ошибка парсинга массива SMS: {e}")

    return messages

def main():
    try:
        html = fetch_page()

        # Сохраняем для отладки
        with open("goip_sms_page.html", "w", encoding="utf-8") as f:
            f.write(html)

        messages = extract_sms_from_js(html)

        print(f"\nНайдено SMS: {len(messages)}\n")

        for i, sms in enumerate(messages, 1):
            print(f"SMS #{i}")
            print(f"Линия: {sms['line']}")
            print(f"Время: {sms['time']}")
            print(f"От: {sms['from']}")
            print(f"Текст: {sms['text']}")
            print("-" * 50)

    except Exception as e:
        print(f"Ошибка: {e}")

if __name__ == "__main__":
    main()



И подарок, парсер звонков, что бы приходили уведомления кто звонит... а то мой mikopbx не может считать номер звонящено....

Скрытый текст
import requests
from bs4 import BeautifulSoup
import time
import re

# Конфигурация
GOIP_URL = "http://10.20.30.7/default/en_US/status.html"
USERNAME = "admin"
PASSWORD = "admin"

def get_status():
    # Получаем страницу с базовой аутентификацией
    response = requests.get(GOIP_URL, auth=(USERNAME, PASSWORD))

    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')

        # Находим все строки с статусами линий (l1_line_state, l2_line_state, и т.д.)
        for i in range(1, 5):  # Для линий 1-4
            status_cell = soup.find('td', {'id': f'l{i}_line_state'})
            if status_cell:
                status = status_cell.get_text(strip=True)
                print(f"Линия {i}: {status}")

                # Если статус содержит "INCOMING", извлекаем номер
                if "INCOMING:" in status:
                    # Извлекаем номер с помощью регулярного выражения
                    caller_number = re.search(r'INCOMING:(\d+)', status).group(1)
                    caller_number = f"+{caller_number}"
                    print(f"Входящий звонок на линии {i} от: {caller_number}")
                    # Здесь можно добавить отправку уведомления
                    # send_notification(f"Входящий звонок на линии {i} от: {caller_number}")
            else:
                print(f"Не удалось найти статус для линии {i}")
    else:
        print(f"Ошибка доступа. Статус: {response.status_code}")
    

def main():
    while True:
        print("\n--- Проверка статуса ---")
        get_status()
        time.sleep(1)  # Пауза в 1 секунду

if __name__ == "__main__":
    main()

Ознакомился, интересная вешь, мне вот курсор не зашел, и этот тоже не нравиться, что недает свои локальные модели использовать... модет кто подскажет, подобные решения, но с вожножностью подключать свои локальные и глобальные ии апи. мне вот очень поравилось работать с чери студио, там много моделий, может как мост служить между моделями, проверять накакой железке модел как работает, проверять как проходит обучение... не всегда подхотят готовые решения и да и не хочется раскрывать ии свои базы, не хочу безплатно обучать чужие модели и учить их искать ошибки.

Да, так мы сэкономим десятки гигов, но просчеты будут у того, что запустил. Думаю и запуск будет очень долгий из-за заполнения графической памяти из сети, скорость запуска сильно зависит от скорости интерфейса, запуск на мак студии с 128 гигов оперативы быстрее чем на pci5.0x16 ada6000, и в разы быстрее если pci3.0x16 ada6000. Это все касается только LM Studio. Скорость работы, честно не сравнивал. На мак студии студии запучшена более жирная модель. Так как там 80 гигов выделяется под видео память, а у ada6000 48 гигов.

LM Studio сегодня меня довел до ручки, и перешел на Ollama, интерфейс сделали очень красивый, я в восторге... oss-120 отлично себя чувствует на мак студио 128Гб, использую удаленно, это значительно дешевле, чем покупать видео карту с таким количество памяти. возьмите на заметку. Если подскажите будет очень классно, Ollama заставить использовать облачные или уделанные модели. Локальную LM Studio можно подключить удаленной LM Studio и использовать в локальной сети всем желающим, хочу повторить данный опыт с Ollama

Information

Rating
756-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Системный администратор, DevOps-инженер
Средний
From 300,000 ₽
Python
Высоконагруженные системы
SolidWorks
Компас 3d
Mikrotik
Администрирование серверов
Администрирование сетей
Системы виртуализации
SIP