使用HTTParty和Ruby

时间:2016-05-05 20:00:45

标签: ruby httparty wikia

我正在尝试使用Ruby和HTTParty来发布一个关于Wikia论坛的帖子。没有可用的文档,因为该过程似乎涉及Wikia的内部API,因此我一直在尝试使用Chrome的开发工具来查看正在发出的请求。

据我所知,当用户尝试将评论发布到论坛上的某个帖子时,会向.wikia.com / wikia.php发送一个POST请求,其中包含以下参数:

  • 控制器= WallExternal
  • 方法= replyToMessage
  • parent =(父线程ID,例如1036301)
  • body ="正在发送的消息"
  • 标记= edittoken *

该过程需要一个我使用普通Mediawiki API检索的编辑令牌。我遇到的问题是我得到了回复

"您的登录会话似乎有问题;此操作已被取消,作为防止会话劫持的预防措施。返回上一页,重新加载该页面,然后重试。"

使用错误消息的Google搜索只会产生在尝试正常登录时出现此问题的人,这不是这种情况下的问题。

我认为问题可能在于请求中没有设置用户的标题,因为我不认为允许匿名编辑发布回复;由于Mediawiki文档说没有登录的用户获得" + \"的编辑令牌,但似乎并非如此。

我尝试使用的代码是:

    @api = MediaWiki::Gateway.new 'http://example.wikia.com/api.php'
    @api.login('username', 'password')
    @headers = {
      'User-Agent' => 'example',
      'Cookie' => @api.cookies.map { |k, v| "#{k}=#{v};" }.join(' ')
    }

    query = HTTParty.post('http://example.wikia.com/api.php',
      :body => {
        'action' => 'query',
        'prop' => 'info|revisions',
        'intoken' => 'edit',
        'titles' => 'Thread:2219',
        'format' => 'json'
      },
      :headers => @headers
    )

    token = JSON.parse(query.body)
    token = token["query"]["pages"]["-1"]["edittoken"]

    query = HTTParty.post('http://example.wikia.com/wikia.php',
      :body => {
        'controller' => 'WallExternal',
        'method' => 'changeThreadStatus',
        'format' => 'json',
        'msgid' => '2219',
        'newState' => 'close'
      },
      :headers => @headers
    )

Wikia目前正在使用Mediawiki 1.19.24,这就是检索编辑令牌的方法是旧版本的原因。

这主要是一种爱好,我不是很有经验。我首先在Wikia论坛上问过这个问题,一位用户建议我来这里。感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

您发现与CSRF(跨网站请求伪造)相关的错误,因为您无法使用"令牌"正确。

这可能是MediaWiki网站创建者的故意。除非您传递正确的令牌,否则您将无法进行POST,这表明该表单是从正确的HTML页面原点提交的。此令牌是服务器发起的,您可能很难将其解压缩以用于HTTParty请求。不过,你可以环顾一下DOM来找到一些价值。

我可能建议使用Selenium作为替代品。由于这使用了适当的浏览器实例,因此您不必处理解析HTML响应和制作自定义帖子。相反,您可以编写代码来访问wikia网站,登录并提交新帖子'形成。

请注意,有时网站会采取保护措施,以避免以这种方式实现自动化。如果您发现这种情况发生(例如,您无法使用Selenium登录),将断点放在selenium代码中,单击浏览器,然后移过断点以运行更多信息会很有帮助码。

所有这一切,因为有MediaWiki API,尽可能使用该界面可能更好。即如果gem可以满足您的需求,则可能不需要使用HTTP客户端或无头浏览器。