2012-03-03 2 views
2

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

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'=>"[email protected]",'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() 

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

Edit: Как мало кто предложил использовать механизировать я переключился на python.Now мой обновленный код выглядит следующим образом:

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"]="[email protected]" 
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 код оригинала страница i обнаружила, что есть еще одно поле bb2_screener, которое нужно заполнить, если я хочу притворяться браузером на сервере. Но проблема в том, что поле не написано внутри тега, поэтому механизация не будет рассматривать его как поле.

+0

Лучше использовать HTTP-прокси вместо проводов для проверки HTTP-трафика. Я использую [Charles] (http://charlesproxy.com), но есть встроенный инструмент в Chrome, а Firefox - Firebug. При этом вы, вероятно, забыли отправить cookie вместе с запросом. –

+0

Странно, что вы цитируете механизацию как повод переключиться с Руби. Ruby имеет [mechanize] (http://mechanize.rubyforge.org/), и это особенно хорошая реализация (и я использовал механизацию как в python, так и в perl). –

+0

ну, я не знал о механизме, поэтому первое, что я сделал, это google it. Первая доступная ссылка была основана на python. И мне комфортно с любым из этих языков. Итак, коммутатор :) BTW, когда я отважился на механизацию больше я нашел библиотеки для perl и ruby ​​тоже. Но в конце язык - это просто оружие, его программист, который сражается с битвой :) – bashrc

ответ

1

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

+0

Я понял это позже ... Так что я упаковал куки в заголовок (который третий аргумент post_form), но все еще не работает. – bashrc

+0

Можете ли вы показать обновленный код? Если вы упаковываете куки-файлы, которые вы схватили из wirehark, это может быть недействительным (сервер может видеть, что вы внезапно больше не выглядите как firefox, например). Я говорю, посмотрим, сработает ли он с другим автоматическим инструментом, прежде чем попробовать raw http. –

+0

Я переключился на механизацию, поэтому не думаю, что теперь нужны заголовки. Я разместил обновленный код. – bashrc