Créer un robot fanatique pour les sites Stack Exchange

12

Votre défi aujourd'hui est de tricher aux badges!

Vous allez créer un bot qui se connectera à un site Stack Exchange, connectez-vous en tant que vous, visitez la page / questions, visitez une question, puis visitez 9 autres questions dans la barre latérale "associée" (car cela semble suffisant pour compter comme " ", et je dois normaliser quelque chose).

Ce bot doit passer par ce processus une fois par jour, sans aucune entrée ou action de l'utilisateur. Il devrait pouvoir être laissé en cours d'exécution, et l'utilisateur devrait pouvoir ne jamais toucher l'ordinateur, et le nombre de jours consécutifs sera toujours incrémenté. Après avoir "visité" le site, il doit imprimer "visité".

Vous supposerez que l'utilisateur utilise l'OpenID fourni par Stack Exchange.

L'entrée du programme sera l'URL du site, l'e-mail SE OpenID et le mot de passe SE OpenID. Par exemple:

/programming// [email protected] password

Vous pouvez les saisir comme vous le souhaitez.

Votre programme doit fonctionner pendant au moins:

(Juste pour être sûr qu'il est universel.)

Il s'agit de , donc le code le plus court en octets gagnera!

Poignée de porte
la source
1
Le minimum que je devais faire pour l'activité était de visiter ma page utilisateur. Pas besoin de lire de questions. (Mais ne changez pas les règles à cause de cela.)
Kendall Frey
4
Dieu merci, le défi n'était pas de créer un bot qui vote au hasard 40 questions / réponses chaque jour.
1
Étant donné l'ampleur de l'échange de pile, ce n'était qu'une question de temps avant qu'il ne soit question de l'exploiter.
PyRulez

Réponses:

11

Rubis, 456 caractères

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}

Version non golfée:

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
}
Poignée de porte
la source
7
Avez-vous dépassé le stockage maximum sur votre compte Github et commencé à utiliser le format Q&A StackExchange comme stockage de débordement pour vos spécifications et votre code source? ;-)
Jonathan Van Matre
1
@JonathanVanMatre, attendez, il y a une limite de taille sur les référentiels GitHub?
haykam