BitByByte's Forum.

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Обязательно прочти правила форума!

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.

Сообщения - dsalin

Страницы: [1]
1
Мне грок написал вот такой вот плагин для получения заголовков урл ссылок, отправляемых в ирц чатах на хэксчате
Вот его код!# -*- coding: utf-8 -*-
"""
Название:   UrlTitle.py
Описание:   Показывает заголовок страницы при отправке любой ссылки в чат
Версия:     0.4
Автор:      адаптация под 2025–2026
"""

__module_name__        = "UrlTitle"
__module_version__     = "0.4"
__module_description__ = "Показывает <title> страницы при отправке ссылок"

import hexchat
import re
import urllib.request
import urllib.error
import html
import socket

# Настройки — можно менять
TIMEOUT       = 6          # секунд на попытку скачать страницу
MAX_TITLE_LEN = 120        # обрезаем слишком длинные заголовки
USER_AGENT    = "HexChat-UrlTitle/0.4 (compatible; +https://example.com)"

# Самое простое регулярное выражение для url (http(s)://...)
URL_RE = re.compile(r'(https?://[^\s<>"\']+)', re.IGNORECASE)

# Черный список доменов, которые обычно не нужны / долго отвечают / не html
BLACKLIST = {
    "youtu.be", "youtube.com", "youtu.be", "twitter.com", "x.com",
    "t.me", "discord.com", "discordapp.com", "github.com", ".png", ".jpg",
    ".jpeg", ".gif", ".webp", ".pdf", ".zip", ".exe"
}

def is_probably_html(url):
    low = url.lower()
    for bad in BLACKLIST:
        if bad in low:
            return False
    return True

def get_title(url):
    try:
        req = urllib.request.Request(
            url,
            headers={'User-Agent': USER_AGENT}
        )
        with urllib.request.urlopen(req, timeout=TIMEOUT) as response:
            if response.getcode() != 200:
                return None

            content_type = response.headers.get('Content-Type', '').lower()
            if 'text/html' not in content_type:
                return None

            data = response.read(8192 * 2).decode('utf-8', errors='replace')
            m = re.search(r'<title[^>]*>(.*?)</title>', data, re.IGNORECASE | re.DOTALL)
            if m:
                title = html.unescape(m.group(1).strip())
                title = ' '.join(title.split())  # убираем лишние пробелы
                if len(title) > MAX_TITLE_LEN:
                    title = title[:MAX_TITLE_LEN-3] + "..."
                return title
            return None
    except (urllib.error.HTTPError, urllib.error.URLError, socket.timeout,
            UnicodeDecodeError, ConnectionResetError, OSError):
        return None

def on_message(word, word_eol, event_name, attrs=None):
    # word[0]  — ник
    # word[1]  — текст сообщения
    text = word[1]

    urls = URL_RE.findall(text)
    if not urls:
        return hexchat.EAT_NONE

    shown = set()

    for url in urls:
        if url in shown:
            continue

        # Пропускаем очевидные не-html ссылки
        if not is_probably_html(url):
            continue

        title = get_title(url)
        if title:
            # Показываем в текущем канале
            hexchat.prnt(f"→ Title: \00302{title}\003\t({url})")
            shown.add(url)

    return hexchat.EAT_NONE

def unload_cb(userdata):
    hexchat.prnt(f"→ {__module_name__} выгружен")
    return

# ────────────────────────────────────────────────
# Регистрируем хуки на все типы сообщений
# ────────────────────────────────────────────────

for event in (
    "Channel Message",
    "Your Message",           # твои сообщения
    "Channel Msg Hilight",
    "Private Message",
    "Private Message to",
):
    hexchat.hook_print(event, on_message, event, priority=hexchat.PRI_LOW)

hexchat.hook_unload(unload_cb)

hexchat.prnt(f"→ Плагин {__module_name__} {__module_version__} загружен")

2
    Обязательно стоит добавить категорию "Софт".
    Так уже есть "Компьютерные программы".
    Тогда можно вот эти категории добавить:
    • Литература
    • Музыка
    [/list]

    3
    Обязательно стоит добавить категорию "Софт".

    5
    Сильно на это надеюсь. Мне такие форумы как этот сильно нравятся.

    7
    <?php

    session_start
    ();

    $data_dir="data";
    $users_file="$data_dir/users.txt";
    $polls_file="$data_dir/polls.txt";
    $votes_dir="$data_dir/votes";

    if(!
    file_exists($data_dir)) mkdir($data_dir);
    if(!
    file_exists($votes_dir)) mkdir($votes_dir);
    if(!
    file_exists($users_file)) file_put_contents($users_file,"");
    if(!
    file_exists($polls_file)) file_put_contents($polls_file,"");

    $a=isset($_GET["a"])?$_GET["a"]:"";

    function 
    head($title){
    echo 
    "<html><head><title>$title</title></head><body>";
    echo 
    "<table border=1 width=700 align=center><tr><td>";
    }

    function 
    foot(){
    echo 
    "</td></tr></table></body></html>";
    }

    function 
    check_login($u,$p){
    $lines=file("data/users.txt");
    foreach(
    $lines as $l){
    list(
    $lu,$lp)=explode("|",trim($l));
    if(
    $u==$lu && $p==$lp) return 1;
    }
    return 
    0;
    }

    function 
    user_exists($u){
    $lines=file("data/users.txt");
    foreach(
    $lines as $l){
    list(
    $lu,$lp)=explode("|",trim($l));
    if(
    $u==$lu) return 1;
    }
    return 
    0;
    }

    function 
    get_polls(){
    return 
    file("data/polls.txt");
    }

    function 
    save_poll($title,$opts){
    $id=time();
    $str=$id."|".$title."|".implode(",",$opts)."\n";
    file_put_contents("data/polls.txt",$str,FILE_APPEND);
    }

    function 
    vote($poll,$opt){

    $file="data/votes/".$poll.".txt";

    $data=array();

    if(
    file_exists($file)){
    $lines=file($file);
    foreach(
    $lines as $l){
    list(
    $o,$c)=explode("|",$l);
    $data[$o]=$c;
    }
    }

    if(!isset(
    $data[$opt])) $data[$opt]=0;
    $data[$opt]++;

    $f=fopen($file,"w");

    foreach(
    $data as $o=>$c){
    fwrite($f,$o."|".$c."\n");
    }

    fclose($f);
    }

    if(
    $a=="register" && $_POST){

    $u=$_POST["user"];
    $p=$_POST["pass"];

    if(!
    user_exists($u)){
    file_put_contents("data/users.txt",$u."|".$p."\n",FILE_APPEND);
    $msg="Registered. Now login.";
    }else{
    $msg="User exists";
    }

    }

    if(
    $a=="login" && $_POST){

    if(
    check_login($_POST["user"],$_POST["pass"])){
    $_SESSION["user"]=$_POST["user"];
    header("Location: index.php");
    exit;
    }else{
    $msg="Wrong login";
    }

    }

    if(
    $a=="logout"){
    session_destroy();
    header("Location: index.php");
    exit;
    }

    if(
    $a=="create" && $_POST){

    if(
    $_SESSION["user"]){

    $title=$_POST["title"];

    $opts=array(
    $_POST["o1"],
    $_POST["o2"],
    $_POST["o3"],
    $_POST["o4"]
    );

    save_poll($title,$opts);

    header("Location: index.php");
    exit;

    }

    }

    if(
    $a=="vote" && $_POST){

    vote($_GET["id"],$_POST["option"]);

    head("Vote");
    echo 
    "Thanks for voting";
    foot();
    exit;

    }

    if(
    $a=="vote"){

    $id=$_GET["id"];

    $polls=get_polls();

    foreach(
    $polls as $p){

    list(
    $pid,$title,$opts)=explode("|",$p);

    if(
    $pid==$id){
    $options=explode(",",$opts);
    }

    }

    head("Vote");

    echo 
    "<b>$title</b><br><br>";

    echo 
    "<form method=post>";

    foreach(
    $options as $o){
    echo 
    "<input type=radio name=option value=&#39;$o&#39;> $o<br>";
    }

    echo 
    "<br><input type=submit value=Vote>";
    echo 
    "</form>";

    foot();
    exit;

    }

    if(
    $a=="results"){

    $id=$_GET["id"];

    head("Results");

    $file="data/votes/".$id.".txt";

    if(
    file_exists($file)){

    echo 
    "<table border=1 width=400>";

    $lines=file($file);

    foreach(
    $lines as $l){

    list(
    $o,$c)=explode("|",$l);

    echo 
    "<tr><td>$o</td><td>$c</td></tr>";

    }

    echo 
    "</table>";

    }else{
    echo 
    "No votes yet";
    }

    foot();
    exit;

    }

    if(
    $a=="create"){

    if(!
    $_SESSION["user"]){
    header("Location: index.php");
    exit;
    }

    head("Create poll");

    echo 
    "<form method=post>";

    echo 
    "Title<br>";
    echo 
    "<input name=title><br><br>";

    echo 
    "Option 1<br>";
    echo 
    "<input name=o1><br>";

    echo 
    "Option 2<br>";
    echo 
    "<input name=o2><br>";

    echo 
    "Option 3<br>";
    echo 
    "<input name=o3><br>";

    echo 
    "Option 4<br>";
    echo 
    "<input name=o4><br><br>";

    echo 
    "<input type=submit value=&#39;Create&#39;>";

    echo 
    "</form>";

    foot();
    exit;

    }

    head("Polls");

    if(
    $_SESSION["user"]){

    echo 
    "Logged as ".$_SESSION["user"]." | ";
    echo 
    "<a href=?a=create>Create poll</a> | ";
    echo 
    "<a href=?a=logout>Logout</a>";

    }else{

    echo 
    "<table width=100%><tr><td width=50%>";

    echo 
    "<b>Login</b><br>";
    echo 
    "<form method=post action=?a=login>";
    echo 
    "User<br><input name=user><br>";
    echo 
    "Pass<br><input type=password name=pass><br>";
    echo 
    "<input type=submit value=Login>";
    echo 
    "</form>";

    echo 
    "</td><td>";

    echo 
    "<b>Register</b><br>";
    echo 
    "<form method=post action=?a=register>";
    echo 
    "User<br><input name=user><br>";
    echo 
    "Pass<br><input type=password name=pass><br>";
    echo 
    "<input type=submit value=Register>";
    echo 
    "</form>";

    echo 
    "</td></tr></table>";

    }

    if(isset(
    $msg)) echo "<br>$msg<br>";

    echo 
    "<hr>";

    $polls=get_polls();

    echo 
    "<table border=1 width=600>";
    echo 
    "<tr><td>Poll</td><td>Links</td></tr>";

    foreach(
    $polls as $p){

    list(
    $id,$title,$opts)=explode("|",$p);

    echo 
    "<tr>";
    echo 
    "<td>$title</td>";
    echo 
    "<td>";
    echo 
    "<a href=?a=vote&id=$id>Vote</a> ";
    echo 
    "<a href=?a=results&id=$id>Results</a>";
    echo 
    "</td>";
    echo 
    "</tr>";

    }

    echo 
    "</table>";

    foot();

    ?>
    Просто копируете, создаёте php файл и загружаете на свой сервак.

    8
    А что в нём интересного? Интернет по антенне кабельного ТВ. Тот же самый DSL, только не по телефонной линии
    Если честно, мне немного и dsl интересен, так-как его я тоже не застал, да и не знаю был ли он популярен в Болгарии вообще. По рассказам современников событий, в нашем домохозяйстве все резко перешагнули из dial up к витой паре.

    9
    По вашему являлся ли юзенет прародителем форумов? Или скорее этим были ббс-ки и почтовые списки?

    10
    Приветствую!
    Изучая способы сетевого подключения прошлого, я наткнулся на протокол DOCSIS, который передавал интернет по коаксиальной линии. Я родился в такое время, когда повсеместно уже была витая пара, поэтому не помню его, но если вы помните или даже работали с такими сетями, пожалуйста, расскажите!

    11
    Прочее про сайт. / Re: Хочу, чтобы...
    « : Марта 10, 2026, 21:41:29 »
    Пусть форум будет аутентичным и будут те функции, которые были на гама-ворлде!
    Какие?
    Я совсем недолго там пробыл, поэтому не помню каких-то специальных функций.

    12
    Можно было бы просто назвать BitByByte и на домене hoho.ws был бы форум твоего сайта :)
    Оставлю так. Да и вряд ли этот форум будет кому-то нужен, но я буду пытаться что-то сюда писать.
    Будет нужен. Предлагаю сделать рсс дублёр новостей с основного портала. Как было у меня на байтограде!

    13
    Прочее про сайт. / Re: Хочу, чтобы...
    « : Марта 10, 2026, 21:38:13 »
    Пусть форум будет аутентичным и будут те функции, которые были на гама-ворлде!

    Страницы: [1]