我使用此命令在 Drupal 6 中填写表单(创建节点):
curl -b cookies.txt -d "title=thetitle&menu%5Blink_title%5D=&menu%5Bparent%5D=primary-links%3A0&menu%5Bweight%5D=0&teaser_include=1&body=content+here&format=1&changed=&form_build_id=form-01fbf44be3dab1ea177d17544bce415c&form_token=f1af1b01946065a34e49fdbde8fcc64b&form_id=story_node_form&log=&comment=2&pathauto_perform_alias=1&field_pidio%5B0%5D%5Bembed%5D=&name=admin&date=&status=1&promote=1&op=Save" http://localhost/subdo/node/add/story
它工作没有任何问题;终端中没有消息,并且节点已按预期在 Drupal 中创建。
一段时间后,我再次使用该代码,没有任何修改。但终端不会显示新节点,而是显示表单的 HTML 代码。看起来 cURL 没有点击“保存”按钮。
答案1
德鲁帕尔表格通常分为两步,需要预览/批准阶段。您看到的表单是相同的,并且预先填写了您在第一个表单中提交的值,但页面上还会有操作预览,以及一个隐藏的表单字段,指示正在提交下一个表单提交从预览来看,因此数据实际上应该被保存。
差异通常是姓名的提交按钮。在需要预览的表单上,提交按钮会将操作作为op=Preview
其将发送的预览页面上的表单传递op=Save
。好消息是,它实际上并不在服务器端跟踪此预览阶段,它只是使用表单中的线索来了解您所处的步骤。当像您尝试从 like 那样以自动方式提交时,您可以通过包含发送而不是使用初始表单中的值来curl
直接跳到真正的保存。op=Save
此外,德鲁帕尔通常使用唯一标识符或令牌来跟踪表单。为了自动提交这些表单,您需要使用 下载页面curl
,解析它以获取包含唯一令牌的表单字段(form_token
在DP7),然后将该键/值对包含在您的 POST 中。
至少在德鲁帕尔7结合这些技术应该没有问题。表单令牌从预览到最终版本不会发生变化,因此一旦获取令牌,您就可以直接跳到最终的保存 POST。