Contenu connexe Similaire à Cоздание приложений со знанием Perl (20) Plus de Anatoly Sharifulin (20) Cоздание приложений со знанием Perl13. Веский повод для меня
Я переезжал с ЖЖ в Posterous, написал скрипты
переноса, но настроил кросс-постинг в Твиттер и
Фейсбук, получил реплаи «Толя, хватит!»
14. Существующее
аналоги — не очень
Медленные, неудобные, некрасивые, «криво» удаляют:
TwitWipe, TwitCide, Delete My Tweets, ...
17. Основные цели
• Приложение должно быстро удалять твиты
• Чёткое удаление
• Кросс-платформенное приложение:
iOS, Android, Web, ...
18. Серверное API —
привет, Perl!
Вся логика на стороне сервера (не Твиттер API),
клиенты — «тупые» интерфейсы
20. Опыта мало:
• Получение профилей пользователей
после авторизации через Твиттер на сайте
• Автоматический постинг в Твиттер
с помощью Net::Twitter(::Lite)
• AnyEvent::Twitter::Stream для риал-тайм
поиска (привет, @miyagawa!)
24. Идея — 2 независимые
асинхронные очереди
Получение таймлайна и удаление твитов,
используя REST Twitter API и асинхронные запросы
29. my $oauth = Net::OAuth::All->new(
consumer_secret => $conf->{consumer_secret},
consumer_key => $conf->{consumer_key },
token => $data->{access_token },
token_secret => $data->{access_token_secret},
);
31. Пропатчил модуль
Пользователь неавторизован:
ограничение150 запрос в час по IP,
а не 350 запросов в час на пользователя
35. my $delay = Mojo::IOLoop->delay;
for (@$tasks) {
...
$delay->begin;
$ua->get($url => {'Authorization' => $h} => sub {
my ($ua, $tx) = @_;
...
$delay->end( ... );
});
}
say $delay->wait;
38. Серверное API
Starman + Mojolicious
Mojolicious::Plugin::ApiHelpers
40. package App::Api;
use App::Base -controller,
with => [ 'App::Task', 'App::User' ];
sub error { shift->api_error(code => 1) }
sub any { shift->api_error(code => 5) }
...
1;
41. my $api = $r->route('/api')->to('api#', api => 1);
$api->route('/:action', action => qr/login|oauth/)->to;
my $apiu = $api->bridge->to('#auth', sign => 1);
$apiu->bridge('/task/new')->to('#task_check')
->route->to('#task_new');
$api->bridge('/')->to('#auth', maybe => 1, sign => 0)
->route->to('#hello');
42. 10 методов,123 теста
и документация
Большинство методов требуют авторизацию
пользователя и проверка sign (api_id + secret)
45. Покрыты все методы
Но нет никаких Mock-объектов, нет проверки,
правильный ли удалён диапазон твитов
46. Это трудоёмко
и излишне
Нет тестирования реального цикла:
постинг твитов — удаление — проверка
47. $t->get_ok("$url/")
->status_is(200)
->header_is('Access-Control-Allow-Origin', '*')
->json_content_is({hello => 'Hello DLTTR!'})
;
$t->get_ok(sign get => "$url/task/new")
->status_is(200)
->json_content_is({error => {msg =>
'User authorization failed', code => 2}})
;
48. Опасно тестить на
своём аккаунте :-)
— Тебе всё равно на свой Твиттер?
— Да!
— Давай я удалю все твиты?
— Нееееееееет!!!
49. Простой
debug-запросов
Для проверки качества работы «клиентов» удобно
логировать запросы с помощью
before_dispatch + after_dispatch
51. 1. Очередь работы
с таймлайном
Фильтрация и поиск нужных для удаления ID твитов,
пейджинг с помощью since_id и max_id
52. 1. Очередь работы
с таймлайном
Максимум 200 твитов за один запрос,
получение таймлайна один за одним,
проверка Rate Limit
53. «Ограничения»
Твиттера
Нет доступа ко всем твитам, только к последним
~3200 или не позднее определённой даты,
счётчик не-ноль и т.д.
54. 2. Очередь
по удалению твитов
Удаление «пачками» по 200 штук, нет ограничений.
«Отбойный молоток» или «Пушка» :-)
55. 2. Очередь
по удалению твитов
Обработка ошибок — не всегда ошибка
от Твиттер API означает невыполнение задачи
56. 3. Очередь
по отправке Push
Для iOS
Net::APNS::Persistent (ещё есть AnyEvent::APNS),
для проверки валидности токенов — Net::APNS::Feedback
57. 3. Очередь
по отправке Push
Для Android
WWW::Google::C2DM и WWW::Google::ClientLogin
59. Очень просто — mysql
Для хранения и очереди задач,
чтобы не парится совсем :-)
66. Сайт и веб-версия
• Starman + Mojolicious
• Mojolicious::Plugin::I18N2
— мой форк I18N-плаггина
• Mojolicious::Plugin::OAuth
— логин через Net::OAuth::All
• Mojolicious::Plugin::ShareHelpers
• Mojolicious::Plugin::UtilHelpers
78. Плюсы
• Получилось простое решение на Perl
(чистое время разработки ~30 часов)
• Быстро, очень быстро работает
• Чётко удаляет твиты
• Любое изменение, доработка,
расширение сервисов по удалению
— на стороне сервера, несложно
• Риал-тайм статистика
84. На #BarCampKrr
я рассказывал
«Разработка приложения:
от идеи до запуска»
(без упоминания о Perl)
85. И всё свелось к ...
Perl :-)
«На каком языке программирования пишите?»,
«А почему?»,
«Трудно ли найти таких программистов?» :-)