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 на телефон и получаем оповещения. Все пользователи приглашенные в этот канал будут получать мгновенные оповещения.

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

Форма оплаты на кошелек Яндекс деньги для сайта без SSL на php

Задача

Устроить автоматический прием денег на свой яндекс кошелек.

Вводные:

  • Платеж должен быть привязан к email пользователя,
  • Сайт работает на PHP 5.3
  • Операция должна начислять дни в соответствии с выбранным периодом (1-3 месяцев)
  • Следует использовать существующую базу данных на WordPress сайте.

К сожалению рабочий сайт нам не может быть полезен во время тестирования так как наш хостер предусмотрительно отключил логирование «наружу», поэтому я развернул полную копию своего сайта локально с помощью приложения OpenServer, по адресу localhost.

Документация

Для сайта на http (в отличие от https) извещение о платеже приходит в сокращённом виде

https://money.yandex.ru/doc.xml?id=526991&from=isrch :

operation_id = 441361714955017004
notification_type = card-incoming
datetime = 2013-12-26T08:28:34Z
sha1_hash = ac13833bd6ba9eff1fa9e4bed76f3d6ebb57f6c0
sender =
codepro = false
currency = 643
amount = 98.00
withdraw_amount = 100.00
label = ML23045

Существует тестовая кнопка от Яндекса, которая будет посылать запрос на указанную нами php страницу https://money.yandex.ru/myservices/online.xml , здесь нам нужен СЕКРЕТ и нужно указать адрес на нашу страницу. К сожалению кнопка «Протестировать» в целом бесполезна.

Реализация. Форма для создания POST данные

Для тестирования нужно создать html форму в соответствии с рекомендациями назвал index1.html, она содержит ровно тот набор данных что нам необходим.

Код index1.html:

Посмотреть код

<form action="payment.php" method="post" >

<br>operation_id:<input type="text" name="operation_id" value="test-notification" >
<br>notification_type:<input type="text" name="notification_type" value="p2p-incoming" >
<br>datetime:<input type="text" name="datetime" value="2017-01-06T19:43:37Z" >
<br>sender:<input type="sender" name="sender" value="41001000040" >
<br>sha1_hash:<input type="text" name="sha1_hash" value="2e0f6de10d9f621b80e97cf64a424e54376c883" >
<br>codepro:<input type="text" name="codepro" value="false" >
<br>currency:<input type="text" name="currency" value="643" >
<br>amount :<input type="text" name="amount" value="49" >
<br>withdraw_amount:<input type="text" name="withdraw_amount" value="50" >
<br>label:<input type="text" name="label" value="1@gmail.com:1_month" style="width: 300;">
<button type="submit">Отправить</button>

</form>

Отдельно отмечу label он содержит два значимых значения – это email пользователя и условный флаг-значение периода оплаты в моем случае 1 месяц, с разделителем – двоеточие.

Далее код файла php для приема оповещений о платеже. Необходимо добавить поле vip типа DateTime в таблицу users

Код payment.php

Посмотреть код

//Подключаем функции работы с БД WordPress

require_once( dirname(__FILE__) . '/wp-load.php' );

$yandex_secret = '*******';//Секретный код яндекса
global $wpdb;//поле  для работы с БД  
$label = esc_sql(trim($_POST['label']));            // Метка платежа. <E-mail>:<TARGETS>
$parts = explode(':', $label, 2); //Разбиваем label
$notification_type = $_POST['notification_type']; // p2p-incoming / card-incoming - с кошелька / с карты
$operation_id = $_POST['operation_id'];      // Идентификатор операции в истории счета получателя.
$amount = $_POST['amount'];            // Сумма, которая зачислена на счет получателя.
$withdraw_amount = $_POST['withdraw_amount'];   // Сумма, которая списана со счета отправителя.
$currency = $_POST['currency'];            // Код валюты — всегда 643 (рубль РФ согласно ISO 4217).
$datetime = $_POST['datetime'];          // Дата и время совершения перевода.
$sender = $_POST['sender'];            // Для переводов из кошелька — номер счета отправителя. Для переводов с произвольной карты — параметр содержит пустую строку.
$codepro = $_POST['codepro']; // Для переводов из кошелька — перевод защищен кодом протекции. Для переводов с произвольной карты — всегда false.
$user_email = $parts [0];
$targets = $parts[1]; //
$sha1_hash = $_POST['sha1_hash']; // SHA-1 hash параметров уведомления.

//Платеж с кодом протекции, автоматически обработать не можем
    if ($r['codepro'] === true) {
exit ($user_email, $email_subject, 'Ошибка! Платеж с кодом протекции, автоматически обработать не можем');
}

// проверка хеш
$data_hash = $notification_type.'&'.$operation_id.'&'.$amount.'&'.$currency.'&'.$datetime.'&'.$sender.'&'.$codepro.'&'.$yandex_secret.'&'.$label;

if (hash("sha1", $data_hash) != $sha1_hash)  {
exit("SHA верификация не произошла = " . $message);
}//Проверям соответсвие суммы периодуif($targets == "1_month" && $withdraw_amount == '50.00' ||  $targets == "3_month" && $withdraw_amount == '130.00'){}
else{
exit('Ошибка! Неверная сумма для указанного периода : '.$withdraw_amount.' '.$label);
}//Получаем поле из БД$vip = $wpdb->get_var("SELECT vip FROM $wpdb->users WHERE user_email = '".$user_email."'");

$days = "31 day";
if($targets == "1_month"){
$days = "31 day";
}
else if($targets == "3_month"){
$days = "93 day";    }

$date_time_now = new DateTime();

if(!empty($vip))
{
$vip = date_create_from_format('Y-m-d H:i:s', $vip);//так как это строка
if($vip < $date_time_now) {
$vip = $date_time_now;        }
}
else  {        $vip = $date_time_now;
}
$vip->modify("+".$days);

$r = $wpdb->query("UPDATE $wpdb->users SET last_operation_id = '" . $operation_id . "', vip = '" . $vip->format('Y-m-d H:i:s') . "'  WHERE user_email = '$user_email' LIMIT 1");
if (!$r) {
exit("Ошибка в обновление данных о клиенте!");
}exit('OK');

Код упрощен, значение хэш для теста необходимо определить самостоятельно.Форма для создания кастомных данных для сервиса Яндекс деньги
 

Посмотреть код

<form class="form" method='POST' action="https://money.yandex.ru/quickpay/confirm.xml">
<input type='hidden' name='receiver' value='410000000000000'>
<input type='hidden' name='formcomment' value='Оплата VIP'>
<input type='hidden' name='short-dest' value='Оплата VIP'>
<input type='hidden' name='quickpay-form' value='donate'>
<input type='hidden' name='comment' value='Оплата VIP статуса>
<input type='hidden' name='need-fio' value='false'>
<input type='hidden' name='need-email' value='false'>
<input type='hidden' name='need-phone' value='false'>
<input type='hidden' name='need-address' value='false'>
<input id='label' type='hidden' name='label' value=''>                    <input class='input__control' id='email' value='' maxlength='256'><div>
<div>
<label class='label-text'>VIP статус на</label>
</div>
<label class='form-label'>
<input id='radio_1_month' name='targets' value='1_month' type='radio' checked>
<span class='label-text'>1 месяц</span>
</label><br>
<label class='form-label'>
<input id='radio_3_month' name='targets' value='3_month' type='radio'>
<span class='label-text'>3 месяца</span>
</label><br>
</div><input name='sum' aria- value='50.00' readonly><div >
<label >
<input name='paymentType' value='PC' type='radio' checked>
<span class='label-text'></span>
<span>
<i aria-hidden='true'></i>
</span>
</label><br>
<label >
<input name='paymentType' value='AC' type='radio'>
<span class='label-text'></span>
<span>
<i aria-hidden='true'></i>
</span>
</label><br>
<label >
<input name='paymentType' value='MC' type='radio'>
<span class='label-text'></span>
<span>
<i aria-hidden='true'></i>
</span>
</label>
</div><button type='submit' autocomplete='off' tabindex='0'>
<span class='button2__text'>Оплатить</span>
</button></form> /Установить сумму при перемене радио батона периода
function set_sum_event()
{
var targets = document.getElementsByName('targets');

for(i = 0;i < targets.length; i++)
{
if(targets[i].checked) {
var targets_val = targets[i].value;
console.log(targets_val);
var sum_element = document.getElementsByName('sum')[0];
if (targets_val === '1_month') {
sum_element.value = '50.00';
}
else if (targets_val === '3_month') {
sum_element.value = '130.00';
}
break;
}
}
}

Скрипт для отработки переключающихся радио кнопок:

Посмотреть код

<script>
 //Установить сумму при перемене радио батона периода
            function set_sum_event()
            {
                var targets = document.getElementsByName('targets');

                for(i = 0;i < targets.length; i++)
                {
                    if(targets[i].checked) {
                        var targets_val = targets[i].value;
                        console.log(targets_val);
                        var sum_element = document.getElementsByName('sum')[0];
                        if (targets_val === '1_month') {
                            sum_element.value = '50.00';
                        }
                        else if (targets_val === '3_month') {
                            sum_element.value = '130.00';
                        }
                        break;
                    }
                }
            }
window.onload = function() {

var radio_1_month = document.getElementById('radio_1_month');
radio_1_month.addEventListener('change', set_sum_event);

var radio_3_month = document.getElementById('radio_3_month');
radio_3_month.addEventListener('change', set_sum_event);

var radio_6_month = document.getElementById('radio_6_month');
radio_6_month.addEventListener('change', set_sum_event);

var form = document.getElementsByClassName('form')[0];

form.addEventListener('submit', function(e) {
if (/\S+@\S+\.\S+/.test(document.getElementById('uniq1').value)){

//Заносим 2 поля в label
var label = document.getElementsByName('label')[0];
var email = document.getElementById('uniq1');
var email = email.value;

var targets_val = '';
var targets = document.getElementsByName('targets');
for(i = 0;i < targets.length; i++)
{
if(targets[i].checked) {
targets_val = targets[i].value;
break;
}
}
label.value = email + ':' + targets_val;
return true;
}

//Показываем popup так как email не указан
e.preventDefault();
var popup = document.getElementsByClassName('popup')[0];

popup.setAttribute('class', 'popup_to_top popup_theme_error');
});
}</script>

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();

Email checker by SMTP | Проверка списка email-ов на валидность

SMTP (Simple Mail Transfer Protocol) — это сетевой протокол, предназначенный для отправки электронной почты. Клиент и SMTP почтовый сервер обмениваются информацией пока соединение не будет закрыто.

Задача

Существует задача по проверке списка email-ов на валидность (существует ли указанный адрес). Очевидным способом ее решить, это послать по этим адресам письма и если сервер вернет ошибку типа «Mail delivery failed» значит таких адресов не существует. Однако почтовые серверы не любят подобные действия и могут забанить аккаунт.

Поиск решения

Потратил некоторое количество времени на поиск простого решения в функциональности smtp (тестировал для mail.ru и yandex.ru).

Существует две команды, которые могут быть выполнены без посылки письма серверу, это:

VRFY — команда для проверки существует ли пользователь с таким именем, если существует, то код возврата содержит  строчку с данными пользователя.
EXPN- команда для проверки членов почтовой группы, в случае удачного запроса вернет списко членов группы.
Обе команды должны поддерживаться сервером, однако из-за большой активности спамеров проверяющих огромные списки email-ов, на большинстве почтовиков более не работают.
http://stackoverflow.com/questions/3883518/can-i-check-if-an-email-address-exists-using-net
http://www.spamresource.com/2007/01/whatever-happened-to-vrfy.html

Что может предложить HumanEmulator?

К счастью web интерфейс сайтов позволяет сколько угодно запрашивать данные. Например если списки ваших email-ов относятся к серверам mail.ru, то можно воспользоваться Mail.ru агентом. В Агенте существует форма поиска пользователей зарегистрированных в mail.ru, а значит наша цель будет достигнута. Вводим значения в форму и парсим.

 

Ошибка в сборке CefSharp.Example.dll

Попробовал создать Release проекта сделанного на CefSharp для WPF.

CefSharp Quick-Start

Все работало в VisualStudio, однако когда я попробовал запустить скомпилированные файлы в другой папке, то возникла следующая ошибка(не находит папку с ресурсами):

System.IO.DirectoryNotFoundException не обработано
Message: Необработанное исключение типа "System.IO.DirectoryNotFoundException" в CefSharp.Example.dll

Потратив некоторое время я нашел решение. Идем в проект CefSharp.Example, там находим класс CefExample.cs находим там такой код:
settings.RegisterScheme(new CefCustomScheme
{
SchemeName = "localfolder",
SchemeHandlerFactory = new FolderSchemeHandlerFactory(rootFolder: @"..\..\..\..\CefSharp.Example\Resources",
schemeName: "localfolder", //Optional param no schemename checking if null
hostName: "cefsharp", //Optional param no hostname checking if null
defaultPage: "home.html") //Optional param will default to index.html
});

Ошибка здесь в задании пути к ресурсам, в итоге проект ищет ресурсы там где их нет. Заменим код на следующий (замена красным цветом):

string exePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
settings.RegisterScheme(new CefCustomScheme
{
SchemeName = "localfolder",
SchemeHandlerFactory = new FolderSchemeHandlerFactory(rootFolder: Path.Combine(exePath, "Resources"),
schemeName: "localfolder", //Optional param no schemename checking if null
hostName: "cefsharp", //Optional param no hostname checking if null
defaultPage: "home.html") //Optional param will default to index.html
});

Осталось еще установить в свойствах файлов (html, css, js файлы) ресурсов (папка /Resources ) значение «Копировать в выходной каталог» в значение «Копировать всегда».

Теперь код ищет ресурсы в папке с нашим приложением. Осталось перекомпилировать проект (в папке проекта теперь есть папка /Resources).

Теперь все будет работать.

P.S. Считаю что CefSharp самое адекватное решение для работы с chromium на данный момент.

Раскрутка сайтов

Популярная тема, у многих сегодня есть сайты и конечно необходимо их раскручивать.

Зачем раскручиваем сайт?

Безусловно сайт раскручивают в зависимости от задач, которые ставятся.
Задачи сайта:

  • продавать рекламу в виде баннеров и ссылок (показы рекламы и клики) для продажи чужого продукта или услуги;
  • сайт для продажи собственного продукта или услуги;
  • сайт социальный;
  • сайт личный, как правило блог. Привлечение читателей;
  • сайт, как часть сети сайтов ведущий на целевой сайт и так далее.

Однако цель раскрутки одна — привлечение посетителей.
Однако нужно ответить на главный вопрос: а что привлеченный человек должен делать на этом сайте, когда пришел на него?
Возможно нужно в первую очередь наполнить сайт качественным контентом. Это важно для любой задачи.

Как к раскрутке относятся поисковые машины?
Конечно поисковые машины к накрутке сайтов относятся очень плохо. Алгоритмы Гугла и Яндекса по выдаче сайтов в поисковых запросы претерпевают постоянные изменения, в связи с тем, что идет их совершенствование. На заре интернета сайтов было мало, а в настоящий момент объемы информации постоянно растут и пользователю трудно найти нужный сайт по своему запросу. Поисковые машины постоянно перемещают ваш сайт в списке выдачи (ранжируют), для того чтобы подсунуть более подходящие сайты. Если сайт стал не актуальным или был заподозрен в черной раскрутке есть шанс вылететь из выдачи. Гугл и Яндекс, очень не любят «внешние ссылки» (ссылки на другие сайты не помеченные тэгом rel=»nofollow»). Ну и конечно главная проблема информационного мира — это уникальность контента (содержимое сайта не должно содержать сочетание слов и выражений из других источников), такой сайт не имеет ценности никакой.

Мысли о раскрутке

Источником данных для подбора нужных ссылок является история запросов самого пользователя. Таким образом мы приходим к первой мысли — что большую роль играет история запросов пользователя.
Пользователь переходя по сайтам выдачи поисковой машины, если не обнаруживает в текущем сайте необходимой информации, практически сразу закрывает его и переходит на следующий. Второй мыслью — пользователь должен задержаться более 30 секунд времени на заинтересовавшем его сайте.
Если на первых 5-10 страницах выдачи поисковой машины, пользователь не находит нужной информации, то он изменяет запрос. Третья мысль — большую роль играет meta тэг keywords (ключевые слова) страницы вашего сайта, а точнее его содержимое. И если вы подобрали неудачные keywords у вас нет шансов удержаться в поиске. Подбор ключевых слов тесно связан с тематикой сайта и лучше, чтобы она была узко специализированна (Например «Ремонт Audi Москва»).
Ну и в подборе поисковой выдачи большую роль играет гео местоположение и язык пользователя.
Как видите все не очень просто.

Пишем бота

Распространенное решение «в лоб» — это написать бота, который будет прикидываться посетителем и будет пользоваться поисковиком и делать переход на сайт. Поисковик будет фиксировать переход на сайт и если таких переходов будет много, то поисковик даст этому сайт более высокий приоритет в поисковой выдаче. А для того, чтобы поисковик думал, что таких людей много бот будет заходить с разных прокси и чистить кукисы.

Есть пару моментов:
1) Прокси необходимо иметь «качественные» (платные). На бесплатные (и иногда платные) гугл реагирует всегда однозначно и ввод капчи ситуацию не исправляет;
Если гугл дал капчу на этот прокси, то использование его в следующие 24 часа не имеет смысла;
2) Количество запросов в день должно быть ограничено. Многократные запросы от одного прокси фиксируются поисковиком (при повторном и последующих проходах), за запрос также идет проход в «глубину» (последующие страницы), запрос за каждую страницу;
3) Если ваша задачей является раскрутка сайта, то бот должен находится на нем не менее 30 секунд. И чего-нибуть там делать, кликать и делать переходы (на картинке тепловая карта сайта от Яндекс метрика);
4) Зачищенные кукисы вызывает резонные подозрения у поисковика (пользователь без истории).

Если у вас сайт уже имеет аудиторию, то использую методы «черной оптимизации» могут привести к потере поисковой позиции.

Белая оптимизация

Про нее очень много написано. Скажу вкратце, главное это содержание сайта и цитируемость его другими сайтами. В Яндексе есть показатель ТИЦ(индекс цитирования), а в Гугле это PR (page rank) это сложные механизмы, с засекреченными алгоритмами. Получить цитируемость можно только со временем или позаботится об этом самостоятельно.

Итог

Многие методики раскрутки, которые вы найдете в интернете являются устаревшими и могут дать обратный эффект(хотя в свое время приносили большое количество просмотров). В любом случае работу по наполнению контентом сайта делать необходимо.

C# Decode cyrilic url

Получить user frendly строку из закодированного (для DNS сервера) кириллического урла.
Пример 1:
string res = GetCyrillicUrl(«http://xn--80abucjiibhv9a.xn--p1ai/%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D0%B5%D1%80%D1%81%D1%82%D0%B2%D0%BE»);
Console.WriteLine(res);// Output: http://минобрнауки.рф/министерство

Пример 2:
string res = GetCyrillicUrl(«https://news.mail.ru/politics/24609563/?frommail=1»);
Console.WriteLine(res);// Output: https://news.mail.ru/politics/24609563/?frommail=1

using System;
System.Globalization;

string GetCyrillicUrl(string url)
{
     Uri uri = new Uri(url);
     IdnMapping idn = new IdnMapping();
     string host = idn.GetUnicode(uri.Host);
     string query = HttpUtility.UrlDecode(uri.Query);
     return uri.Scheme + @"://" + host + uri.LocalPath + query;
}

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

Сложность возникла при получении цифры из строчки в Win-1251 для UTF-8 . Ситуация конечно надуманная, однако вспомним, что код для цифр и английских букв в кодировках единый.

$str = '№ 101';
preg_match_all('!\d+!', $str, $eNum1);
$eNum1 = (int)$eNum1[0][0];

где

$str -исходная строка содержащая цифру например ‘№ 101’;

$eNum1 — результат (будет 101).

Получить нулевой элемент из нулевого элемента массива [0][0].

Парсер вебмастера для WordPress

Простейший парсер для мастера Яндекс для владельцев WordPress сайтов для определения страниц сайта не попавших под индексирование (отсутствуют в поиске Яндекс). Скрипт для приложения HumanEmulator

В коде необходимо установить значение следующих полей:

//Название сайта (без http://www.)
$search_site="a.com";

//Ссылка на карту сайта в нашем случае на посты (статьи)
$browser->navigate('http://www.'.$search_site.'/sitemap_post.xml');

//Логин и пароль для вэбмастера для авторизации
$input->set_value_by_name("login","login_value");
$input->set_value_by_name("passwd","password");

Результатом работы скрипта является файл с ссылками на страницы не проиндексированные : res\\ya.».$search_site.».html

Порядок работы:

1) Сходить по ссылке на карту сайта и собрать все страницы нашего сайта

2) Зайти в Вэбмастер и собрать в разделе «Страницы в поиске» проиндексированные страницы

3) Сравнить коллекции ссылок, чтобы собрать массив ссылок (страниц) не входящих в индексацию яндекса

4) Получить названия страниц из поиска Гугл (в моем случае урл сайта)

5) Вывести результат в виде html файла и показать в браузере по умолчанию (кликабельные ссылки)

Скачать:

Гугл диск