Pull to refresh

Уведомление о скачанных торрентах по SMS

Reading time3 min
Views3.3K
imageКак то вечером, ожидая загрузку любимых LOST и Breaking Bad, захотелось прогуляться по теплому вечернему Минску в сторону парка Горького. Но вот незадача, примерное время скачивания торрента прыгает то вверх, то вниз, объективный прогноз дождаться явно не получится.
Тут и пришла в голову, на мой взгляд, неплохая идея — почему бы не сделать уведомление о скачавшемся торренте по смске? Можно тогда вообще не заморачиваться томительным ожиданием и делать свои дела. :)

Вот что из этого получилось...

image

Так как я пользуюсь торрент-клиентом uTorrent, в моем распоряжении оказался Web API, через который можно получать информацию и управлять всеми параметрами клиента. Важно поставить галку Использовать Web-интерфейс и вторую галку для разрешения гостевого доступа.


Web API выдает все в формате json, так что проблем с разбором словаря практически не возникло. Меня интересовали торренты, которые, разумеется, еще не закачаны. Из всего, что передается — берем оставшееся время или процент выполнения (кому как нравится), проверяем его периодически, довольно просто:

ss := TStringStream.Create('');
idhttp1.get('http://localhost:' + port +'/gui/token.html', ss);
token := ss.DataString;
token := copy(token, pos(';''>', token) + 3, length(token));
token := copy(token, 1, pos('<', token) - 1);
url := 'http://localhost:' + port + '/gui/?token=' + token +
    '&list=1';
idhttp1.Get(url, ss);


* This source code was highlighted with Source Code Highlighter.


Далее парсим, что выдает торрент:
"torrents": [
[
ХЭШ (строка),
STATUS* (целое число),
ИМЯ (строка),
РАЗМЕР (целое число в байтах),
ПРОЦЕНТ ВЫПОЛНЕНИЯ (целое число на тысячу),
ЗАГРУЖЕНО (целое число в байтах),
РОЗДАНО (целое число в байтах),
...и так далее, смотрите лучше документацию, тут только кусочек.


Что в реальности выглядит как:
{"build":19648,"label": ['#$A']'#$A',"torrents": ['#$A#$A'["08FAC4E006CBEB094D637849EC89023778BE7B55",201,"Patch",19257463,0,0,0,0,0,0,-1,"",0,11,0,0,0,1,19257463]]'#$A',"torrentc": "1014060939"}'#$A

Ладно, список торрентов получили, надо теперь еще сделать отправку смски. Взял для этого готовую библиотеку AvisoSMS, к слову сказать, довольно просто ее оказалось прикрутить, не ожидал. Ссылка на DLL

login := Edit1.Text;
 pass := Edit2.Text;
 sAdress := Edit3.Text;
 dAdress := Edit4.Text;
 if (dAdress = '') then
  dAdress := 'AvisoSMS';
 SendMessage(Pchar(login), PChar(pass), PChar(dAdress), PChar(sAdress), PChar('Торрент ' + torName + ' закачан'));


* This source code was highlighted with Source Code Highlighter.


Тестим на чем-нибудь легковесном…


Ура-ура.

imageПозже решил доработать программу, чтобы она могла прятаться в трей, иметь достойное GUI, работать на отслеживание не только одного торрента. Вывел в отдельный поток проверку. Правда не смог победить кракозябры кириллических названий загрузок. Видимо сказывается WebUI самого торрент-клиента.

Результируя: Удивила хитрая система маркеров для безопасности, но, надо сказать, по делу. Авторизация — стандартная… 401, так что проблем не возникло ни с API торрента, ни с смсками. Написано в CodeGear Rad Studio 2007. Интерфейс, конечно, не ахти, но для первого раза сойдет. Готов развивать программу совместно со всеми желающими, исходники и работающая версия ниже.

Исходники: Скачать с Яндекс.Диска
Работающая версия в XP/Vista/7: Скачать с Яндекс.Диска


P.S. Буду признателен за инвайт автору статьи и этой программы — Олегу Танасюку. Написана специально для хабра.
Tags:
Hubs:
Total votes 128: ↑106 and ↓22+84
Comments64

Articles