Gibt es was mühsameres, als die unsäglichen Browser-SMS-Versende-Dienste unserer Mobilfunkanbieter? Naja, wahrscheinlich gibt es schlimmeres, aber verbessern kann man es ja trotzdem. Das Ziel ist, möglichst einfach SMS zu versenden, also schreiben wir doch ein Script, welches als Parameter Nummer und Text entgegennimmt und versendet.

Ist eigentlich ganz einfach, Mechanize mimt einen Browser und macht genau das, was auch ein Mensch tun würde, also anmelden, Formularfelder ausfüllen und abschicken:

#!/usr/bin/ruby
require 'mechanize'

username = 'mirkostocker'
password = 'XXXXXXXXXXXX'
number   = ARGV.shift
message  = ARGV * " "

if message.length > 144 || message.length < 1
  $stderr.puts "Nachricht zu lang oder zu kurz.."
  exit 1
end

def find_form_with_field(page, fieldname)
  page.forms.each do |form|
    if form.fields.find{|f| f.name == fieldname}
      yield form
    end
  end
end

WWW::Mechanize.new do |agent|

  agent.get('https://www.orange.ch/footer/login') do |page|

    find_form_with_field(page, 'username') do |f|
      f.username = username
      f.password = password
      f.submit
    end
  end

  agent.get('https://www.orange.ch/myorange/sms') do |page|

    find_form_with_field(page, 'messageInput') do |f|
      f.destinationNumberInput = number
      f.messageInput = message
      f.wui_target_id = 'sendButton'
      f.wui_event_id = 'onclick'
      f.submit
    end
  end
end


find_form_with_field musste ich schreiben, da die Formulare keine Namen besitzen, und fragt mich nicht, weshalb ich wui_target_id und wui_event_id setzen muss, im echten Browser wird das per Javascript gemacht und ist anscheinend wichtig. Hat auch gleich die Projektdauer um 50% verlängert, auf rund 1.5 Stunden.

So, und wer kümmert sich um die Swisscom und Sunrise?

Guido: Wie du siehst habe ich einen netten Weg gefunden, bunten Code zu bloggen, der beste Editor der Welt hat nämlich eine TOhtml Funktion.