用于发布评论的Ruby脚本

用于发布评论的Ruby脚本,ruby,http,http-post,mechanize,packet,Ruby,Http,Http Post,Mechanize,Packet,我一直在尝试编写一个脚本,可以帮助我从命令行发表评论(我想这样做的唯一原因是它在这里休假,我想消磨时间)。 我经常访问和发布。所以我只从这个网站开始。 例如,我使用下面的脚本来评论 require "uri" require 'net/http' def comment() response = Net::HTTP.post_form(URI.parse("http://www.geeksforgeeks.org/wp-comments-post.php"),{'author'=&

我一直在尝试编写一个脚本,可以帮助我从命令行发表评论(我想这样做的唯一原因是它在这里休假,我想消磨时间)。 我经常访问和发布。所以我只从这个网站开始。 例如,我使用下面的脚本来评论

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()    

现在服务器返回了我。在查看原始页面的html代码时,我发现如果我想假装服务器的浏览器,我还需要填充一个字段bb2_screener。但问题是该字段没有写入标记中,因此mechanize不会将其视为字段

假设所有参数都正确,您仍然缺少站点存储在cookie中的会话信息。考虑使用像机械化这样的东西,这将处理你的饼干。更自然的是,您可以告诉它要用哪些数据填充哪些字段。如果这仍然不起作用,您可以始终使用类似selenium的手提钻,但从技术上讲,您使用的是浏览器。

您最好使用HTTP代理而不是wireshark来检查HTTP流量。我使用,但Chrome中有一个内置工具,Firefox有Firebug。尽管如此,您可能忘记了在请求时发送cookie。奇怪的是,您将mechanize作为从Ruby切换的理由。Ruby有,它是一个特别好的实现(我在python和perl中都使用了mechanize)。我不知道mechanize,所以我做的第一件事就是用谷歌搜索它。第一个可用的链接是基于python的。我对这两种语言中的任何一种都很熟悉。所以切换:)顺便说一句,当我冒险进入mechanize时,我也发现了perl和ruby的库。但最终语言只是一种武器,打这场仗的是程序员:)我后来明白了…所以我把cookie放在了标题中(这是post_表单的第三个参数),但仍然不起作用..你能显示更新的代码吗?如果您正在打包从wireshark抓取的cookie,它可能是无效的(例如,服务器可能会突然发现您不再像firefox)。我说,在尝试原始http之前,看看它是否能与另一个自动化工具一起工作。我切换到mechanize,所以现在不认为需要标题。我发布了一个更新的代码。我正在寻找ruby解决方案哈哈。。我不想改成pythonRuby版本的也很好用。