我有一个网址,我需要访问作为项目更广泛流程的一部分,我知道它在我登录时有效,但显然作为cron工作的一部分,它不会。如果它是htaccess我会简单地使用curl或wget并传递接受的用户名和密码参数。
我已经在这个特定的cron上尝试了这个,但它似乎没有执行与url相关联的任务。见下面的例子:
curl -u username:password http://www.example.com
(我通常会将dev / null 2>& 1作为cron的一部分,但我希望现在看到输出)
但问题是该页面位于表单登录后面,我不确定如何使用cron作业将参数传递给该表单。
非常感谢任何帮助或建议。
答案 0 :(得分:0)
您可能需要传递表单登录参数,可能使用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'