Crie um bot Fanatic para sites do Stack Exchange


12

Seu desafio hoje é trapacear com insígnias!

Você criará um bot que se conectará a um site do Stack Exchange, faça login como você, visite a página / questions, visite uma pergunta e, em seguida, visite 9 outras perguntas na barra lateral "relacionada" (porque isso parece suficiente para contar como " atividade "e preciso padronizar alguma coisa).

Esse bot deve passar por esse processo uma vez por dia, sem nenhuma entrada ou ação do usuário. Ele deve poder continuar em execução e o usuário nunca deve tocar no computador, e a contagem de dias consecutivos ainda será incrementada. Depois de "visitar" o site, ele deve imprimir "visitado".

Você assumirá que o usuário está usando o OpenID fornecido pelo Stack Exchange.

A entrada do programa será o URL do site, o email do SE OpenID e a senha do SE OpenID. Por exemplo:

https://stackoverflow.com/ doorknob@doorknob.doorknob password

Você pode inseri-las como desejar.

Seu programa deve funcionar por um mínimo de:

(Apenas para garantir que seja universal.)

Isso é , então o código mais curto em bytes vencerá!


1
O mínimo que eu precisava fazer para a atividade era visitar minha página de usuário. Não há necessidade de ler nenhuma pergunta. (Mas não mudar as regras por conta disso.)
Kendall Frey

4
Graças a Deus, o desafio não era criar um bot que diminuísse aleatoriamente 40 perguntas / respostas por dia.

1
Dado o escopo da troca de pilhas, era apenas uma questão de tempo até haver uma questão de explorá-la.
precisa saber é o seguinte

Respostas:


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}

Versão não destruída:

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
}

7
Você excedeu o armazenamento máximo em sua conta do Github e começou a usar o formato de perguntas e respostas StackExchange como armazenamento excedente para suas especificações e código-fonte? ;-)
Jonathan Van Matre

1
@JonathanVanMatre, espere, há um limite de tamanho nos repositórios do GitHub?
21716 haykam
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.