Gallery:如何从命令行呼叫一个视图或控制器

来自站长百科
跳转至: 导航、​ 搜索

如何从命令行呼叫一个视图或控制器?[ ]

另见:如何编写与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中解析出来。