提交表单作为cron作业的一部分


Submit a form as part of a cron job

我有一个url,我需要访问作为一个项目的更广泛的过程的一部分,我知道它的工作,当我登录,但显然作为cron工作的一部分,它不会是。如果是htaccess,我只需使用curl或wget并传递可接受的用户名和密码参数。

我已经在这个特定的cron上尝试过了,但它似乎没有执行url相关的任务。请看下面的例子:

curl -u username:password http://www.example.com(我通常将dev/null 2>&1作为cron的一部分,但我现在希望看到输出)

问题是,然而,这个页面位于表单登录后面,我不确定如何使用cron作业将参数传递给该表单。

如果有任何帮助或建议,我将不胜感激。

使用Curl:

您需要传递表单登录参数,可能使用POST方法。请检查表单的HTML。

使用curl执行POST请求,请参见https://superuser.com/questions/149329/what-is-the-curl-command-line-syntax-to-do-a-post-request。

这可能不适用于实现CSRF的某些表单。要解决这个问题,您需要解析HTML,找到CSRF令牌,并将其作为POST请求的数据参数之一传递。

接下来,登录很可能返回一个cookie。您的浏览器通常会保存这些信息,并在每个页面请求时将cookie返回给网站。您需要指定一个cookie文件。参见使用curl发送cookie

可能会有一些调查来解决更复杂的登录方案,这取决于网站。

使用自动web浏览器

更简单的替代方法是使用自动浏览器,比如Selenium webdriver。您可以使用脚本接口,如Capybara(一种ruby宝石)。使用Capybara和Selenium来控制浏览器,您可以避免网站可能拥有的使CURL难以使用的任何技术(例如。如果他们检测和阻止机器人)。

缺点是你需要安装它。然而,一旦你这样做,你可以使用简单的命令做的东西,如visit('http://www.google.com'), click_link('Link Text'),…

也看到:

require 'capybara'
session = Capybara::Session.new(:webkit, my_rack_app)
session.within("//form[@id='session']") do
  session.fill_in 'Email', :with => 'user@example.com'
  session.fill_in 'Password', :with => 'password'
end
session.click_button 'Sign in'