Телеграм бот посылает сообщение пользователю 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 адреса, кто то еще посылает слишком много сообщений, что бывает если вы арендуете частный хостинг.

Telegram бот посылает сообщения в канал

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

Задача: Пересылать текстовое сообщение на мобильные телефоны от работающего C# приложения.

Решение:

  1. Создать аккаунт в Telegram. Получить свой логин, он начинается согласно требованию платформы с символа @
  2. Скачиваем и устанавливаем десктоп версию программы
  3. Добавляем в список контактов бота @BotFather
  4. Нужно отправить команду боту, для этого нужно написать ему сообщение /start, а потом /newbot
  5. В тексте сообщения от бота о нашем процессе создания, теперь нужно написать имя бота (name). Имя должно быть на английском уникальным и оно должно оканчиваться на bot
  6. Теперь запрашивается имя бота в контакт листе  username, тоже должно оканчиваться на bot
  7. Бот был создан, скопируйте токен (token) ключ. Он необходим для разработки
  8. Создаем канал, для этого в главном меню выбираем создать канал.  Даем имя testchanel111
  9. Наблюдаем окно с выбором доступности канала. У меня канал приватный, так как он будет использоваться только мной. Однако для того чтобы бот мог с ним взаимодействовать, а именно посылать сообщения, он должен быть публичным. Для чего вбиваем урл для доступа к каналу.
  10. В настройках канала (View chanel Info) нажимаем на ссылку с названием 1 administartor , там жмем ссылку ADD ADMINISTRATOR туда вводим имя  нашего бота name Теперь наш бот администратор, а значит может создавать контент в ней
  11. В проекте студии VS 2015 подключаем библиотеку MrRoundRobin/telegram.bot
  12. Код для работы бота
    var chatId = "testchanel111" //имя канала
    var message = "*bold text*"; // информация о формате текста сообщения https://tlgrm.ru/docs/bots/api#formatting-options
    var bot = new TelegramBotClient(tokenKey);//инициализация
    var msg = await Bot.SendTextMessageAsync(chatId, message, false, false, 0, null, ParseMode.Markdown); // тип парсинга сообщения Markdown
    log.Info(string.Format("Message id = {0}, chat id = {1}",  msg.MessageId, msg.Chat.Id));
    ВНИМАНИЕ! msg.Chat.Id — содержит id канала в системе, что позволяет также получить доступ не по имени канала (начинается с @) а по этому id. ЗНАЯ ID МОЖНО ПОЛУЧИТЬ ДОСТУП ДАЖЕ К ПРИВАТНОМУ КАНАЛУ.
    msg.MessageId — это id сообщения по которому к нему можно получить доступ, если необходимо
  13. Можно взаимодействовать с публичным каналом, однако мне нужен частный канал и я сделаю его приватным, а доступ получу по его id. Пользователь может открыть до 5ти публичных каналов.
    Получить id канала еще можно в web версию месенджера по адресу
    Выберите интересующую нас группу и в адресной строке можно увидеть адрес с цифрами. Выделенные цифры это код группы, добавьте к началу этого кода симыолы -100 и получим id канала (получится -100777000).
  14. Устанавливаем Telegram на телефон и получаем оповещения. Все пользователи приглашенные в этот канал будут получать мгновенные оповещения.

Пунктов много, однако в целом все довольно просто и логично

PHP Storm и HumanEmulator

Пример организации работы php скрипта в PHPStorm с рабочей функцией подстановки кода в редакторе. С PHPStorm в работа по созданию скрипта сильно облегчается (отладка и точки останова).

  1. Для корректной работы установим HumanEmulator (далее HE) в отдельную папку по пути:  C:\XWeb\HE 4.9.39 PHP STORM
  2. Заменяем файл php.ini, который находится
    C:\XWeb\HE 4.9.39 PHP STORM\PHP\php.ini на файл C:\XWeb\HE 4.9.39 PHP STORM\PHP\ php.ini-phpstorm назвав его тем же именем
  3. Запускам PHP Storm и в мастере первого запуска выбираем «Открыть». Выберем папку HE (целиком) путь C:\XWeb\HE9.39 PHP STORM.
    phpstormopen2 open2
    Зачем это делается?
    В папке содержится основной код приложения, который будет «виден» движку
    PHP Storm.
  4. Копируем наш готовый рабочий скрипт в основную рабочую папку папку:
    C:\XWeb\HE9.39 PHP STORM\MyScripts
    Для примера у меня будет проект aliexpress. В код скрипта необходима добавит строчку:
    $PHP_Use_Trought_Shell=false;
  5. Настройка конфигурации исполнения
    Для этого открываем конфигурацию Edit Configuration
    PHPStrorm editconfiguration 1 step
    Add New ConfigurationPHPStrorm editconfiguration 2step
    Добавляем PHP ScriptУстанавливаем путьPHPStrorm editconfiguration 3 step к файлу скрипта с которого происходит исполнение и имя этой конфигурации и нажимаем OKPHPStrorm editconfiguration 4 step
  6. Настройка интерпретатора. PHP Storm требует установить интерпретатор, в нашем случае он находится в каталоге PHP.
    Для установки интерпретатора главное меню File/Settings/PHP создаем новый и выбираем путь к нему.
    setinterpretatoradd find path
  7. Запускаем приложение HE на порту 7010. Приложение будет работать как сервер и браузер, который будет отрабатывать команды находится в окне HE.
  8. Запуск скрипта по кнопке запуска PHP STORM
    phpstromstart
  9. Остановка скрипта по кнопке стоп, в панели отладки окна PHP STORM
    phpstormstopscript

Все настройки PHP STORM будут сохранены и уже для запуска приложения нужно будет исполнять только 8 пункт описания и соответственно для остановки пункт 9.

Подключение всех папок HE  необходим для корректной работы главного преимущества PHP Storm удобных функций подстановки кода.

intellysense

Так как лог в приложении HE ориентирован на исполнение в окне браузера встроенного в приложение, лог содержит символ переноса <br> и лог отображенный в панели PHP STORM в функции вывода сообщений лога в одну строчку, что мешает его корректно воспринимать. Можно добавит символ переноса строки \n в конце (после <br>) и лог будет выводится корректно.

К сожалению  функция $folder_path = $debug->get_cur_script_folder(); возвращает некорректный результат (пустое значение) нужно заменить эту часть стандартной функцией $folder_path = getcwd();

P.S.

Запуск обычного скрипта на чистой версии phpStorm

Для запуска скрипта на чистой версии phpStorm не используя готовую конфигурацию из HE без привязки к серверной части необходимо.

1. Создать новый проект с phpStorm File/New project определить в меню корневую папку.

2. Настройка конфигурации исполнения Edit Configuration. Тип конфигурации PHP Script. Определить в ней Интерпретатор, как путь к файлу php.exe в моем случае это C:\Program Files\php-x64\php.exe (там свой php.ini). 

Определить файл в проекте для исполнений (точка входа).

3. Настроить отладку при помощи XDebug. Скачать бинарник XDebug и поместить в папку C:\Program Files\php-x64\ext и переименовать его в php_xdebug.dll. Добавить в php.ini строку в конец текста zend_extension=php_xdebug.dll

Остальные расширения (ext) подключать тем же образом.

HumanEmulator Планировщик задач (Task Scheduler)

Особенности работы с «Планировщиком задач» от Windows.

Задача: Запускать HumanEmulator с определенным скриптом каждые 5 минут.

Исходные данные:

Путь к exe файлу HumanEmulator :

C:\XWeb\Human Emulator Advanced 4.9.26\XWeb Human Emulator MT UE.exe

Путь к файлу скрипта:

C:\XWeb\Human Emulator Advanced 4.9.26\My Scripts\44bu\44bu.php

Дополнительные условия:

Порт для запуска: 7010

Состояние окна: при запуске сразу сворачивать в трей

Решение:

1. Запустить приложение «Планировщик заданий»

В панели пуск в поиске набираем текст «Планировщик заданий»

Найти Планировщик заданий
2. Создать новую задачу
В правой панели программы нажимает на позицию в меню: «Создать задачу…»

Заполняем поле «Имя задачи» и ставим галочку «Выполнить с наивысшими правами»

Жмем OK

Создать триггер НаСоздать задачу Планировщик заданий Windows

3. Создать триггер

Переходим на таб «Триггеры» , жмем кнопку «Создать».

Создать триггер Планировщик заданий Windows

4. Настроить триггер

Выбираем опции

«Ежедневно», «Включено», «Повторять каждый 1 день», «Повторять задачу каждые» 5 мин.»

Жмем OK

Настроить триггер Планировщик заданий Windows

5. Создать действие

Переходим на таб «Действия» , жмем кнопку «Создать».

Создать действие Планировщик заданий Windows

6. Настроить действие

Выбираем опцию «Запуск программы»

Жмем кнопку «Обзор» и выбираем exe файл HumanEmulator в нашем случае

«C:\XWeb\Human Emulator Advanced 4.9.26\XWeb Human Emulator MT UE.exe»

Значение аргументов «Добавить аргументы»:

/script:»C:\XWeb\Human Emulator Advanced 4.9.26\My Scripts\44bu\44bu.php» /port:»7010″  /in_tray:»true»

Дополнительная информация о аргументах .

Жмем OK

Настроить действие Планировщик заданий Windows

7. Настроить «Параметры»

Снять галки на позициях:

«Останавливать задачу, исполняемую дольше:», «Принудительная остановка программы, если она не прекращается по запросу».

Выбрать опцию : «Не запускать новый экземпляр»

Жмем OK

Настроить параметры Планировщик заданий Windows

Готово!

Важно:

1. Особенность работы в том , что экземпляр приложения должен быть запущен именно автоматически (Планировщиком).

Если приложение HumanEmulator уже запущено (вручную), то появится сообщение об ошибке (порт уже используется).

Код скрипта должен содержать в результате выполнения (последняя инструкция скрипта) операцию выгрузки приложения HumanEmulator $app->exitapp();

2. Дополнительно в табе «Журнал» можно проконтролировать возможные ошибки.

Порядок работы по командам от планировщика:

1. Первый Запуск
Первый запуск и работа скрипта HumanEmulator по команде от планировщика
2. Периодический запуск

а) Опция в настройках «Принудительная остановка программы, если она не прекращается по запросу» отключена и «Останавливать задачу, выполняемую дольше» отключена

Если Планировщик должен по расписанию запустить HumanEmulator, а он еще работает (в процессе работы), то запуск произведен не будет (запущен).
Если скрипт остановлен (кнопка stop или произошел сбой в работе скрипта), то запуск произведен не будет, так как HumanEmulator считается запущенным.

б) Опция в настройках «Принудительная остановка программы, если она не прекращается по запросу» включена или «Останавливать задачу, выполняемую дольше» включена со значением «1час».

Работа HumanEmulator будет прекращена (если экземпляр HumanEmulator уже  запущен) для нового запуска, если задача выполняется дольше условленного времени (1 час).

Возможные ошибки

  1. Важно создать и заполнить «Триггер» и «Действие»
  2. Важно корректно заполнить аргументы при запуске.
  3. Код скрипта в конечном итоге должен содержать инструкцию  $app->exitapp();

 

 

 

Функции по работе с файлами php вместо встроенных

На основе большого опыта работы с движком HumanEmulator, обратил внимание, что можно повысить отказоустойчивость, если не использовать функций работы с файлами, такие как: $textfile и $file_os . Это связанно с тем, что HumanEmulator принимает команды, как запросы серверу, соответственно большой поток таких команд может привести к критическим ошибкам в работе приложения, также наблюдается небольшой прирост к скорости исполнения.   Ниже представлен альтернативный список методов.


//Получить размер фала в байтах
$file_size = $file_os->get_size("res\\text.txt");

//Альтернатива
$file_size = filesize ("res\\text.txt");

//Получить число строчек в файле
$lines_count = $textfile->get_lines_count("data\\text.txt");

//Альтернатива
$lines_count = get_lines_count("data\\text.txt");

// Создание/Перезапись файла и запись в него текста
$textfile->write_file($file_path,$text,60);

//Альтернатива
file_put_contents($file_path, $text);

// Добавить текст в конец файла
$textfile->add_string_to_file("res\\file.txt", $text, 60) ;

//Альтернатива
file_put_contents($file, $str, FILE_APPEND | LOCK_EX);

//Проверить существование файла
if($file_os->is_exist("res\\text.txt")){
}

//Альтернатива
if(file_exists("res\\text.txt")){}

//Удалить файл
$file_os->delete("res\\text.txt"))

//Альтернатива
unlink("res\\text.txt");

//Заменить строки в файле на другое значение
$textfile->replace_string("data\\text.txt", "data\\text.txt", $old_value, $new_value, 60);

//Альтернатива (для одного и того же файла)
//read the entire string
$str=file_get_contents($file);

//replace something in the file string - this is a VERY simple example
$str=str_replace($oldValue, $newValue, $str);

//write the entire string
file_put_contents($file, $str);

//Получить n строчку из файла
$val = $textfile->get_line_from_file("data\\text.txt", false, $n, 60);

//Альтернатива
function get_line_from_file($file, $line_num, $delimiter="\n")
{
/*** set the counter to Zero ***/
$i = 0;

/*** open the file for reading ***/
$fp = fopen( $file, 'r' );

/*** loop over the file pointer ***/
while ( !feof ( $fp) )
{
/*** read the line into a buffer ***/
$buffer = stream_get_line( $fp, 9999, $delimiter );
/*** if we are at the right line number ***/
if( $i == $line_num )
{
/*** return the line that is currently in the buffer ***/
return rtrim($buffer);
}
/*** increment the line counter ***/
$i++;
/*** clear the buffer ***/
$buffer = '';
}
return false;
}

Список UserAgent ( UserAgent list)

//Код для получения 0 линии в файле
//Code for get 0 line number from target file
$user_agent= $textfile->get_line_from_file("data\\useragents.txt", false, 0, 60);

// Код для установки браузеру UserAgent в HumanEmulator
// Code for set UserAgent ащк IE in HumanEmulator
$browser->set_user_agent($user_agent);

Файл useragents.txt содержит список проверенных UserAgent ов
File useragents.txt contains list valid UserAgent s

Google drive

HumanEmulator примеры использования. Сборка тестов

clicktesting

В последних версиях HumanEmulator появилась возможность использовать .NET C#.

В продолжении темы использования .NET хочу представить исходный код UnitTest проекта сделанного на основе представленных в HumanEmulator новых классов.

К сожалению на текущий момент для ознакомления с функциональностью нужно производить ряд манипуляций что не вполне удобно. Я свел все методы в один проект и сделал это в понятном виде, в виде тестов.

На картинке пример полностью переделанного рабочего метода по этому образцу можно редактировать остальные методы.

Для работы тестов необходимо запустить экземпляр HumanEmulator настроенный на порт 7015.

При запуске в  режиме Debug в Output должен выйти следующий текст:

Запуск теста interface.click
1. Перейдем на полигон :
2. Щелкнем по элементу с href равным http://www.bigfozzy.com/
3. Кликнем по элементу с текстом SEO Магазин и выведем его координаты
Координаты x = -1 y = 615

Ссылка для скачивания : googledrive

Если запуск не происходит, то следует перезапустить HumanEmulator.

В настоящий момент наблюдаются сбои в работе на стороне сервера, то есть иногда может потребоваться перезагрузка компьютера.

Ознакомление HumanEmulator .NET C#

В последних версиях HumanEmulator появилась возможность использовать .NET C#.

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

XWeb\Human Emulator Advanced 4.9.19\Templates CSHARP — содержит проект .NET библиотеки для работы с сервером HumanEmulator.

XWeb\Human Emulator Advanced 4.9.19\Test Samples CSHARP — содержит примеры использования классов.

Каждый пример отдельный файл со статическим методом Main.

Для запуска необходимо:

  • создать проект консольного приложения, поместить туда класс из примера(можно заменить пустой файл Program.cs)
  • добавить проект XWeb\Human Emulator Advanced 4.9.19\Templates CSHARP \Lib\XHE\XHE\XHE.csproj
  • запустить приложение HumanEmulator. Класс \XWeb\Human Emulator Advanced 4.9.19\Templates CSHARP\Lib\XHE\XHE\XHEScript.cs содержит строку
    public static string server = «127.0.0.1:7017» — это локальный адрес нашего компьютера и порт 7017, что означает, что необходимо запущенный экземпляр HumanEmulator установить на 7017 порт (в данном случае).
  • теперь можно скомпилировать и запустить консольное приложение.

Вот проект-пример, что должно было получится скачать здесь.

Примечание: Думаю большинство пользователей не ведают о том что запускаемое приложение HumanEmulator является двойным. Одновременно клиент и управляемый сервер.

В запущенном экземпляре HEmulator можно наблюдать за переходами на целевом сайте. Если вы скачали пример то можно наблюдать такую последовательность работы:

1.Переход по адресу www.humanemulator.net/poligon/anchor.html

PoligonAnchorHref

2. Переход щелчком мыши по элементу с href равным http://www.bigfozzy.com/

SEomarket3. Переход на SEO Магазин

BigfozzycomА вот как будет выглядеть консоль вывода приложения:

ConsoleКак видно привычный процесс теперь происходит в двух окнах. HEmulator теперь сервер(управляемый) . А наше консольное приложение посылает ему команды (Request) и принимает ответы с данными о выполнении.

Вывод:

Плюсы:

  • Стал доступен  весь арсенал возможностей, что и был в базовой версии для .NET.
  • HumanEmulator теперь можно интегрировать в другие проекты
  • Теперь можно использовать мощь интегрированной среды разработки VisualStudio
  • Нет больше детских болезней php

Минусы:  Интерфейс пользователя меню и подсказки HumanEmulator в помощь разработчику тепtрь не доступны, но для серьезной работы это не будет помехой.