Я низько кланяюсь Гугловським маркетологам. Це ж нада було звичайну річ так круто пропіарить. Так голосно кричати про Google Wave. Саме цю "чудову" штуку вони охрестили вбивцею почти, чатів, форумів і всього-всього іншого - я навіть дивуюсь, чому не сказали що Вейв вб'є весь інтернет. Хоча якщо подивитись детальніше, то вони зробили аналог IRC, що працює в Вебі і має прикольний API - ото й все. Немає в ньому нічого нового, нічого революційного. Хоча це не значить, що Вейв поганий... Він прикольний - якщо його правильно використовувати. І про саме правильно використання поговоримо...
Нашій групі Ukrainian Security Community(UASC) постійно доводиться обговорювати різні цікаві штучки, і спочатку для таких конференцій використовували IRC, потім Скайп, а зараз зупинилися саме на Вейві. Бо для обговорень в малому колі людей - Вейв поки що кращий. Раніше в нас кожного тижня був черговий, що приймав всю почтову кореспондецію і вирішував всі питання з нею пов'язані. Але зараз це в минулому - з Вейвом за декілька годин був накиданий робот, що приймає пошту і публікує її на Вейві, де вже ми разом можемо її обговорити. Це набагато класніше.
Логіка роботи Робота наступна:
Якщо нашого робота додано на якусь хвилю - то він пише одне повідомлення, чим інформує про свою працездатність.
Бот приймає всю почту, що приходить на його адресу і цю почту зберігає в память - в базу данних.
Якщо хтось опублікував якийсь бліп на хвилю, то бот перевіряє, чи є в памяті почтові листи - якщо є - то їх з бази видаляє і одночасно публікує на хвилі.
Також кожну хвилину, бот перевіряє чи є нові листи в базі данних, і якщо є то публікує їх, а з бази видаляє(хоча на практиці cron якось поганенько в вейві працює).
Тож ми тепер всю кореспонденцію що потрібна для всіх пересилаємо(включаємо переадресацію в Гмейлі) на нашого бота, а він вже її публікує.
Сама реалізація - дуже простенька. Потрібно лише на Google App Engine створити аплікацію з такими налаштуваннями:
Файл: app.yaml
application: super-mail-robot
version: 4
runtime: python
api_version: 1
inbound_services:
- mail
handlers:
- url: /images
static_dir: images
- url: /
static_files: index.html
upload: index.html
mime_type: text/html
- url: /_wave/robot/cron_bot
script: cron_bot.py
- url: /_wave/.*
script: mailbot.py
- url: /assets
static_dir: assets
- url: /_ah/mail/.+
script: handle_incoming_email.py
login: admin
В якому як бачимо ми створюємо перехватчики для Вейва, і для вхідної почти.
Далі, пишемо простого бота:
Файл: mailbot.py
import sys
from email_model import EmailModel
from waveapi import events
from waveapi import model
from waveapi import robot
def addBlip(context, string):
context.GetRootWavelet().CreateBlip().GetDocument().SetText(string)
def OnBlipSubmitted(properties, context):
for email in EmailModel.all():
t = "Sender: %s\n Date: %s\n\n Text: %s" % (
email.sender,
email.date,
email.body
)
addBlip(context, t)
email.delete()
def OnRobotAdded(properties, context):
addBlip(context, "I'm alive!")
if __name__ == '__main__':
myRobot = robot.Robot('super-mail-robot',
image_url='http://super-mail-robot.appspot.com/images/avatar.png',
version='7',
profile_url='http://super-mail-robot.appspot.com/')
myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
myRobot.RegisterCronJob("/_wave/robot/cron_bot", 60)
myRobot.RegisterHandler(events.BLIP_SUBMITTED, OnBlipSubmitted)
myRobot.Run()
Перехватчик, що буде отримувати емайл - ще простіший:
Файл: handle_incoming_email.py
import sys
from google.appengine.api import mail
from email_model import EmailModel
message = mail.InboundEmailMessage(sys.stdin.read())
EmailModel(
sender = message.sender,
date = str(message.date),
body = str(list(message.bodies('text/plain'))[0][1])
).put()
Повний код бота трішки нижче. Хоча на практиці використовувати не раджу без доробки - бо багів багато ;). Але як для прикладу розробки напевно підійде.
