Полювання зомбі з хмари

На стрімко розвивається ринок PaaS приходять нові гравці. Не так давно в бій вступила IBM, представивши широкої программерской громадськості сервіс Bluemix. Просто хмарою з можливістю виконання Push-to-Deploy вже нікого не здивуєш, і тому конкуренція перемістилася із зони «подивіться, у нас теж є хмара!» у бік «у нас зручний інтерфейс, готові сервіси „з коробки“ — і все це абсолютно безкоштовно, поки ваш проект не виріс». Під катом я покажу, як за допомогою цієї сучасної системи PAAS і всього декількох рядків коду зробити сервіс, який буде уважно стежити за сайтом якийсь онлайн-ігри та надсилати push-повідомлення, як тільки з'явиться цікава новина.



Навіщо нам зомбі

Вибирати в якості прикладу програму «Hello world!» не дуже цікаво. Набагато цікавіше зробити мінімально працюючий прототип чого-небудь корисного. Наприклад, додаток для відстеження змін на сайті. В Інтернеті є безліч рішень для цієї задачі, починаючи з VisualPing і закінчуючи розширенням для Сhrome. Більшість з них хочуть грошей за швидкі повідомлення, грішать помилковими спрацьовуваннями — загалом, всім своїм видом показують що це хороша, годна ніша. В якості піддослідного кролика виступатиме моя улюблена гра з зомбі — треба ж якось привертати вашу увагу :)

Створюємо собі хмара

Наше рішення буде складатися з чотирьох частин:
  • Хмара Bluemix з push-повідомленнями напереваги.
  • Google Cloud Messaging для відправки повідомлень.
  • Android-додаток, отримує push-повідомлення.
  • Додаток Node.js в хмарі, уважно слідкуючий за сайтом і відразу ж відсилає повідомлення при появі новини.


Реєструємося в Bluemix, заходимо в панель управління і створюємо додаток Node.js. Для створення програми достатньо зайти в «dashboard», вказати ім'я для робочого оточення («space») і вибрати «create an app»:



В наступному вікні потрібно вибрати тип програми, для нашого прикладу це буде «mobile»:



За замовчуванням усі, що ми створюємо, буде жити в рамках free tier, тобто абсолютно безкоштовно. Гроші IBM захоче, якщо нам знадобиться багато пам'яті для додатків або ми станемо відсилати більше мільйона повідомлень в місяць і т. д.

Важливий момент: за замовчуванням додатком виділяється 128 мегабайт пам'яті, а безкоштовно можна використовувати до 512 Мб. Тому відразу після створення збільшити доступну додатком пам'ять, щоб в гонитві за зомбі у збирача сміття був оперативний простір при парсингу HTML.

Bluemix пропонує зручну абстракцію — теги, що дозволяють додатком підписувати та отримувати push-повідомлення тільки для потрібних подій. У нашому прикладі потрібно зайти в розділ «Notifications» і додати тег з ім'ям mytag.

Додаємо трохи Google Cloud Messaging

Щоб зробити приклад компактним, я покажу, як відсилати повідомлення тільки на Android, хоча Bluemix надає інструменти для роботи з iOS. Заходимо в Google Developers Console, створюємо додаток, активуємо для нього push-повідомлення і копіюємо в Bluemix параметри доступу:



Створюємо мобільний додаток

За останні кілька років засоби розробки мобільних додатків зробили крок далеко вперед. Я ще пам'ятаю ті часи, коли вдумлива налаштування Eclipse була вступним іспитом у світ Android-розробки. Зараз все не так: завантажуємо останню версію Android Studio, вибираємо Create New Project, потім Blank Activity — і програма готова. Можна запускати у емуляторі, можна встановлювати на телефон.

Конкуренція — хороша штука. У боротьбі за розробників сучасні хмарні рішення пропонують не тільки саму хмарну інфраструктуру, але й цілу екосистему, побудовану навколо неї. Включаючи корисні бібліотеки, наприклад, для роботи з push-повідомленнями. Щоб підключити в проект відповідну бібліотеку Bluemix, додамо потрібні залежності в Gradle:

трохи gradle
compile 'com.google.android.gms:play-services:+'
compile 'com.ibm.mobile.services:ibmbluemix:1.+'
compile 'com.ibm.mobile.services:ibmpush:1.+'



Android-додаток складається з компонентів, які обмінюються між собою повідомленнями. Код Bluemix міг виконувати необхідні завдання, потрібно зареєструвати в AndroidManifest.xml пару компонентів. Там же вкажемо необхідні додатком права:

трохи xml
<?xml version="1.0" encoding="utf-8"?>
<manifest>
...
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
...
<application>
...
<service
android:name="com.ibm.mobile.services.push.IBMPushIntentService">
</service>
<receiver
android:name="com.ibm.mobile.services.push.IBMPushBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.ibm.mbaas.push.android.sample" />
</intent-filter> 
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="com.ibm.mbaas.push.android.sample" />
</intent-filter>
</receiver>
</application>
</manifest>



Тепер можна додати власне код роботи з повідомленнями. Найпростіший код, який підпишеться на повідомлення з тегом mytag, необхідно вставити в MainActivity.java. У коді потрібно вказати «route», «app key» та «app secret», вони знаходяться в розділі «mobile options» на екрані управління додатком:

і невелика турка з java
import java.util.List;
import com.ibm.mobile.services.core.IBMBluemix;
import com.ibm.mobile.services.push.IBMPush;
import bolts.Continuation;
import bolts.Task;

public class MainActivity extends ActionBarActivity {

private IBMPush push = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.activity_main);

IBMBluemix.initialize(this,
"ff2c1e25-cc27-435d-b93a-a6b46fbc5056",
"14d8536672d53bb5eb9d1ba28e83292e6320495c",
"http://grigoryvp-test.eu-gb.mybluemix.net"
);
push = IBMPush.initializeService();
// Реєструємося в сервісі.
push.register("mydevice", "myuser").continueWith(new Continuation<String, Void>() {
@Override
public Void then(Task<String> task) throws Exception {
if (task.isFaulted()) return null;
// Отримуємо теги, на які підписані.
push.getSubscriptions().continueWith(new Continuation<List<String> Void>() { 
@Override
public Void then(Task<List<String>> task) throws Exception {
if (task.isFaulted()) return null;
// Ще ні на що не підписані?
if (task.getResult().isEmpty()) {
// Підписуємося на потрібний тег.
push.subscribe("mytag").continueWith(new Continuation<String, Void>(){
@Override
public Void then(Task<String> task) throws Exception {
return null;
}
});
}
return null;
}
});
return null;
}
});
}



Все, додаток готове. При запуску він підпишеться на push-повідомлення. Перевірити, що все працює, можна безпосередньо через веб-інтерфейс Bluemix: переходимо в розділ Notifications, вибираємо «Надіслати повідомлення» — і бачимо повідомлення в телефоні.



Стежимо за зомбі

Нам залишилося тільки навчити додаток Node.js (яке ми вже створили в Bluemix на першому кроці) стежити за вказаними сайтом і відправляти повідомлення за допомогою ще однієї бібліотеки від IBM. До речі, додаток можна редагувати онлайн або додати в git-репозиторій, розробляти і налагоджувати локально, а потім деплоить з допомогою git push. Для роботи з git сховище необхідно перейти на «dashboard», вибрати програму і в правому верхньому куті екрана програми вибрати «git add». Верхня частина інтерфейсу зміниться: тепер там буде відображатися url для кланирования git репозиторію і кнопка редагування коду в зручній онлайн IDE:



Для вивчення сайту скористаємося бібліотеками Request і Cheerio: перша дозволяє одним рядком відправляти HTTPS-запит та отримувати вміст веб-сторінки, а друга надає інтерфейс jQuery для пошуку потрібної інформації в отриманому HTML-коді. Якщо уважно подивитися на досліджуваний сайт через DevTools, то ми побачимо, що все найцікавіше змінюється по CSS-селектору .mc_2_news:first-child .mc_2_news_paragraph

Код, який буде опитувати сайт і відсилати push-повідомлення, виглядає наступним чином:

трохи javascript
var content = "";
var ibmpush = require('ibmpush');
var request = require('request');
var cheerio = require('cheerio');

function periodic() {
request("https://www.pi-online.ua/", function (err, res, body) {
if (!err && 200 == res.statusCode) {
var $ = cheerio.load(body);
var contentNew = $(".mc_2_news:first-child .mc_2_news_paragraph").text();
if (content && content !== contentNew) {
var message = {
"alert" : "something updated",
"url": "http://www.google.com"
};
req.ibmpush.sendBroadcastNotification(message, null).then(
function() { logger.info("send success"); },
function() { logger.info("send failure"); }
);
}
content = contentNew;
}
setTimeout(periodic, 60 * 1000);
});
}
periodic();



Деплоим його в хмару — і наше рішення готове. Через кілька секунд після оновлення сайту ви отримаєте повідомлення на мобільний телефон. Безкоштовно.

Висновки

Показане рішення максимально просте: немає роботи з базою даних, контролю помилок, відображення тексту новини та багатьох інших потрібних речей. Зате воно служить наочною демонстрацією того, наскільки далеко просунулися сучасні хмарні рішення. В рамках безкоштовних додатків IBM ви можете створювати сервіси, які працюють у цілодобовому режимі, відправляти сотні тисяч push-повідомлень, використовувати величезну кількість готових бібліотек. Боротьба за програмістів в самому розпалі, і, сподіваюся, здорова конкуренція принесе свої плоди і зробить нашу роботу простіше і зручніше.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.