• Как скачивать файлы Telegram через php более 20МБ?

    @alekssamos
    Программист любитель
    Решение есть. Это локальный сервер. Только его из сишных исходников нужно самому собирать.
    Я у себя наговнокодил вот так:
    // vendor/irazasyed/telegram-bot-sdk/src/TelegramClient.php
    const BASE_BOT_URL = 'http://127.0.0.1:8081/bot';

    Будет приходить локальный путь типа /path_to/yourfolder/qwe/filename.ext
    И уже с ним работай.
    Запускал сервер так (через (supervisor):
    [supervisord]
    environment=TELEGRAM_API_ID="2*****89",TELEGRAM_API_HASH="dc8******c34"
    
    [program:tgapi]
    command=/usr/local/bin/telegram-bot-api -u root -g www-data --local  --max-webhook-connections=3 --http-stat-ip-address=127.0.0.1 --http-stat-port=8082
    directory=/var/tgapi
    user=root
    autostart=true
    autorestart=true
    stopasgroup=true
    killasgroup=true
    numprocs=1

    Разумеется, вы можете выбрать другой способ: через systemd, init.d, screen или что-нибудь ещё...
    А ниже я скину ссылки на уже собранные файлы. Там и для линуксов, и для Windows, очень много, пробуйте по очереди, один из них возможно заработает. А нет, тогда на целевой системе по инструкции с Github собирайте сами.
    Это работало на Debian 9 X64
    https://disk.yandex.ru/d/8CI5XChsOuGx6w

    Этот через WSL Ubuntu X64 собирал:
    https://disk.yandex.ru/d/ViYfg5rhIljoNw

    А вот остальные, там архивы (насобирал из интернета):
    https://disk.yandex.ru/d/MJWQtlJv3qFamg

    ___
    У меня платный тариф на Диске, ссылки вечные (максимально долгие), удалять не буду.
    Ответ написан
    Комментировать
  • Как понять смысл php скрипта парсинга данных и восстановить его работоспособность?

    @alekssamos
    Программист любитель
    Но после вывода этого массива через 180 сек возникает завершение работы скрипта

    Используйте не серверный PHP, а консольный.
    Или, как вариант, перезапускать ваш скрипт, сделать вызов самого себя с параметрами.
    Примерно так, не проверял:
    <?php
    
    $x = empty($_GET["x"])?1:$_GET["x"];
    file_put_contents("mylog.txt", $x."\n", FILE_APPEND);
    if($x>5) exit();
    $x+=1;
    $ch = curl_init("http://mserver.example.com/script.php?x=".$x);
    curl_exec($ch);
    curl_close($ch);
    Ответ написан
  • Как тестировать работу платежного шлюза freekassa на сайте на этапе разработки?

    @alekssamos
    Программист любитель
    Для таких штук придумали Ngrok и им подобные сервисы.
    Хотя, если кассе нужен именно настоящий домен, а изменить его будет в последствии нельзя,
    тогда без развёртывания не обойтись.
    Ответ написан
  • Приложение на cordova для iphone не проходит модерацию, что можно сделать?

    @alekssamos
    Программист любитель
    Ну типа можно открыть Safari отдельным приложением,
    а можно внутри вашего,
    когда наверху кнопка Готово.
    И они хотят именно так.
    Ответ написан
    Комментировать
  • Как взаимодействовать с элементом ::after?

    @alekssamos
    Программист любитель
    Заходим сюда
    /bitrix/cache/css/s1/redisigne/page_3ac9c0442a118ab1ae197b277795c9a4/page_3ac9c0442a118ab1ae197b277795c9a4_v1.css

    И находим строку:
    .district__item .item__address--ninetoten::after {
        content: '9:00 - 22:00';
        font-weight: 300;
        font-size: 12px;
        line-height: 14px;
        color: var(--pink);
        padding-left: 5px;
    }


    Вот и ответ. Время в CSS, а не в HTML коде.
    Ответ написан
    1 комментарий
  • Как в apache настроить прослушивание из вне?

    @alekssamos
    Программист любитель
    У меня была такая проблема и, как уже ответили, виноват был брандмауэр.
    Ответ написан
  • Как отправить содержимое текстового файла одним сообщением?

    @alekssamos
    Программист любитель
    Очивидно же!
    @bot.message_handler(commands = ['sendall'])
    def send_welcome(message):
        if message.from_user.id == int(adm_id):
            print("")
            print("------------------------------------------------------")
            print("")
            num = 0
            with open('all_users.txt', 'r') as f:
                    for line in f:
                        i = line.strip()
                        with open('rassylka.txt', 'r', encoding='UTF-8') as fp:
                            num += 1
                            bot.send_message(i, fp.read())
                        print(i + ": Sent! " + str(current_data))
            print("")
            print("------------------------------------------------------")
        else:
            print("Error! Line 66")
    Ответ написан
    Комментировать
  • Как реализовать диалоговый бот на PHP?

    @alekssamos
    Программист любитель
    Я не проверял. Точно как пишется не помню, но идея рабочая.

    <?php
    
    class SqliteStore {
    	protected $db;
    	public function __construct($tableName, $filePath = 'db.sqlite') {
    		$this->db = new SQLite3($filePath);
    		$this->tableName = $this->db->escapeString($tableName);
    		if (is_numeric($tableName[0])) {
    			$details = sprintf(
    				"sqlite will choke on table names that start w/ a number.  yours starts w/ '%s'",
    				$tableName[0]
    			);
    			throw new Exception($details);
    		}
    		
    		//wrap in try/catch & ignore warnings as workaround to lack of 'if not exists' in sqlite version
    		try {
    			$sql = "create table $tableName ( key text primary key, value text, tm INT )";
    			@$this->db->query( $sql );
    		} catch ( Exception $e ) {
    			// var_dump($e);
    		}
    	}
    	
    	public function get($key, $defvalue = '') {
    		$sql = sprintf(
    			"SELECT value FROM %s WHERE key = '%s';", 
    			$this->tableName, $key
    		);
    		$result = $this->db->query($sql)->fetchArray(SQLITE3_ASSOC);
    		if ($result) {
    			$result = $result['value'];
    		} else { $result = $defvalue; }
    		return $result;
    	}
    	
    	public function set($key, $value){
    		$time = time();
    		$sql = sprintf(
    			"REPLACE INTO %s (key, value, tm) VALUES ('%s', '%s', %d);", 
    			$this->tableName, $this->db->escapeString($key), $this->db->escapeString($value), $time
    		);
    		
    		//allow exceptions to bubble up
    		$this->db->exec($sql);
    	}
    	
    	public function delete($key){
    		$sql = sprintf(
    			"DELETE FROM %s WHERE key = '%s';", 
    			$this->tableName, $this->db->escapeString($key)
    		);
    		
    		//allow exceptions to bubble up
    		$this->db->exec($sql);
    	}
    	
    	public function deleteOld($seconds){
    		$time = time();
    		$sql = sprintf(
    			"DELETE FROM %s WHERE (%d - tm > %d);", 
    			$this->tableName, $time, $seconds
    		);
    		
    		//allow exceptions to bubble up
    		$this->db->exec($sql);
    	}
    	
    	public function delete_old($seconds){
    		return $this->deleteOld($seconds);
    	}
    }
    
    
    $ss = new SqliteStore('tg');
    $data = json_decode(file_get_contents('php://input'), TRUE);
    $message = trim($data["message"]["text"]);
    $chat_id = $data["chat"]["id"];
    if ($message === '/start') {
        $method = 'sendMessage';
        $send_data = [
            'text' => "Привет! Я бот для анализа активности подписчиков в каналах, чатах и группах."
        ];
    }
    # Проверяем, вводит ли пользователь ссылку.
    elseif (strpos($message, 'http') === 0) {
        $ss->set('saveChannelLink'.$chat_id, $message);
    
        $method = 'sendMessage';
        $send_data = [
            'text' => "Отлично! Отправь мне число:"
        ];
    }
    elseif (is_numeric($message)) {
        $ss->set('saveChannelNumber'.$chat_id, $message);
        $method = 'sendMessage';
        $saveChannelLink = $ss->get('saveChannelLink'.$chat_id);
        $saveChannelNumber = $ss->get('saveChannelNumber'.$chat_id);
        $send_data = [
            'text' => "Отлично! Ссылка: " . $saveChannelLink . "\nЧисло: " . $saveChannelNumber
        ];
    
    echo json_encode($send_data);
    Ответ написан
    Комментировать
  • Как обернуть текст в тег span?

    @alekssamos
    Программист любитель
    $('#loadmore').html('<span>Загрузить ещё</span>').before(data);
    Ответ написан
    Комментировать
  • Ошибка при использовании библиотеки pysqlite3?

    @alekssamos
    Программист любитель
    sqlite3 должна быть встроена в python без установки.

    Но ошибка может возникнуть, если есть проблемы с библиотеками sqlite в самой операционной системе.
    Ответ написан
    Комментировать
  • FastApi + uvicorn не коннетится?

    @alekssamos
    Программист любитель
    А что, если на сервере установлен фаервол и по умолчанию он всё запрещает?
    Попробуйте выполнить что-нибудь такое:
    sudo iptables -t filter -A INPUT -p tcp --dport 8000 -j ACCEPT

    И с портом 8000 запустить?
    Ответ написан
  • Как получить список людей которые когда либо писали в сообщество ботом?

    @alekssamos
    Программист любитель
    Там нет такого. Всё надо вручную делать. Список диалогов получить можно, но там никакого согласия нет и за рассылку сразу блокируют за нарушение правил.
    Надо самому приложение делать с кнопкой подписаться и как в электронной почте в конце сообщения оставлять ссылку на отписку,тоже это же приложение
    Ответ написан
    Комментировать
  • Не открывается всплывающее окно оплаты в чём может быть ошибка?

    @alekssamos
    Программист любитель
    А почему бы не использовать обычный location? Обязательно надо в новой вкладке?
    А что, если...
    function myopen(u) {
    	var a = document.createElement("a");
    	a.target = "_blank";
    	a.href = u;
    	a.click();
    }

    <button onclick="myopen('https://example.com/pay');">Перейти к оплате</button>

    Сейчас проверим.
    Запустить!
    Да, работает.
    Ответ написан
  • Как поместить сообщение в переменную telebot?

    @alekssamos
    Программист любитель
    Нужно использовать FSM, машину состояний. В telebot есть для этого register_next_step.
    step_example.py
    Посмотри этот файл
    Ответ написан
    Комментировать
  • Как отменить перемещение к якорю, но оставить хэш в браузере?

    @alekssamos
    Программист любитель
    А что, если?
    Вместо
    location.hash = this.getAttribute("data-bs-target");
    использовать
    History.pushState(null, document.title, this.getAttribute("data-bs-target"));
    ?
    Ответ написан
  • Как сделать фото с камеры HTML js?

    @alekssamos
    Программист любитель
    Короткий ответ: создаёшь video, прикручиваешь трансляцию с камеры, в нужный момент создаёшь canvas, рисуешь кадр с video на нём и этот кадр забираешь.

    В HTML создаешь <video></video>
    в JS пишешь

    var videoElement = document.querySelector('video');
    getStream().then(getDevices).then(gotDevices);
    
    function getDevices() {
        // AFAICT in Safari this only gets default devices until gUM is called :/
        return navigator.mediaDevices.enumerateDevices();
    }
    
    function gotDevices(deviceInfos) {
        window.deviceInfos = deviceInfos; // make available to console
        console.log('Available input and output devices:', deviceInfos);
    }
    window.setTimeout(getStream, 10);
    }
    
    function getStream() {
        if (window.stream) {
            window.stream.getTracks().forEach(track => {
                track.stop();
            });
        }
        const videoSource = videoSelect.value;
        const constraints = {
            video: {
                deviceId: videoSource ? {
                    exact: videoSource
                } : undefined
            }
        };
        return navigator.mediaDevices.getUserMedia(constraints).
        then(gotStream).catch(handleError);
    }
    
    function gotStream(stream) {
        window.stream = stream; // make stream available to console
        if ('srcObject' in videoElement) {
            videoElement.srcObject = stream;
        } else {
            videoElement.src = URL.createObjectURL(stream);
        }
    }
    
    function handleError(error) {
        console.error('Error: ', error);
    }
    
    function getImgUrl() {
        let el = videoElement;
        let canvas = document.createElement('canvas');
        canvas.width = el.videoWidth;
        canvas.height = el.videoHeight;
        canvas.style.display = 'none';
        document.body.appendChild(canvas);
        canvas.getContext('2d').drawImage(el, 0, 0, canvas.width, canvas.height);
        let cu = canvas.toDataURL();
        document.body.removeChild(canvas);
        return cu;
    }

    Ну и всё, getImgUrl() вызываешь в нужный момент и получаешь строку вида data:image/jpeg;base64,...... и вот тебе картинка
    Ответ написан
    Комментировать
  • Как получить нажатие на callback php?

    @alekssamos
    Программист любитель
    Придёт новый (ещё один запрос), в котором будет JSON. Там будет callback_query.data, его и проверяй

    Например:
    $result = json_decode(file_get_contents('php://input'), true);
    if($result["callback_query"]["data"] == "Log") {
        /* ... */
    }
    echo "ok";
    Ответ написан
  • Как передать текст из словаря так, чтобы он принимал переменные?

    @alekssamos
    Программист любитель
    >>> ID = {'id_RU': 'Ваш ID: {id}', 'id_EN': 'Your ID: {id}'}
    >>> lan = 'RU'
    >>> id = 368 # message.from_user.id
    >>> print(  ID[f'id_{lan}'].format(id=id) )
    Ваш ID: 368
    Ответ написан
    Комментировать
  • Как работает EXPOSE?

    @alekssamos Автор вопроса
    Программист любитель
    EXPOSE? здесь оказался не причём.
    Проблема была в compose yaml
    В коротком синтаксисе не работали определения портов через переменные окружения
    "${PORT}:${PORT}"
    А через длинный список, где отдельно указываются target и publish, там заработало как нужно.
    Ответ написан
    Комментировать