http://mtaalamu.ru ru (http://mtaalamu.ru) (http://mtaalamu.ru) http://mtaalamu.ru http://mtaalamu.ru Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8533 /blog/coding/1912.html#comment8533 Sergei_T Tue, 12 Jul 2011 18:02:01 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8534 /blog/coding/1912.html#comment8534 Sergei_T Tue, 12 Jul 2011 18:04:49 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8535 /blog/coding/1912.html#comment8535 yababay Tue, 12 Jul 2011 18:18:52 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8536 /blog/coding/1912.html#comment8536 Sergei_T ]]> Tue, 12 Jul 2011 18:26:28 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8545 /blog/coding/1912.html#comment8545 illuthion Thu, 14 Jul 2011 02:45:09 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8539 /blog/coding/1912.html#comment8539 illuthion А вообще начинал писать его на чистом ruby но в итоге начались странные проблемы с тем, что не все сервера принимали отправленные сообщения…]]> Wed, 13 Jul 2011 20:17:18 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8540 /blog/coding/1912.html#comment8540 yababay ?!

XMPP-протокол довольно прост и понятен. Достаточно установить отладочную консоль в Pidgin или Psi — и детали общения клиента и сервера станут ясны. Но есть одно но: TLS-аутентификация. Вот она-то и не позволяет, например, с легкостью написать простое мобильное приложение для общения с тем-же Jabber-ботом. Есть, например, мобильный клиент MGtalk. Заглянул в исходный код — там ужас. Да и яндексовский мобильный клиент работает очень нестабильно: постоянно переустанавливает соединение и даже отправляет телефон в аут (внезапно экран гаснет и телефон выключается).]]>
Wed, 13 Jul 2011 20:34:18 +0400 comments
Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8541 /blog/coding/1912.html#comment8541 illuthion
Но писал действительно на bash, уж больно он мне нравится своей простотой и адекватностью]]>
Wed, 13 Jul 2011 20:37:52 +0400 comments
Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8542 /blog/coding/1912.html#comment8542 Sergei_T Wed, 13 Jul 2011 21:10:36 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8543 /blog/coding/1912.html#comment8543 illuthion Wed, 13 Jul 2011 21:12:55 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8544 /blog/coding/1912.html#comment8544 yababay Wed, 13 Jul 2011 23:27:55 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8546 /blog/coding/1912.html#comment8546 illuthion
Теория:
Для работы бот использует freetalk и sendxmpp, соответственно и первое и второе должно быть настроено на JID бота. freetalk запускается перед запуском бота.
Бот(inc) запускается с 2 параметрами: JID бота и JID администратора(того от кого будет принимать команды).
После запуска идет бесконечный цикл на чтение последней стройки из истории freetalk и пределение новая это строка или нет. Если строка новая то JID и содержание передаются на управление другому скрипту(out) который отрезает от содержания команду а все остальное использует как параметры(было нужно для создания заметок и управления торрентами). Собственно потом команда уходит в case и идет выборка действия, ответ отсылается пользователю по sendxmpp. Разделение на 2 скрипта было сделано для того что-бы можно было править список команд не перезапуская бот. В принципе ничто не мешает заставить бота отсылать присланное сообщение в консоль и возвращать результат.

Код:
inc
#!/bin/bash

bot=$1
admin=$2

str=`tail -n1 ~/.freetalk/history/$1/$2`

while [ true ];do
str1=`tail -n1 ~/.freetalk/history/$1/$2`
if [ "$str1" != "$str" ]; then
 mes=${str1#*"] "}
 echo $mes
 ./out $admin $mes
 fi
str=$str1
done


out
#!/bin/bash

in=1
for a in "$@"; do
	case $in in
		1)admin=$a;;
		2)mes=$a;;
		*)par=$a;;
	esac
	let 'in+=1'
done

#Обработка команды
case "$mes" in

#Transmission
torrent_list)
	echo ''>t
	echo 'Активные torrent-сессии'>>t
	echo '---'
	transmission-remote localhost:4545 -l>>t
	sendxmpp  $admin -m t
;;
torrent_add)
	#wget -O t $par
	transmission-remote localhost:4545 --add $par
	echo 'Торрент добавлен' | sendxmpp $admin
;;
torrent_choise)
	transmission-remote localhost:4545 -t $par
;;
torrent_stop)
	transmission-remote localhost:4545 -S
;;
torrent_start)
	transmission-remote localhost:4545 -s
;;
torrent_on)
	transmission-daemon
	ps aux|grep [t]ransmission-daemon|sendxmpp $admin
;;
torrent_off)
	killall transmission-daemon
	ps aux|grep [t]ransmission-daemon|sendxmpp $admin
;;

#Диагностика
info_hdd)
	echo ''> t
	echo 'Состояние дисков' >> t
	echo '---' >> t
	df -h >> t
	sendxmpp $admin -m t
;;
info_mem)
	echo '' > t
	echo '---' >> t
	echo 'Состояние памяти' >> t
	free -kt >> t
	sendxmpp $admin -m t
;;
info_cpu)
	echo 'oops'|sendxmpp $admin
;;
info_net)
	echo '' > t
	echo 'Состояние сети' >> t
	echo '---' >> t
	echo "IP: $(wget -O - -q icanhazip.com)" >> t
	echo "Local IP: $(ifconfig eth0 |grep inet\ addr|cut -b21-33)" >> t
	echo '--'>> t
	echo 'Активные TCP соединения' >> t
	netstat | grep Recv-Q >> t
	netstat | grep tcp >> t
	sendxmpp $admin -m t 
;;
info_all)
	echo '' > t
	echo 'Информация о системе' >> t
	echo '---' >> t
	cat /proc/version >> t
	echo "Uptime: $(uptime|cut -d' ' -f2)" >> t
	echo '--' >> t
	grep MemTotal /proc/meminfo >> t
	grep MemFree /proc/meminfo >> t
	grep SwapTotal /proc/meminfo >> t
	grep SwapFree /proc/meminfo >> t
	echo '--' >> t
	grep platform /proc/cpuinfo >> t
	grep cpu /proc/cpuinfo >> t
	grep clock /proc/cpuinfo >> t
	echo '--' >> t
	df -h | grep Filesystem >> t
	df -h | grep md1 >> t
	df -h | grep sda4 >> t

	sendxmpp $admin -m t
;;

#Заметки
note_new)
	t=0
	while [ $t != 1 ]; do
	file=$((RANDOM%800+1))
	for i in $(ls); do
		if [ "$i" != "$file" ]
			then
			t=1
		fi
	done
	done

	echo "Заметка #$file:" >> notes/$file
	echo '' >> notes/$file
	echo "$par" >> notes/$file
	
	echo "Заметка #$file создана"|sendxmpp $admin
;;
note_show)
	sendxmpp $admin -m notes/$par
;;
note_list)
	echo ''>t
	echo 'Список заметок'>>t
	echo '---'>>t
	for i in $(ls notes/);do 
		echo "Заметка #$i">>t
	 	echo "$(tail -n1 notes/$i|cut -b1-30)...">>t
		echo ''>>t
	done
	sendxmpp $admin -m t
;;
note_del)
	rm notes/$par
	echo "Заметка $par удалена"|sendxmpp $admin
;;
help)
	sendxmpp $admin -m help
;;
info)
	sendxmpp $admin -m info
;;
*)
	sendxmpp $admin -m help
;;
esac


Заключение:
Минусов как видите масса, например демонизировать можно только через screen, думал довести до ума, но не нашел чем можно заменить freetalk, если только мисать отдельный скрипт на ruby/perl но тогда самого бота будет выгоднее переписать. В общем кому интересно можете покопать)]]>
Thu, 14 Jul 2011 03:01:01 +0400 comments
Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8548 /blog/coding/1912.html#comment8548 yababay

Спасибо, я для себя парочку идей почерпнул. Такой камент просится в отдельный топик.]]>
Thu, 14 Jul 2011 12:52:21 +0400 comments
Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8549 /blog/coding/1912.html#comment8549 illuthion Thu, 14 Jul 2011 12:53:25 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8550 /blog/coding/1912.html#comment8550 Sergei_T ]]> Thu, 14 Jul 2011 23:20:33 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8551 /blog/coding/1912.html#comment8551 illuthion Fri, 15 Jul 2011 00:05:26 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8553 /blog/coding/1912.html#comment8553 Sergei_T не совсем оптимально использовать кучу различных утилитэто и есть unix-way — зачем тебе писать то, что уже написано?]]> Fri, 15 Jul 2011 12:06:26 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8556 /blog/coding/1912.html#comment8556 yababay Fri, 15 Jul 2011 13:37:16 +0400 comments Comments: Jabber-бот на базе Яндекса /blog/coding/1912.html#comment8555 /blog/coding/1912.html#comment8555 yababay , добавил в свою rss-подписку.]]> Fri, 15 Jul 2011 13:31:05 +0400 comments