11 July 2018, 20:13 MSK
Итак, снова пост про Телеграм. Я уже рассказывал, как отправлять сообщения от имени бота (в том числе, через прокси) и как сделать бота, который умеет принимать сообщения.
Отправлять сообщения в Телеграм от бота очень просто, но есть крайне неудобная проблема: из-за ограничений Telegram Bot API бот не может писать первым. То есть, сначала пользователь, которому вы собрались что-нибудь отправить, должен первым написать вашему боту любое сообщение. Это ограничение вполне разумно и предотвращает спам сообщениями от ботов, но очень мешает честным людям. Например, отправлять сервисные сообщения с информацией о заказе в интернет-магазине.
Решение этой проблемы только одно: не использовать ботов. Придётся всё делать с обычного аккаунта.
Копаться в подробностях телеграмовского протокола MTProto не нужно, как оказалось, всё уже сделано до нас. Для PHP существует чудесная библиотека MadelineProto. Её мы и будем использовать, ниже пошаговая инструкция.
8 July 2018, 03:20 MSK
Последнее время я увлекаюсь системами умного дома и хотел бы поделиться накопившимся опытом. В серии постов на эту тему я расскажу как о попытке сделать свою систему с нуля, так и о готовых решениях.
smart-home
Педантичный читатель обязательно придерётся к термину «умный дом». Конечно, правильнее называть это домашней автоматизацией, но я позволю себе использовать хоть и неверную, но устоявшуюся формулировку.
Сейчас на рынке присутствует очень много разрозненных решений. Ради эксперимента мне захотелось попробовать сделать что-нибудь самому.
Хороший проект всегда начинается с требований к конечному результату, вот мои:
  1. Нафиг километры проводов. У меня в квартире сделан ремонт, поэтому заново штробить стены желания совсем нет. Пусть умный дом будет обмениваться данными по радио-каналу.
  2. Нафиг бредовые идеи. Встроить айпад с интерфейсом в стену? Отправлять данные на народный мониторинг? Ну уж нет, спасибо, обойдёмся без этого.
  3. Нафиг пульты. Пульты всегда теряются и ломаются. Лучший пульт — тот, который всегда с тобой. Это телефон или часы (привет, Сири!). Также не забудем оставить классические элементы управления (настенный выключатель, ггг) для менее продвинутых домочадцев.
Теперь подумаем над архитектурой. Философия моего умного дома будет такой (привет, Юникс!):
Одно устройство должно делать только одну вещь, но должно делать её хорошо.
Такой подход лаконичен и позволяет не смешивать всё в одну кучу, не усложнять архитектуру системы, превращая устройства в многофункциональные комбайны.
2 July 2018, 00:16 MSK
Когда я был студентом и любил спорить с преподавателями, мой научный руководитель всегда просил меня не делать преждевременный рефакторинг кода. Потому что отрефакторить работающий код можно за конечное число шагов, а сколько времени займёт превращение неработающей, но отрефакторенной программы в работающую — неизвестно. Спустя годы я понял, что это работает не только в программировании, но и в жизни.
5 June 2018, 18:22 MSK
Я уже писал о том, как отправить сообщение из PHP в Телеграм и как сделать своего Телеграм-бота, принимающего сообщения. Тема оказалась довольно популярной, но в связи с известными событиями у некоторых пользователей всё же могут возникать трудности. Недавно мне написал один их моих читателей и пожаловался, что мой скрипт из предыдущего поста у него на хостинге не работает.
Если вы не читали предыдущий пост по теме, сначала рекомендую прочитать его: https://kirkizh.ru/2018/04/telegram-php/.
Для решения этой проблемы проще всего использовать прокси сервер. Учтите, что прокся нужна обычная (HTTP/SOCKS), не специфичная телеграмовская (MTProxy).
Итак, новый код:
<?php
// сюда нужно вписать токен вашего бота define('TELEGRAM_TOKEN', '999999999:XXXXXXXXXXXXXXXXXXXXXXXXXXXX');
// сюда нужно вписать ваш внутренний айдишник define('TELEGRAM_CHATID', '99999999');
message_to_telegram('Привет!');
function message_to_telegram($text) {     $ch = curl_init();     curl_setopt_array(         $ch,         array(             CURLOPT_URL => 'https://api.telegram.org/bot' . TELEGRAM_TOKEN . '/sendMessage',             CURLOPT_POST => TRUE,             CURLOPT_RETURNTRANSFER => TRUE,             CURLOPT_TIMEOUT => 10,             CURLOPT_POSTFIELDS => array(                 'chat_id' => TELEGRAM_CHATID,                 'text' => $text,             ),             CURLOPT_PROXY => 'host:port',             CURLOPT_PROXYUSERPWD => 'login:password',             CURLOPT_PROXYTYPE => CURLPROXY_HTTP,             CURLOPT_PROXYAUTH => CURLAUTH_BASIC,         )     );     curl_exec($ch); }
Чтобы всё заработало, вам нужно прописать настройки вашей прокси:
  • CURLOPT_PROXY — адрес и порт, например, 127.0.0.1:3128;
  • CURLOPT_PROXYUSERPWD — логин и пароль, разделённые двоеточием;
  • CURLOPT_PROXYTYPE — тип прокси, одна из следующих констант: CURLPROXY_HTTP, CURLPROXY_SOCKS4, CURLPROXY_SOCKS5, CURLPROXY_SOCKS4A или CURLPROXY_SOCKS5_HOSTNAME;
  • CURLOPT_PROXYAUTH — метод авторизации, одна из следующих констант: CURLAUTH_BASIC и CURLAUTH_NTLM.
Если вы не знаете тип прокси и/или метод авторизации, попробуйте подобрать их методом перебора.
Если у вас остались вопросы, пишите их в комментарии или мне в Телеграм: @vkirkizh. Также подписывайтесь на мой канал: https://t.me/kirkizh. :-)
30 May 2018, 22:33 MSK
На днях я столкнулся с неочевидной проблемой с моим макбуком. Очередное обновление макоси, ничего необычного. Обновление скачалось, попросило перезагрузку, я согласился, но мак перезагружаться не хотел. Вместо этого показывал чёрный экран и курсор мыши. Я принудительно выключил/включил компьютер кнопкой питания и повторил процесс. Неудачно. Также оказалось, что простые перезагрузка/выключения мака перестали работать, симптомы те же.
Обычно при проблемах с маком рекомендуют сбросить SMC и сбросить NVRAM. Не помогло. Я позвонил в службу поддержки Эппл, те развели руками и посоветовали переустановить OS X. Переустаналивать систему мне не хотелось. Перезагружать компьютер всё время хард резетом и оставлять его без обновлений тоже.
Я перепробовал кучу разных вариантов, но всё тщетно. Уже отчаявшись найти простое решение проблемы, я заглянул в консоль и увидел там кучу ошибок, возникавших каждую секунду:
LaunchServices: Database mapping failed with result -10813, retries = 2
Очевидно, была какая-то связь. В рунете решение проблемы мне найти не удалось, но долгое гугление привело меня на форум Эппл. Оказалось, что проблема в фигне, которая называется Launch Services. Иногда ломается их база данных, и её необходимо пересоздать. Для этого необходимо открыть программу Terminal и выполнить две команды:
sudo mkdir /private/var/db/lsd
sudo /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -seed -lint -r -f -v -dump -domain local -domain system -domain user -domain network
В процессе вас попросят ввести пароль пользователя, потому что эти команды выполняются от имени администратора. В результате будет пересоздана БД служб запуска, и макось начнёт нормально перезагружаться и выключаться.
19 April 2018, 20:28 MSK
Любой хороший предприниматель знает, как важно в бизнесе иметь как можно больше информации о своих клиентах. Одна из таких полезных вещей — источник клиента: с какого канала продаж он пришёл, по какому объявлению кликнул, какой поисковый запрос ввёл и так далее. Поэтому любой хороший сайт отслеживает эти и другие данные, собирая статистику. Эту статистику можно передавать в CRM-систему и использовать для анализа эффективности рекламных компаний.
Если клиент заполняет форму непосредственно на сайте — запомнить данные об его источнике не составляет труда. Но что делать в том случае, если клиент, перейдя на сайт, не заполнял никаких форм, а просто позвонил? Данные с сайта не передаются в телефон, поэтому по-простому узнать, откуда пришёл клиент, совершивший звонок, не выйдет.
Для решения этой проблемы есть одна хитрость, которая называется коллтрекинг. Обычно, когда говорят про коллтрекинг, подразумевают дорогие сервисы с необходимостью накупить кучу телефонных номеров, которые будут подсовываться посетителям сайта в зависимости от источников (статический коллтрекинг) или сессий (динамический коллтрекинг). Всё это влетает в копеечку. Я расскажу, как сделать простой коллтрекинг бесплатно своими руками без регистрации и без смс, не нужно будет даже дополнительные номера покупать. Отмечу, метод не волшебный и обладает как плюсами, так и минусами.
Сегодня очень много людей ищет товары и услуги прямо со смартфонов. Почти половина трафика в рунете — с мобильных устройств. Важным моментом здесь является то, что люди, зайдя на сайт со смартфона, не перепечатывают телефонный номер в звонилку, а просто кликают по нему. Суть метода заключается в том, чтобы отследить клик по телефонному номеру на сайте, запомнить нужные данные о посетителе по клику, а затем связать звонок с кликом на основе временных меток.
16 April 2018, 23:52 MSK
Сегодня Роскомпозор начал думать, что заблокировал мессенджер Телеграм.
Около полутора лет назад я рассказывал, как сделать своего бота для Телеграма, который умеет принимать сообщения и отвечать на них. Но очень часто встаёт другая задача: необходимость отправлять какие-нибудь сообщения или уведомления от бота самому себе прямо из скрипта на PHP (например, с сайта). Это могут быть заявки из формы на сайте, сообщения мониторинга чего-либо, уведомления от каких-нибудь скриптов, ежедневные/еженедельные отчёты и т.д. Можно придумать тысячу сценариев, как это использовать.
Для начала необходимо создать бота. Как я уже писал в прошлой заметке, управление вашими ботами происходит через другого спецбота @BotFather. Для начала нужно добавить его в контакты и что-нибудь ему написать, после чего вы увидите список доступных команд. Отправьте боту команду /newbot, затем напишите в чат имя вашего бота, затем напишите уникальный логин вашего бота (должен заканчиваться на «bot»). В ответ вы получите авторизационный токен — сохраните его и никому не сообщайте. Этот бот будет отправлять нам сообщения.
У Телеграма довольно жёсткая политика конфиденциальности (поэтому там нет спама, как во всяких Вайберах), из-за которой ботом запрещено отправлять сообщения живым пользователям до тех пор, пока пользователь сам не начал беседу с ботом. Поэтому напишите любое сообщение вашему новому боту. Сделать это нужно всего один раз.
Далее необходимо узнать ваш внутренний айди в Телеграме. Проще всего это сделать с помощью бота @ShowJsonBot. Напишите любое сообщение этому боту. В ответ вам придут некие данные в формате JSON. Найдите поле chat, а в нём поле id. Это и есть ваш внутренний айдишник.
Теперь у нас всё готово для отправки сообщений из PHP прямо в Телеграм. Это можно сделать при помощи следующего скрипта:
<?php
// сюда нужно вписать токен вашего бота define('TELEGRAM_TOKEN', '999999999:XXXXXXXXXXXXXXXXXXXXXXXXXXXX');
// сюда нужно вписать ваш внутренний айдишник define('TELEGRAM_CHATID', '99999999');
message_to_telegram('Привет!');
function message_to_telegram($text) {     $ch = curl_init();     curl_setopt_array(         $ch,         array(             CURLOPT_URL => 'https://api.telegram.org/bot' . TELEGRAM_TOKEN . '/sendMessage',             CURLOPT_POST => TRUE,             CURLOPT_RETURNTRANSFER => TRUE,             CURLOPT_TIMEOUT => 10,             CURLOPT_POSTFIELDS => array(                 'chat_id' => TELEGRAM_CHATID,                 'text' => $text,             ),         )     );     curl_exec($ch); }
На этом всё. Если вы хотите, чтобы я сделал бота в Телеграме или другом мессенджере специально для вас, напишите мне: @vkirkizh.
1 April 2018, 22:20 MSK
Когда я нахожусь за границей в поездках, мне необходим мобильный интернет (смотреть карты, строить маршруты, гуглить инфу про места, читать отзывы, искать рестораны, отвечать на почту и т.д.), также мне необходимо оставаться на связи по телефону на своём номере.
Покупать каждый раз местную симку в каждой новой стране — плохая идея. Во-первых, местная симка решает только проблему с интернетом, но не с разговорами. Во-вторых, как правило, все они имеют предоплаченный тариф — то есть, надо заранее решить, сколько ты потратишь денег, неиспользованные средства сгорят. В-третьих, надо тратить время, специально куда-то ехать, чтобы купить эту симку. Не вариант.
Поэтому раньше я всегда пользовался дорогим роумингом. Недавно я был в Берлине и затестил новый способ оставаться всегда онлайн за границей, который гораздо бюджетнее.
Сначала решаем проблему с тем, как дёшево звонить и принимать звонки на своём номере за пределами России. Для этого нам нужен оператор Мегафон (увы, другие не подойдут). Я на нём уже более 15-ти лет, так что всё ОК. У Мегафона есть специальная услуга Мультифон (именно обычный Мультифон, а не Мультифон-Бизнес). Она бесплатная и позволяет совершать/принимать звонки, а также отправлять/принимать смски через интернет вместо GSM по своему домашнему тарифу (по сути, это превращает обычный телефон в IP-телефон). Для этого надо поставить специальное приложение Emotion (iOS, Android). Выглядит оно вот так:
emotion
Переключатель в правом верхнем углу позволяет выбирать между GSM-сетью и интернетом. На скриншоте выбран режим IP-телефонии (звонки и смс через интернет). В этом режиме, где бы мы ни находились, звонки и смски будут стоить столько же, сколько в домашнем регионе без всякого роуминга. Главное, чтобы был интернет. Звонить и отправлять смс нужно именно через это приложение, также в это приложение будут поступать входящие (на айфоне можно не бояться закрыть приложение — у меня всё отлично работало, звонки приходили даже с выключенным приложением, про андроид не в курсе). Если рядом есть вай-фай — больше ничего не нужно. Но, если не сидеть целыми днями в отеле или ресторанах, то вай-фая рядом не будет.
Теперь решаем проблему с дешёвым мобильным интернетом. Я перепробовал несколько вариантов и остановился на международной симке, которая называется Дримсим. Сама симка Дримсим с доставкой стоит 10€. Весь прикол в том, что во многих странах интернет через неё стоит очень дёшево (по сравнению с роумингом). Например, почти во всей Европе 1 гигабайт трафика будет стоить 10€. При этом, тарификация покилобайтная, и нет никаких ограничений (в том числе, на раздачу интернета на другие устройства в режиме модема). Одной симкой с одним счётом можно пользоваться в любой стране. У Дримсима есть своё удобное приложение:
drimsim
Работает это следующим образом. Вы заказываете симку, вам её привозят курьером (если заказать по специальной ссылке, то и мне, и вам дадут по 5€ на счёт). Далее пополняете счёт (это можно сделать любой банковской картой). Перед поездкой вынимаете вашу мегафоновскую симку и втыкаете дримсимовскую, включаете в мегафоновском приложении режим IP-телефонии. Профит. Если разговаривать по телефону через интернет через это приложение, трафика тратится очень немного. У меня получалось меньше 100 мегабайт за час разговора (это меньше 1€). Раньше я тратил минимум 10€ в день на роуминг, а теперь столько же трачу за целую короткую (4-5 дней) поездку.
Через Дримсим также можно совершать звонки напрямую, но это не имеет смысла. Во-первых, звонки будут идти с британского (+44) номера. Во-вторых, цены на звонки совсем не такие интересные, как цены на интернет.
Я пользовался связкой Дримсим+Мегафон в Германии и остался полностью доволен. Но у данного решения есть небольшой минус: Мегафон блокирует смски от банков в своём приложении. Частично это решается включением пуш-уведомлений, но не все банки так умеют. Плюс обычно подтверждения операций покупок по карте в интернете всё равно приходят в виде смсок. Также, к сожалению, далеко не во всех странах поддерживается LTE.
16 March 2018, 20:40 MSK
Дахау — один из первых концентрационных лагерей нацистов, находится недалеко от Мюнхена — столицы Баварии. Сейчас на этом месте открыт мемориальный комплекс в память о жертвах и узниках лагеря. Я побывал здесь во время поездки в Германию в августе 2017.
IMG_6393
11 March 2018, 03:40 MSK
Я долго думал, стоит ли публиковать в блоге не свой код, и решил, что иногда всё-таки стоит, потому что решение описываемой в этом посте проблемы в рунете мне найти не удалось.
Сразу к делу. В мобильном Сафари уже несколько Айосов подряд есть такая замечательная кнопка (вызывается по долгому нажатию на значок перезагрузки страницы в адресной строке):
request-desktop-site
Такая же кнопка есть в Хроме на Андроиде и Айосе. В английском интерфейсе называется «Request Desktop Site».
К сожалению, работает она по-дурацки: когда нажимаешь эту кнопку, браузер просто подменяет свой юзер-агент с мобильного на десктопный, и всё. Кто-нибудь верстает сайты так, чтобы подсовывать браузерам разные стили в зависимости от юзер-агента? Обычно нет.