News

Как создать и добавить ключ SSH 4096 бит для GITLab(GIT)

0) Установить приложение GIT https://github.com/git-for-windows/git/releases/download/v2.47.0.windows.2/Git-2.47.0.2-64-bit.exe
1) Сгенерировать ключ к GIT локально.

  • Запустить Терминал (cmd.exe)
  • Выполнить команду для генерации и создания пары ключей (публичного и приватного):
    ssh-keygen -t rsa -b 4096 -C «test@gmail.com»
    На вопрос о кодовой фразе можно не вводить ничего (нажать Enter).
    Название ключа (такое название у файлов ключа) по умолчанию: id_rsa.pub
    Файлы ключа SSH будут находится в папке Пользователя Windows в подпапке .ssh
    Например: C:\Users\Tom.ssh (Tom — это имя пользователя Windows)

2) Добавит ключ на сайт:

  • Зайти на свой сайт GITLab в раздел https://gitlab.com/-/user_settings/ssh_keys
  • Нажать на кнопку Add new key
  • Задать значение поля «Title»
  • Задать значение «Expiration date»
  • взять весь текст публичного ключа из файла C:\Users\Tom.ssh\id_rsa.pub (название файла по умолчанию) внести поле «Key» (текст в данном случае начинается с фразы «ssh-rsa»)
  • нажать на кнопку «Add key».

Python logging example

Пример хорошего решения для меня при использовании системной библиотеки logging. Для каждого модуля можно создавать свой логгер

import logging
import os

# Путь к файлу в котором хранится лог сообщений
logFileName = './log/log.log'


# Формат сообщения 
# Пример: [07.03.2023 21:55:01] - main_process - DEBUG    This is a debug message
format = '[%(asctime)s] - %(name)s - %(levelname)-8s %(message)s'
# Базовая конфигурация Ограничение уровня логирования
# формат даты сообщения
# имя файла для лога
# сообщения добавляются в файл
logging.basicConfig(level=logging.DEBUG,
                    format=format,
                    datefmt='%m.%d.%Y %H:%M:%S',
                    filename=logFileName,
                    filemode='a')

# Обработчик для трансляции в консоль
consoleHandler = logging.StreamHandler()
# Ограничение уровня логирования
consoleHandler.setLevel(logging.INFO)
formatter = logging.Formatter(format)
# Формат сообщения
consoleHandler.setFormatter(formatter)
# Добавление обработчика для трансляции в консоль в базовый (root) логер
logging.getLogger('').addHandler(consoleHandler)

# Создание именованного экземпляра логера для текущего модуля
logger = logging.getLogger('main_process')

logger.debug('This is a debug message') #DEBUG тип сообщения не будет отображаться если базовая настройка уровня логирования выше чем DEBUG 
logger.warning('This is a warning message')#WARNING тип сообщения не будет отображаться если базовая настройка уровня логирования выше чем WARNING 

Что выводится в консоль:

[07.03.2023 22:34:31] - main_process - DEBUG    This is a debug message
[07.03.2023 22:34:31] - main_process - WARNING  This is a warning message

Далее код создания отдельного именованного логгера для любого модуля

import logging

# Создание именованного экземпляра логера для текущего модуля
module_logger = logging.getLogger('spam_service.spam')
# Используем экземпляр  логгера в функции
def some_function():
    module_logger.info('received a call to "some_function"')

Что выводится в консоль (при вызове функции some_function):

[07.03.2023 22:34:31] - spam_service.spam - INFO received a call to "some_function"

Postman скрипт для получения токена

Разберем, как можно добавить Pre-request скрипт, чтобы выполнять запрос токена (логин) и использовать его для выполнения других запросов, требующих аутентификацию с этим токеном.

Проблема

Создаем и отправляем запросы в Postman для тестирования работы с API, но каждый раз токен приходится вводить вручную. Токен вводим в первый и в последующие разы при каждом запуске, что занимает время, но понятно что есть способ использовать обширный набор инструментов Postman.

Как организована авторизация в Postman

Структура проекта в нашем случае такая: Корень проекта (в терминах Postamn называется API), Папка-коллекция (набор запросов), Папка (по названию Controller) и Запросы (описание каждого запроса, который нужно тестировать).
Здесь и далее речь идет о конфигурации Папки-коллекции и ее Запросов. Настройка авторизации в запросах по умолчанию находится в значении «Inherit auth from parent». Это значит, то мы можем для всех Запросов настроить авторизацию в их родительской Папке-коллекции.

По шагам

В данном случае используем авторизации типа Bearer Token. Необходимо перед каждым запросом, который есть в Папке-Коллекции выполнять предварительный запрос аутентификации для получения Токена. Токен из ответа сервера будет помещен в переменную MyToken. Значение переменной MyToken будет использовано как токен.

1. Выбрать Папку-Коллекцию PizzaWebApi.Web;

2. Выбрать таб с настройками «Authorization» (для текущей коллекции);

3. Выберем метод авторизации Type = «Bearer Token»;
4. Выберем Token = «{{MyToken}}» (без кавычек);

5. Выбрать таб Variables;
6. Создать переменную со значение baseUrl = «http://localhost:5118» (без кавычек, стандартный порт ASP Core);

7. Создать переменную MyToken без значения;

8. Выбрать таб Pre-request Script;

9. В пустое поле внести следующий код

pm.sendRequest({
    url: pm.variables.get('baseUrl') + "/api/login",
    method: 'POST',
    header: { 
        'content-type': 'application/json',
    },
    body: {
        mode: 'raw',
        raw: JSON.stringify({ "UserNameOrEmail": 'John', "Password": 'Aa123456' })
    }
}, function (err, res) {
    const jsonResponse = res.json();
    const newAccessToken = jsonResponse.token;
    pm.variables.set("MyToken", newAccessToken);
});

10. Нажать кнопку Save.

Чтобы проверить код скрипта нажмите кнопку Run. Детали исполнения запроса скрипта смотри в Консоли Postamn. Тестируемое API должно быть активно.

Выполните любой Request из этой коллекции и убедитесь, что метол login будет предварительно исполнен (см. скрин).


Опубликовано в Postman

Телеграм бот посылает сообщение пользователю PHP

Подготовка

Что нужно:

  • Создать бота или использовать своего существующего.
  • Узнать id пользователя, которому нужно послать сообщение.
  • Убедится, что пользователь послал хотя бы 1 сообщение боту

Как создать бота Телеграм?

Чтобы создать бота и узнать его токен (далее BOT TOKEN) и id обратитесь к статье ссылка .

Как узнать id пользователя?

Чтобы узнать id пользователя Телеграм нужно, чтобы он либо написал сообщение контакту Телеграм @getmyid_bot , либо написал сообщение вашему боту от своего имени (что предпочтительнее).

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

Важно: в документации id пользователя может/будет называться chatID .

Чтобы прочесть все сообщения полученные в адрес вашего перейдите по ссылке https://api.telegram.org/bot<BOT TOKEN>/getUpdates и получите json ответ от сервера с сообщениями. Подробнее о методе getUpdates .

Важно: сообщения хранятся на сервере Телеграм не более 24 часов, а затем удаляются. В запросе без дополнительных параметров выдается не более 100 позиций.

Код

Параметры функции:

$msg — текст сообщения на английском языке (есть проблемы кодировкой).

$chatID — id пользователя которому отсылается сообщение.

$bot_token — токен бота BOT TOKEN

$emoji_unicode — UTF код иконки для добавления в текст сообщения смайлика из библиотеки. Пример: \xF0\x9F\x94\xA5

function telegramSendMessage($msg, $chatID, $bot_token, $emoji_unicode = '') 
{
    echo "sending message to " . $chatID . "\n";

    $url = "https://api.telegram.org/bot" . $bot_token . "/sendMessage" . "?chat_id=" . $chatID;
	$text_param = urlencode($msg);
	if(!empty($emoji_unicode))
		$text_param = str_replace('\x', '%', $emoji_unicode) . '+' . $text_param;
	
    $url = $url . "&text=" . $text_param;

    $ch = curl_init($url);
    $optArray = array(
            CURLOPT_HEADER => false,
			CURLOPT_POST => 1,
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_CONNECTTIMEOUT => 5,
			CURLOPT_TIMEOUT => 60,
			CURLOPT_SSL_VERIFYPEER => false
    );
    curl_setopt_array($ch, $optArray);
    $result = curl_exec($ch);
	if (curl_errno($ch)) 
	{
		echo curl_error($ch) . PHP_EOL;
	}
    curl_close($ch);
    echo $result . PHP_EOL;
}

Ошибки в работе скрипта

Сообщение не доходит до пользователя

Убедитесь, что пользователь послал хотя бы 1 сообщение этому боту иначе любые сообщения от вашего бота не будут доходить.

Forbidden: bot was blocked by the user В некоторых случаях пользователи намеренно блокируют этого бота.

400 Bad Request это может появится, если вы посылаете сообщения слишком часто, что воспринимается как спам сервером. Или с вашего IP адреса, кто то еще посылает слишком много сообщений, что бывает если вы арендуете частный хостинг.

Python подключаем Selenium Linux

Подготовка

Необходимо:

  1. скачать требуемый вэбдрайвер (webdriver) браузера (поддерживаемого) в зависимости от вашей OS для управления им с помощью Selenium  https://selenium-python.readthedocs.io/installation.html#drivers
    Распаковать соответствующий файл в папку:
    — для Windows:
    C:/WebDriver\bin\phantomjs.exe
    — для Linux:
    /opt/WebDriver/bin/phantomjs
    В пример я использовал вэбдрайвер PhantomJS (хотя он не рекомендуется для использования), так как не он показывает окно с запускаемой программой
  2. Для того, чтобы воспользоваться вэбдрайвером нужно установить значение системной перменной Path:
    — для Windows в командной строке (или в ручном режиме) :
     setx /m path «%path%;C:\WebDriver\bin\»
    — для Linux ввести в Терминале:
    export PATH=$PATH:/opt/WebDriver/bin >> ~/.profile
    Чтобы проверить получилось ли установить path введите в Теримнале команду:
    phantomjs (chromedriver, если выбрали Chrome) Теримнал покажет готовность получить команды от вас для драйвера. Чтобы выйти из режима нажимте Ctrl+C .
  3. Установить пакет Selenium командой в Терминале (для Windows в Терминале приложения для разработки или тоже в Терминале для Linux):
    pip install selenium

Исходный код

# ref
	from selenium import webdriver
	from selenium.webdriver.common.keys import Keys
	from selenium.webdriver.common.by import By
	from selenium.webdriver.support.ui import WebDriverWait
	from selenium.webdriver.support import expected_conditions as EC

	#инициализация
	driver = webdriver.PhantomJS()
	# переход по ссылке
    driver.get(href)
    try:
		# ожидаем появления на странице элемента с аттрибутом "class" со значением "item-address__string"
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "item-address__string"))
        )
        # находим нужный элемент 
        elem = driver.find_element_by_class_name("item-address__string")
		# и получаем его текст
        full_address = elem.text
        print('full_address = ' + full_address)
    except BaseException as ex:
        print('Error load avito page. Error = ' + format(ex))
		# скрин окна барузера (как оно выглядело в момент ошибки)
        driver.save_screenshot('screenshot.png')
    finally:
		# обязательно выгружаем из памяти
        driver.quit()

HumanEmulator ошибка: ‘2006 MySQL server has gone away’

Работаю с Human Emulator Studio 7 на основном языке PHP, столкнулся с проблемой при соединении с БД MySQL при Update операции при использовании библиотеки PDO: 2006 MySQL server has gone away

В сети нашел хорошую статья в тему mysql-server-has-gone-away-error-solutions .

Мне подошел вариант с изменением настроек php.ini файла в блоке [Pdo_mysql], а именно добавить строчку для увеличения таймаута для ожидания соединения с БД: mysql.connect_timeout=90

[Pdo_mysql]
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
pdo_mysql.default_socket=
mysql.connect_timeout=90

P.S. Не забываем устанавливать null для Connection объекта в PDO режиме.

Как настроить Python скрипт на хостинге

Условия

В примере:

  1. ОС Windows 7 или выше
  2. Используется хостинг с Linux
  3. Требуемая версия Python 3.7.6. Хостинг имеет базовые настройки, где возможно выбрать версию Python
  4. У целевого хостинга используется ISP Manager
  5. Доступ через SSH клиент подключение к хостингу Putty

Настройка в панели управления доменом

  1. Для настройки нужно перейти к Панели управления хостингом, выбрать целевой хостинг.
  2. Перейдите в настройки хостинга в ISP Manager в разделе WWW/WWW-домены. Установить галочку на CGI-скрипты и Версия Python в данном случае значение Python-3.7.6 Нажать OK, чтобы применить изменения.
ISP Manaher hosting config

SSH клиент подключение

Есть хостинг, нужно настроить на нем Python:

  1. Подключение происходит через приложение Putty, которое необходимо установить.
  2. Подключитесь к хостингу по SSH для чего необходимо запустить приложение Putty, прописать в поле Host Name IP адрес целевого хостинга (его можно узнать на странице управления хостингами) и нажать кнопку Open
  3. При первом подключении к серверу появится окно «Предупреждение безопасности PuTTY». Нажмите кнопку  Да. Появится окно для набора команд, его мы будем называть Терминал, как в Linux системах
  4. Далее необходимо пройти логин операцию. Введите логин хостинга в первой строке со значением  «login as:» и нажмите кнопку Enter для выполнения команды (здесь выполняется команда, Enter выполняет команду, далее подразумевается, что выполняя команду вы будете нажимать эту кнопку ). Далее следует строка: “<username>@<ip adress>’s password:”  пишем команду пароль к учетной записи. Как только вы подключитесь по SSH, вы окажетесь в домашнем каталоге вашего хостинга.
Putty Alert
Putty terminal

5. Создадим Виртуальное окружение, для чего, надо перейдите в домашний каталог вашего пользователя с помощью команды: cd ~
Убедитесь, что вы в нужном каталоге, выполнив команду: 
pwd
Для этого Виртуальное окружение необходимо создать в одной из существующих папок с нужной версией Python. Эту песочницу мы планируем использовать для вашего проекта. Версия Python должна совпадать со значением устанавливаем в пункте 2.
Чтобы узнать доступные версии Python, выполните команду:
ls -la /opt/python/*/bin/python
Для создания виртуального окружения выполните команду:
/opt/python/python-3.7.6/bin/python -m venv pyth3
Где pyth3 – это название для Виртуального окружения

Putty Python folders

6. Активируйте ваше виртуальное окружение с помощью команды:
source pyth3/bin/activate
Если слева от строки ввода команды появилось название вашего виртуального окружения pyth3, значит оно активировалось.

7. После активации можно использовать команды формата pip install <app name>, для установки набора необходимых библиотек, согласно инструкциям по установке. Библиотека pip, в данном случае, уже установлена.
8. После всех операций, в ISP Manager в Менеджере файлов можно найти папку /pyth3/

Важно: если вы несколько раз подряд ввели неправильный пароль и сервер заблокировал соединение по SSH, обычно блокируется на 2 часа или более
Важно: Если лень набирать используйте буфер обмена: для вставки в Терминал используйте Shift+Insert
Важно: Обратите внимание: многие из  команд выполнить на виртуальном хостинге не получится (установка и удаление пакетов, монтирование файловых систем и др.), так как у вас нет root-доступа.
Важно: Для нашей версии Python 3.7.6 будет свой каталог и это называется — Виртуальное окружение. Это как песочница для работы с нужной версией Python. Такой подход гарантирует, что в песочнице будет нужная версия Python и строго определенный набор библиотек.
Важно: команда для контроля, какая версия Python в активированном виртуальном  окружении:
python --version
Важно: Если в вашей системе обновилась версия Python, то виртуальное окружение иногда тоже нужно обновить. Но обновлять мы будем папку, где находится библиотека Pythobn, на которую мы ссылаемся. Для этого вызываем venv аналогично созданию окружения, добавив ключ –upgrade команда:
pyvenv --upgrade /opt/python/python-3.7.6/bin/python

Проверяем работоспособность Python скрипта

1. Для тестирования необходимо создать файл test.py с кодом:

print('Hello')

код выводит в консоль текст Hello

2. Файл по ftp заливаем на хостинг в папку /pyth3/bin/

3.  Для работы в Менеджере файлов нужно найти файл и установить (разрешить) ему атрибуты на Исполнять, Писать и Читать по схеме -rwxr-xr-x (установить галочку и желательно снять галочки для атрибутов не члены групп или владелец).

4. Исполнить файл можно в режиме Терминала (Консоли), например, через Putty.

С активацией:

Логинимся и активируем каталог со средой команда:

source pyth3/bin/activate

Исполняем файл (он лежит в bin папке) команда:

pyth3/bin/python pyth3/bin/test.py

Без активации:

Логинимся и сразу исполняем файл командой:

pyth3/bin/python pyth3/bin/test.py

В итоге мы увидим в терминале сообщение: Hello

Установка библиотек в Python

Вам точно не будет хватать базового набора библиотек в Python. Необходимо будет их подключить, для чего:

1.Логинимся через Putty на Терминал и активируем каталог наш со средой команда:

source pyth3/bin/activate

2. Вводим в Теримнале команду :

pip install <app name>

, где <app name> это имя библиотеки (сборки). Действуя по инструкциям по установке сторонних библиотек. Библиотека pip в данном случае уже установлена.

Запуск скрипта по расписанию Python скрипта

Теперь необходимо выполнять скрипт автоматически периодически, например, ежедневно. Для примера будем использовать уже созданную нами папку /pyth3/с Виртуальным окружением, но команда будет выполнятся без активации.

  1. В панели ISP Manager выберите в разделе Главное пункт Планировщик
  2. Планировщик кнопка Настройки здесь заполните email адрес, куда будут приходить письма с отчетом о выполнении (текст из консоли исполняемого приложения)
  3. В меню Планировщик кликаем кнопку Создать
  4. Заполняем поля: Команда, Описание и Выполнять Каждый час команда:
    pyth3/bin/python3/var/www/u0000000/data/pyth3/bin/test.py
    Описание: test
    Выполнять: каждый час или выберите другие интервалы
  5. Жмем кнопку OK и все готово
  6. Чтобы узнать, когда выполнился наш скрипт загляните в указанную выше почту

Важно: команда содержит в себе путь к исполняемому скрипту, он в вашем случае может быть другим

Важно: значение в команде pyth3/bin/python3 это путь к файлу ядра Python, фактически же ядро находится в другой каталог по адресу /opt/python/python-3.7.6/bin/python, а это ссылка на среду из Виртуального окружения. Если в команде использовать прямую путь к ядру может возникнуть ошибка исполнения, так как мы потеряли связку с дополнительным набором библиотек.

Важно: в консоли, если запросить текущую версию Python командой:

python --version

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

SSL ошибка Telegram API C#

В феврале 2020 года в приложениях по работе с API Telegram наблюдается следующая ошибка:

System.Net.WebException: Запрос был прерван: Не удалось создать защищенный канал SSL/TLS

Ошибка связана со сменой протокол защиты транспортного уровня TLS на версию 1.2. Для «починки» вашего приложения добавьте в код перед использованием библиотеки API Telegram следующий код (для C#):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Этого достаточно для починки вашего приложения.

Update: для Windows 7 потребовалась установка всех обновлений. Точно не ясно какое обновление решило проблему.

Опубликовано в .NET, C#

Ввод в элемент input был сделан программно или клавиатурой?

Как узнать разработчику сайта, как был сделан ввод значения в элемент сайта input?
Как справляются с этой задачей функции HumanEmulator?
Есть такой флаг, по которому разработчик сайта может узнать, клик на элемент страницы был сделан программно или мышью?
Это isTrusted, это булевое свойство события (далее флаг), только для чтения, имеет значение True, если событие было сгенерировано пользователем и False, если оно вызвано тригером.

Как получить значение этого флага просто для чего добавим через консоль код разработчика подписчик, такого вида:

document.getElementById("code").addEventListener("input", function(event){
console.log('isTrusted = ' + event.isTrusted + ' event type = ' + event.type);
}
);

Значение флага для события клик будет выведено на консоль (в табе Console, Панели разработчика).
И так результаты кликов от HumanEmulator Studio:
Интерфейс DOM метод set_value() – не фиксируется подписчиком
Интерфейс DOM метод send_input() – isTrusted = true
Интерфейс DOM метод input() – isTrusted = true
Интерфейсы DOM методы key_down(‘a’) и key_up(‘a’) – не фиксируется подписчиком
Интерфейс DOM метод send_key(‘1’) – не фиксируется подписчиком
Метод объекта $keyboard->input(‘1’) (на элементе должен стоять фокус) – isTrusted = true

Клик на элемент был сделан программно или мышью?

Как узнать разработчику сайта, как было сделано нажатие на элемент сайта?
Как справляются с этой задачей функции HumanEmulator?
Есть такой флаг, по которому разработчик сайта может узнать, клик на элемент страницы был сделан программно или мышью?
Это isTrusted, это булевое свойство события (далее флаг), только для чтения, имеет значение True, если событие было сгенерировано пользователем и False, если оно вызвано тригером.

Как получить значение этого флага просто для чего добавим через консоль код разработчика подписчик, такого вида:

document.getElementById("myBtn").addEventListener("click", function(event){
console.log('isTrusted = ' + event.isTrusted);
}
);

Значение флага для события клик будет выведено на консоль (в табе Console, Панели разработчика).
И так результаты кликов от HumanEmulator Studio:

  • Интерфейс DOM метод click() — isTrusted = false
  • Интерфейс DOM метод meta_click() — isTrusted = true
  • Интерфейс DOM метод send_mouse_click() — isTrusted = true
  • Интерфейс DOM метод mouse_click — isTrusted = true
  • Интерфейс DOM метод send_mouse_left_down(0,0) — отдельно не фиксируется как клик слушателем!
  • Интерфейс DOM метод mouse_left_down(0,0) — отдельно не фиксируется как клик слушателем!
  • Интерфейсы DOM методы (один за одним) mouse_left_down(0,0) и mouse_left_up(0,0) засчитываются как один клик — isTrusted = true
  • Интерфейсы DOM методы (один за одним) send_mouse_left_down(0,0) и send_mouse_left_up(0,0) засчитываются как один клик — isTrusted = true