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

时间:2015-10-08 10:53:10

标签: php curl cron

我有一个网址,我需要访问作为项目更广泛流程的一部分,我知道它在我登录时有效,但显然作为cron工作的一部分,它不会。如果它是htaccess我会简单地使用curl或wget并传递接受的用户名和密码参数。

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

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

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

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

使用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文件。请参阅Send cookies with curl

根据网站的不同,可能需要进行一些调查以解决任何更复杂的登录方案。

使用自动网络浏览器

更容易的替代方案是使用自动浏览器,如Selenium webdriver。您可以使用脚本界面,例如Capybara(红宝石宝石)。使用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'