Ruby скрипт для размещения комментариев
Я пытался написать сценарий, который может помочь мне комментировать из командной строки. (Единственная причина, почему я хочу сделать это, это его отпуск здесь, и я хочу убить время). Я часто посещаю и публикую на этом сайте. Так что я начинаю только с этого сайта. Например, чтобы прокомментировать этот пост, я использовал следующий скрипт
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()
Now the server returns me this.On going through the html code of the original page i found out there is one more field bb2_screener that i need to fill if I want to pretend like a browser to the server.But the problem is the field is not written inside the tag so mechanize won't treat it as a field.
1 ответ
Предполагая, что у вас все параметры верны, вам все еще не хватает информации о сеансе, которую сайт хранит в cookie-файле. Подумайте об использовании чего-то вроде механизации, которая будет иметь дело с файлами cookie для вас Также более естественно, что вы указываете, какие поля и какие данные заполнять. Если это все еще не работает, вы всегда можете использовать отбойный молоток, как селен, но тогда технически вы используете браузер.