Создать фанатического бота для сайтов Stack Exchange

12

Ваша задача сегодня состоит в том, чтобы обмануть значки!

Вы создадите бота, который будет подключаться к сайту Stack Exchange, войдите под своим именем, перейдите на страницу / questions, посетите вопрос, а затем посетите 9 других вопросов на «связанной» боковой панели (поскольку этого, по-видимому, достаточно для того, чтобы считать «» деятельность ", и мне нужно что-то стандартизировать).

Этот бот должен проходить этот процесс один раз в день, без какого-либо участия или действий со стороны пользователя. Он должен быть в состоянии оставаться в рабочем состоянии, и пользователь должен иметь возможность никогда не прикасаться к компьютеру, и число дней подряд все равно будет увеличиваться. После «посещения» сайта, он должен напечатать «посетил».

Вы будете предполагать, что пользователь использует OpenID, предоставленный Stack Exchange.

Вводом программы будет URL сайта, электронная почта SE OpenID и пароль SE OpenID. Например:

/programming// doorknob@doorknob.doorknob password

Вы можете ввести их по своему усмотрению.

Ваша программа должна работать как минимум:

(Просто чтобы убедиться, что это универсально.)

Это , поэтому выиграет самый короткий код в байтах!

Дверная ручка
источник
1
Минимум, что мне нужно было сделать для активности, это посетить мою страницу пользователя. Не нужно читать какие-либо вопросы. (Но не меняйте правила из-за этого.)
Кендалл Фрей
4
Слава богу, задача заключалась не в том, чтобы создать бота, который бы случайно понижал 40 вопросов / ответов каждый день.
1
Учитывая масштабы обмена стека, вопрос о его использовании был лишь вопросом времени.
PyRulez

Ответы:

11

Рубин, 456 символов

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}

Безголовая версия:

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
Превышен ли вы максимальный объем памяти в вашей учетной записи Github и вы начали использовать формат Q & A StackExchange в качестве переполненного хранилища для ваших спецификаций и исходного кода? ;-)
Джонатан Ван Матре
1
@JonathanVanMatre, подожди, есть ли ограничение на размер репозиториев GitHub?
Хайкам