我正在尝试使用Ruby和HTTParty来发布一个关于Wikia论坛的帖子。没有可用的文档,因为该过程似乎涉及Wikia的内部API,因此我一直在尝试使用Chrome的开发工具来查看正在发出的请求。
据我所知,当用户尝试将评论发布到论坛上的某个帖子时,会向.wikia.com / wikia.php发送一个POST请求,其中包含以下参数:
该过程需要一个我使用普通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论坛上问过这个问题,一位用户建议我来这里。感谢您提供的任何帮助。
答案 0 :(得分:1)
您发现与CSRF(跨网站请求伪造)相关的错误,因为您无法使用"令牌"正确。
这可能是MediaWiki网站创建者的故意。除非您传递正确的令牌,否则您将无法进行POST,这表明该表单是从正确的HTML页面原点提交的。此令牌是服务器发起的,您可能很难将其解压缩以用于HTTParty请求。不过,你可以环顾一下DOM来找到一些价值。
我可能建议使用Selenium作为替代品。由于这使用了适当的浏览器实例,因此您不必处理解析HTML响应和制作自定义帖子。相反,您可以编写代码来访问wikia网站,登录并提交新帖子'形成。
请注意,有时网站会采取保护措施,以避免以这种方式实现自动化。如果您发现这种情况发生(例如,您无法使用Selenium登录),将断点放在selenium代码中,单击浏览器,然后移过断点以运行更多信息会很有帮助码。
所有这一切,因为有MediaWiki API,尽可能使用该界面可能更好。即如果gem可以满足您的需求,则可能不需要使用HTTP客户端或无头浏览器。