BITE4SAVE
BITE4SAVE личный блог
Сегодня в 13:35

Алготрейдинг на QLUA под QUIK - снова под мобильным контролем через Email.

Всех приветствую !
Не складывалось как-то последнее время надежно получать сообщения от помощника на QLUA под Quik.
То telegram работает нестабильно, то LUA Socket отвалился (не знаю, может это связано с обновлением Quik и появлении целочисленного типа данных).
MAX так вообще позволяет юзать чат-боты только юрлицам и ИП.
И задумал я, немного погуглив, поиспользовать Email-оповещения на мобильное приложение Яндекс.Почта, используя связку PHP + PHPmailer.
Оказалось, за пару дней получился вполне приличный результат.
Если устраивает средняя задержка оповещения от 3 до 45 секунд (бывает меньше, бывает намного больше — от почты зависит), можно посмотреть на этот вариант.
Мне он зашел тем, что не надо под новую версию Quik пересобирать никакие библиотеки, не нужен никакой почтовый сервер с необходимостью его настраивать.
Код на QLUA занял ровно 1 страницу.
А теперь — как это приготовить.
Во-первых, идем на сайт php.net, скачиваем ZIP-архив PHP, соответствующий ОС.
www.php.net/downloads.php?os=windows&osvariant=windows-downloads&version=default&multiversion=Y
В моем случае — VS17 x64 Thread Safe.
Распаковываем, например, в папку C:\PHP\.
Редактируем путь переменных среды.
Запускаем cmd из меню Пуск Выполнить, идем в папку PHP: cd \ <Enter>, затем cd php <Enter>, затем control sysdm.cpl <Enter>.
В Свойствах системы переходим во вкладку Дополнительно, нажимаем кнопку Переменные среды...
В окне Системные переменные выбираем строку Path.
Нажимаем кнопку Изменить.
В окне Изменить переменные среды нажимаем кнопку Создать. Вводим текст C:\PHP\
Нажимаем 3 раза ОК для закрытия всех дополнительных окон.
Проверяем версию PHP в окне консоли — php --version
Идем в папку C:\PHP\. Находим файл php.ini-development.ini, копируем файл в эту же папку под именем php.ini.
Редактируем файл — открываем, находим строчку ;extension_dir = «ext», убираем точку с запятой (раскомментирование), находим строчку ;extension=openssl, убираем точку с запятой, сохраняем файл.
Проверяем работу в командной консоли
c:\PHP\php -r «echo 'hello world';»
c:\PHP\php -h
Если получаем сообщение об ошибке — отсутствует VCRUNTIME140.dll, устанавливаем подходящий пакет Microsoft Visual C++ Redistributable (Visual Studio), скачав и установив нужный файл.
learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
Например, у меня ОС Windows Server 2019, скачал файл VC_redist.x64.exe.
Устанавливаем пакет.
Скачиваем PHPMailer.
github.com/PHPMailer/PHPMailer
download PHPMailer as a zip file
Распаковываем архив (файлы и подпапки) в папку c:\php\PHPMailer
Заходим в Яндекс.Почта, Настройки (шестерёнка), Все настройки, Почтовые программы, разрешаем доступ к почтовому ящику с помощью почтовых клиентов.
Нажимаем ссылку Пароли приложений, далее действуем по инструкции Яндекса, создаем пароль для почты, копируем и запоминаем его.
В итоге — редактируем скрипт QLUA.
В строках правим address@yandex.ru на реальный адрес, Имя Фамилия правим на данные аккаунта Яндекса, указываем созданный раньше password.
Выбираем букву виртуального диска или просто диска, создаем на нем папку temp, например, z:\temp\, помещаем в нее файл-вложение, например, signal.txt, правим в скрипте имя файла на нужное, запускаем скрипт — должно прийти сообщение с почты на почту с вложением.
При ненадобности можно удалить строку с приложением к письму.
Чтобы работать с другими почтами — ссылка.
snipp.ru/php/smtp-phpmailer
Но для работы, например, с Google (GMail), возможно, помимо номера порта надо править строку
'PHPMailer::ENCRYPTION_SMTPS;' на 'PHPMailer::ENCRYPTION_STARTTLS; (для шифрования TLS) или задать шифрование ssl или tls,
например, так: '$mail->SMTPSecure = «ssl»;' или так: '$mail->SMTPSecure = «tls»;'
Возможно, придется подправить и файл php.ini .
Не пробовал.
В заключение в почте надо создать папку для сообщений и правило, чтобы сообщения от Quik попадали в эту папку, чтобы через некоторое время их можно было удалить нажатием одной кнопки, и включить уведомления.
Показалось, что уведомления приходят быстрее, если приложение электронной почты открыто.
Всё !

SIGNALMESSAGE = 'MXU6 SHORT' -- текст Email-сообщения (может быть расширен до HTML-страницы в таблице)
	RAMDISK = 'z:' -- буква виртуального диска для работы
	ATTACHFILENAME = 'signal.txt' -- имя файла-приложения к письму, должен быть в папке RAMDISK..'\temp\'	
	PHPFILENAME = RAMDISK..'\\temp\\yamessage.php' -- временный перезаписываемый PHP-файл для отправки письма
	
function OnInit()	
	is_run = true
end

function OnStop()
	is_run = false
end

function main()
		if is_run then
		SendEmailMessage(SIGNALMESSAGE, ATTACHFILENAME)
		end
end		

-- Функция отправки сообщения на Email : Внимание ! Здесь кодировка - UTF-8.
function SendEmailMessage(SIGNALMESSAGE, ATTACHFILENAME)
	local phpbegin = {
	'<?php',
	'use PHPMailer\\PHPMailer\\PHPMailer;',
	'use PHPMailer\\PHPMailer\\Exception;',
	'require_once \'c:/PHP/PHPMailer/src/Exception.php\';',
	'require_once \'c:/PHP/PHPMailer/src/PHPMailer.php\';',
	'require_once \'c:/PHP/PHPMailer/src/SMTP.php\';',
	'$mail = new PHPMailer(true);',
	'try {',
	'$mail->isSMTP();',
	'$mail->SMTPAuth = true;',
	'$mail->SMTPDebug = 0;',
	'$mail->Host = \'ssl://smtp.yandex.ru\';',
	'$mail->Port = 465;',
	'$mail->Username = \'address@yandex.ru\';',
	'$mail->Password = \'password\';',
	'PHPMailer::ENCRYPTION_SMTPS;',
	'$mail->setFrom(\'address@yandex.ru\', \'Имя Фамилия\');',
	'$mail->addAddress(\'address@yandex.ru\', \'Имя Фамилия\');',
	'$mail->isHTML(true);',
	'$mail->Subject = \'QUIK MESSAGE\';'
	}
	local phpend = {	
	'$mail->msgHTML($body);',
	'$mail->addAttachment(\''..RAMDISK..'/temp/'..ATTACHFILENAME..'\');',
	'$mail->send();',
	'echo \'Письмо успешно отправлено!\';',
	'} catch (Exception $e) {',
	'echo \'Ошибка при отправке письма: {$mail->ErrorInfo}\';',
	'}',
	'?>'
	}
	-- Получаем системные дату и время
	local sysdate = os.sysdate()
	local SYSDATETIME = ("%02u-%02u-%04u %02u:%02u:%02u"):format(sysdate.day, sysdate.month, sysdate.year, sysdate.hour, sysdate.min, sysdate.sec)
	local SYSDATE = string.sub(SYSDATETIME, 1, 10)
	local SYSTIME = string.sub(SYSDATETIME, 12, 19)
	-- Открываем файл в режиме записи
	local PHPFileWrite = io.open(PHPFILENAME, "w")
	-- Если файл существует
		if PHPFileWrite ~= nil then
			for i = 1, #phpbegin do
			PHPFileWrite: write(phpbegin[i]..'\n')
			end
		PHPFileWrite: flush() -- Cохраняем изменения в файле	
		SIGNALMESSAGE = '$body = "<p><strong>'..SYSDATE..' '..SYSTIME..' '..SIGNALMESSAGE..'</strong></p>";\n'		
		PHPFileWrite: write(SIGNALMESSAGE)
		PHPFileWrite: flush()
			for i = 1, #phpend do
			PHPFileWrite: write(phpend[i]..'\n')
			end		
		PHPFileWrite: flush()
		PHPFileWrite: close() -- Закрываем файл			
		end
	os.execute('start /min c:\\php\\php.exe '..PHPFILENAME)
end
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
0 Комментариев

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн