Gallery:如何从命令行呼叫一个视图或控制器
来自站长百科
如何从命令行呼叫一个视图或控制器?[ ]
要求:
- Wget: wget 是一个unix/linux命令行用户代理(user agent),用以自命令行抓取网站。Windows的Wget同样可用。
此脚本示例首先登入G2,接着运行建立所有缩略图和重设图片维护的任务。
要运行另一个控制器或请求一个视图的话,只要浏览G2中的页面,并复制该页面(视图)或是手工控制器带有所有必要参数的URL(查看一下某页面的HTML源代码找到<form>元素以及论坛输入字段)。接着将所有input field name=value pairs复制到你手动创建的URL中。
wget --cookies=on --save-cookies mycookies "http://example.com/gallery2/main.php?g2_controller=core.UserLogin&g2_form[formName]=UserLogin&g2_form[username]=admin&g2_form[password]=mysecret&g2_form[action][login]=Login" wget --cookies=on --load-cookies mycookies "http://example.com/gallery2/main.php?g2_controller=core.AdminMaintenance&g2_form%5Baction%5D%5BrunTask%5D=1&g2_taskId=BuildDerivativesTask"
将mysecret替换为你的密码,可能也需要将admin替换为你的管理员帐户的用户名。并将example.com/gallery2/替换为你真实的G2地址。
你可以在一个bash脚本中执行上述呼叫
#!/bin/bash 在此写入你的命令…
而且你可以周期性地将此bash脚本做为一个cron脚本来执行。
Caveat[ ]
自G2.2版本以来,如不做增补的话,上述指导就不再适用了。鉴于安全性考虑,Gallery不但要求你要登入,而且还要在所有控制器请求中包含一个有效的authToken(认证标记)。
这里有一些变通办法::
创建一个Wrapper脚本[ ]
你可以编写一个buildDerivatives.php脚本:
<?php /* 调整路径,使其指向你的gallery2文件夹 */ require_once('../gallery2/embed.php'); /* * 初始化G2(包括所有必要的类别, * 让G2处于可随时处理呼叫的准备状态) */ $ret = GalleryEmbed::init(array('fullInit' => true)); check($ret); /* 抓取authToken */ global $gallery; $session =& $gallery->getSession(); $authToken = $session->getAuthToken(); GalleryUtilities::putRequestVariable('authToken', $authToken); /* 在此我们可以呼叫任何API方法或声明控制器请求参量 */ GalleryUtilities::putRequestVariable('controller', 'core.AdminMaintenance'); GalleryUtilities::putRequestVariable('form[action][runTask]', 1); GalleryUtilities::putRequestVariable('taskId', 'BuildDerivativesTask'); /* 执行上面所定义的控制器请求 */ $data = GalleryEmbed::handleRequest(); /* $data['bodyHtml']包含有结果HTML */ function check($ret) { if ($ret) die($ret->getAsHtml()); } ?>
你可以由命令行(比如使用cron)呼叫该脚本或者通过http://example.com/gallery2/buildDerivatives.php浏览它。
安全性警告: 你不应当将此类型的脚本放置在网络可访(web-accessible)的文件夹中(比如你的gallery2/文件夹),因为此脚本会回避auth-token安全机制,而此机制是用于保护你不受恶意网站的攻击的(跨站请求伪造保护,Cross Site Request Forgery Protection)。
抓取Auth Token后将其包括[ ]
- 在首次请求登入后,再请求一个包括有表单的视图并分析/检索HTML的g2_authToken字串。
- 接着将auth token前置到你的控制器请求(&g2_authToken=...)。
你可以使用grep或脚本语言将authToken从返回的HTML中解析出来。