Cree un bot Fanatic para sitios de Stack Exchange

12

¡Tu desafío hoy es hacer trampa en las insignias!

Creará un bot que se conectará a un sitio de Stack Exchange, iniciará sesión como usted, visite la página / preguntas, visite una pregunta y luego visite otras 9 preguntas en la barra lateral "relacionada" (porque parece suficiente para contar como " actividad ", y necesito estandarizar algo).

Este bot debe pasar por este proceso una vez al día, sin ninguna entrada o acción del usuario. Debería poder dejarse en ejecución, y el usuario nunca debería poder tocar la computadora, y el recuento de días consecutivos seguirá incrementándose. Después de "visitar" el sitio, debe imprimir "visitado".

Asumirá que el usuario está utilizando el OpenID proporcionado por Stack Exchange.

La entrada del programa será la URL del sitio, el correo electrónico SE OpenID y la contraseña SE OpenID. Por ejemplo:

/programming// [email protected] password

Puede ingresarlos como desee.

Su programa debe funcionar por un mínimo de:

(Solo para asegurarse de que sea universal).

Este es el , ¡así que el código más corto en bytes ganará!

Pomo de la puerta
fuente
1
Lo mínimo que necesitaba hacer para la actividad era visitar mi página de usuario. No es necesario leer ninguna pregunta. (Pero no cambie las reglas a causa de esto.)
Kendall Frey
44
Gracias a Dios, el desafío no era crear un bot que votara al azar 40 preguntas / respuestas cada día.
1
Dado el alcance del intercambio de la pila, era solo cuestión de tiempo hasta que hubiera una pregunta sobre cómo explotarlo.
PyRulez

Respuestas:

11

Ruby, 456 caracteres

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}

Versión sin golf:

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
}
Pomo de la puerta
fuente
77
¿Excedió el almacenamiento máximo en su cuenta de Github y comenzó a usar el formato Q&A StackExchange como almacenamiento de desbordamiento para sus especificaciones y código fuente? ;-)
Jonathan Van Matre
1
@JonathanVanMatre, espera, ¿hay un límite de tamaño en los repositorios de GitHub?
haykam