Utwórz bota Fanatic dla stron Stack Exchange

12

Twoim dzisiejszym wyzwaniem jest oszukiwanie odznak!

Zbudujesz bota, który połączy się z witryną Stack Exchange, zalogujesz się, odwiedzasz stronę / pytania, odwiedzasz pytanie, a następnie odwiedzasz 9 innych pytań na „pokrewnym” pasku bocznym (ponieważ wydaje się to wystarczające, aby liczyć się jako „ aktywność ”i muszę coś ustandaryzować).

Bot musi przejść ten proces raz dziennie, bez żadnych danych wejściowych ani działań ze strony użytkownika. Powinien być w stanie pozostawać uruchomiony, a użytkownik nie powinien nigdy dotykać komputera, a liczba kolejnych dni będzie nadal zwiększana. Po „odwiedzeniu” strony należy wydrukować „odwiedzone”.

Zakładasz, że użytkownik korzysta z OpenID dostarczonego przez Stack Exchange.

Dane wejściowe programu to adres URL witryny, adres e-mail SE OpenID i hasło SE OpenID. Na przykład:

/programming// [email protected] password

Możesz wprowadzić je w dowolny sposób.

Twój program musi działać przez co najmniej:

(Aby upewnić się, że jest uniwersalny).

To jest , więc wygra najkrótszy kod w bajtach!

Klamka
źródło
1
Minimum, które musiałem zrobić dla aktywności, to odwiedzić moją stronę użytkownika. Nie musisz czytać żadnych pytań. (Ale nie zmieniaj zasad z tego powodu.)
Kendall Frey
4
Na szczęście wyzwaniem nie było stworzenie bota, który losowo ocenia 40 pytań / odpowiedzi każdego dnia.
1
Biorąc pod uwagę zakres wymiany stosów, kwestią wykorzystania go było tylko kwestią czasu.
PyRulez

Odpowiedzi:

11

Rubinowy, 456 znaków

require'mechanize'
s,*e=gets.split
a,o=Mechanize.new,'http://openid.stackexchange.com/'
a.agent.http.verify_mode=OpenSSL::SSL::VERIFY_NONE
l=a.get(o+'account/login').forms[0]
l.email,l.password=e
a.submit l,l.buttons[0]
g=a.get(s+'/users/login').forms.find{|f|f.action=='/users/authenticate'}
g.openid_identifier=o
a.submit g,g.buttons[-1]
loop{p=a.get s+'/questions'
10.times{p=p.links.find{|i|i.href=~/^\/questions\/\d/}.click}
puts'visited'
sleep 86400}

Wersja bez golfa:

require 'mechanize'

site, email, password = gets.split

agent = Mechanize.new
agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE

login_form = agent.get('http://openid.stackexchange.com/account/login').forms.first
login_form.email = email
login_form.password = password
agent.submit login_form, login_form.buttons.first
puts 'logged in with SE openid'

site_login_form = agent.get(site + '/users/login').forms.find {|form| form.action == '/users/authenticate' }
site_login_form.openid_identifier = 'http://openid.stackexchange.com/'
agent.submit site_login_form, site_login_form.buttons.last
puts 'logged in to site'

loop {
    page = agent.get(site + '/questions')
    10.times do page = page.links.find{|link| link.href =~ /^\/questions\/\d/ }.click; end
    puts 'visited'
    sleep 60 * 60 * 24
}
Klamka
źródło
7
Czy przekroczyłeś maksymalną ilość miejsca na swoim koncie Github i zacząłeś używać formatu StackExchange z pytaniami i odpowiedziami jako miejsca do przepełnienia dla specyfikacji i kodu źródłowego? ;-)
Jonathan Van Matre
1
@JonathanVanMatre, czekaj, istnieje limit wielkości repozytoriów GitHub?
haykam