пятница, 20 марта 2009 г.

Twit. Продолжение.

Начало.
Появился чуток свободного времени и я немного довел до ума свой скриптик постинга сообщений в твиттер из командной строки.
Во-первых я изменил способ передачи сообщения, теперь оно считывается из stdout (тут не обошлось без перломагии). А во-вторых я добавил обратную связь - теперь скрипт проверяет действительно ли сообщение дошло до твиттера.
Если с первым все понятно, то со вторым пришлось повозиться. Эту задачу я решил сравнивая последний id сообщения до и после отправки.
id сообщения я получаю применяя этот xslt-файл к http://twitter.com/statuses/user_timeline.xml (twitter api):

  1. <?xml version='1.0'?>
  2. <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  3. <xsl:template match='/'>
  4. <xsl:value-of select='statuses/status/id'/>
  5. </xsl:template>
  6. </xsl:stylesheet>


Он будет лежать в /etc/twit/twit.xsl.
Далее собственно сам скрипт:

  1. #!/bin/sh
  2. # Made by rsk -- http://rsk.me

  3. # Imports $TPASS, $TUSER
  4. . ~/.twit/pass
  5. XSLPATH=/etc/twit/twit.xsl

  6. echo "Type in your message..."

  7. MSG="$(perl -e'$_=<>,print')"
  8. echo "Checking last id..."
  9. LASTIDOLD=$(curl --basic --user $TUSER:$TPASS http://twitter.com/statuses/user_timeline.xml 2>/dev/null | xsltproc $XSLPATH - | grep -v ^$ | tail -n 1)

  10. echo "Sending..."
  11. curl --basic --user $TUSER:$TPASS --data status="$MSG" http://twitter.com/statuses/update.xml > /dev/null 2> /dev/null

  12. echo "Checking last id..."
  13. sleep 1
  14. LASTIDNEW=$(curl --basic --user $TUSER:$TPASS http://twitter.com/statuses/user_timeline.xml 2>/dev/null | xsltproc $XSLPATH - | grep -v ^$ | tail -n 1)

  15. if [ $LASTIDOLD -eq $LASTIDNEW ]; then
  16. echo "Sending failed!";
  17. else
  18. echo "ok";
  19. fi


Искуственную задержку в 18 строке пришлось добавить, потому что один раз id оказались одинаковыми, хотя сообщение и дошло.
Теперь осталось записать пароли в ~/.twit/pass:
  1. TUSER=user
  2. TPASS=pass
UPD. На самом деле это все неправильно :-) Надо анализировать ответ при отправке нового статуса и по ответу определять дошло ли сообщение. Обязуюсь исправить.

Комментариев нет: