Ruby скрипт для размещения комментариев - PullRequest
2 голосов
/ 03 марта 2012

Я пытался написать сценарий, который может помочь мне комментировать из командной строки. (Единственная причина, почему я хочу сделать это, это его время отпуска здесь, и я хочу убить время).Я часто посещаю и публикую на этот сайт . Так что я начинаю только с этого сайта.Например, чтобы прокомментировать этот пост Я использовал следующий скрипт

require "uri"
require 'net/http'


def comment()
    response =  Net::HTTP.post_form(URI.parse("http://www.geeksforgeeks.org/wp-comments-post.php"),{'author'=>"pikachu",'email'=>"saurabh8c@gmail.com",'url'=>"geekinessthecoolway.blogspot.com",'submit'=>"Have Your Say",'comment_post_ID'=>"18215",'comment_parent'=>"0",'akismet_comment_nonce'=>"70e83407c8",'bb2_screener_'=>"1330701851 117.199.148.101",'comment'=>"How can we generalize this for a n-ary tree?"})
    return response.body
    end
puts comment()

Очевидно, что значения не были жестко закодированы, но для ясности и сохранения цели поста я их жестко кодирую.Кроме обычных полей, которые появляются в форме, значения для скрытых полей я обнаружил из wireshark, когда я отправил комментарий обычным способом. Я не могу понять, что мне не хватает? Может быть, какое-то событие js?

Редактировать: как мало кто предложил использовать mechanize , я переключился на python. Теперь мой обновленный код выглядит так:

import sys
import mechanize
uri = "http://www.geeksforgeeks.org/"
request = mechanize.Request(mechanize.urljoin(uri, "archives/18215"))
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()
form=forms[0]
print form
control = form.find_control("comment")
#control=form.find_control("bb2_screener")
print control.disabled
#  ...or readonly
print control.readonly
#  readonly and disabled attributes can be assigned to
#control.disabled = False
form.set_all_readonly(False)
form["author"]="Bulbasaur"
form["email"]="ashKetchup@gmail.com"
form["url"]="9gag.com"
form["comment"]="Y u no put a captcha?"
form["submit"]="Have Your Say"
form["comment_post_ID"]="18215"
form["comment_parent"]="0"
form["akismet_comment_nonce"]="d48e588090"
#form["bb2_screener_"]="1330787192 117.199.144.174"
request2 = form.click() 
print request2
try:
    response2 = mechanize.urlopen(request2)
except mechanize.HTTPError, response2:
    pass
# headers
for name, value in response2.info().items():
    if name != "date":
        print "%s: %s" % (name.title(), value)
print response2.read()  # body
response2.close()    

Теперь сервер возвращает мне this. Проходя через html-код исходной страницы, я обнаружил, что есть еще одно поле bb2_screener, которое мне нужно заполнить, если я хочу притворяться браузером как сервер. Но проблема в том, что поле не записано внутритег так механизировать не будет рассматривать его как поле.

1 Ответ

1 голос
/ 03 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...