【发布时间】:2016-08-13 08:41:03
【问题描述】:
我制作了一个简单的脚本,可以在 tumblr 上发布图片。 一切都很好,但我在更改主机提供商后发现了一些性能问题(我的新主机有限且更便宜)。
现在,在调试脚本并联系 tumblr api 帮助台后,我遇到了一个问题:
有3个功能:
function oauth_gen($method, $url, $iparams, &$headers) {
$iparams['oauth_consumer_key'] = CONSUMER_KEY;
$iparams['oauth_nonce'] = strval(time());
$iparams['oauth_signature_method'] = 'HMAC-SHA1';
$iparams['oauth_timestamp'] = strval(time());
$iparams['oauth_token'] = OAUTH_TOKEN;
$iparams['oauth_version'] = '1.0';
$iparams['oauth_signature'] = oauth_sig($method, $url, $iparams);
$oauth_header = array();
foreach($iparams as $key => $value) {
if (strpos($key, "oauth") !== false) {
$oauth_header []= $key ."=".$value;
}
}
$str = print_r($iparams, true);
file_put_contents('data1-1.txt', $str);
$oauth_header = "OAuth ". implode(",", $oauth_header);
$headers["Authorization"] = $oauth_header;
}
function oauth_sig($method, $uri, $params) {
$parts []= $method;
$parts []= rawurlencode($uri);
$iparams = array();
ksort($params);
foreach($params as $key => $data) {
if(is_array($data)) {
$count = 0;
foreach($data as $val) {
$n = $key . "[". $count . "]";
$iparams []= $n . "=" . rawurlencode($val);
//$iparams []= $n . "=" . $val;
$count++;
}
} else {
$iparams[]= rawurlencode($key) . "=" .rawurlencode($data);
}
}
//debug($iparams,"iparams");
$str = print_r($iparams, true);
file_put_contents('data-1.txt', $str);
//$size = filesize('data.txt');
$parts []= rawurlencode(implode("&", $iparams));
//debug($parts,"parts");
//die();
$sig = implode("&", $parts);
return base64_encode(hash_hmac('sha1', $sig, CONSUMER_SECRET."&". OAUTH_SECRET, true));
}
以上这两个函数来自一个在线函数示例,它们一直运行良好。
这是我用来调用 API 和 oAuth 的函数:
function posta_array($files,$queue,$tags,$caption,$link,$blog){
$datArr = array();
$photoset_layout = "";
foreach ($files as $sing_file){
$dataArr [] = file_get_contents($sing_file);
$photoset_layout .= "1";
}
$headers = array("Host" => "http://api.tumblr.com/", "Content-type" => "application/x-www-form-urlencoded", "Expect" => "");
$params = array(
"data" => $dataArr,
"type" => "photo",
"state" => $queue,
"tags"=>$tags,
"caption"=>$caption,
"photoset_layout" => $photoset_layout,
"link"=>str_replace("_","",$link)
);
debug($headers,"head");
oauth_gen("POST", "http://api.tumblr.com/v2/blog/$blog/post", $params, $headers);
debug($headers,"head 2");
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, "Tumblr v1.0");
curl_setopt($ch, CURLOPT_URL, "http://api.tumblr.com/v2/blog/$blog/post");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Authorization: " . $headers['Authorization'],
"Content-type: " . $headers["Content-type"],
"Expect: ")
);
$params = http_build_query($params);
$str = print_r($params, true);
file_put_contents('data_curl1.txt', $str);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$response = curl_exec($ch);
debug($response,"response");
return $response;
}
这是有问题的函数,我试着解释一下:
我调用了oauth_gen,将参数数组传递给它,oauth_gen 创建了我稍后在这里使用的 oauth 标头:"Authorization: " . $headers['Authorization'],。
正如我所说,一切都很顺利,直到我尝试发布 6 个文件的 gif 照片集,总共 6Mb(tumblr 允许每个文件 2Mb 和总共 10Mb)。
PHP 内存不足返回错误,这里开始我的调试,过了一会儿我联系了 tumblr api 帮助台,他们是这样回答的:
您不需要在用于的参数中包含文件 生成oauth签名。有关如何完成此操作的示例, 查看我们的官方 API 客户端之一。
这改变了一切。直到现在,我将整个参数数组传递给 oauth_gen,它调用 oauth_sig,会将所有内容原始编码到数组中(包括 gif 文件的二进制字符串),结果大约 1Mb 的二进制文件变成至少 3Mb 的 rawurlencoded字符串。
这就是我有记忆问题的原因。很好,所以,正如帮助台所说,我以这种方式更改了对 oauth_gen 的调用:
$new_array = array();
oauth_gen("POST", "http://api.tumblr.com/v2/blog/$blog/post", $new_array, $headers);
seams 对我来说是合法的,我将一个新数组传递给函数,然后函数生成 oAuth,将标头传回,我可以将它们用于发布调用,结果是:
{"meta":{"status":401,"msg":"Unauthorized"},"response":[]}
向 tumblr api 帮助台询问更多信息只会导致更多指向他们的文档和我无法使用的“tumblr php 客户端”的链接,所以这不是一个选择。
有没有人有 oAuth 的经验并且可以解释我做错了什么?据我了解,诀窍在于 oauth_sig 创建的加密数据,但我不知道如何继续。
我真的很想了解 oauth,但是我阅读了更多关于它的内容,并且 tumblr helpdsek 对我有更多帮助,但是......该解决方案不起作用,只有当我让 oauth 函数加密时才有效整个数据数组(包含图像和所有内容),但我可以理解这是错误的......帮助我。
更新 1
我今天尝试了一个新东西,首先我创建了空数组,然后通过引用传递给oauth_gen,并且只有在生成签名之后,我才将关于帖子本身的所有其他字段添加到同一个数组中,但是结果是一样的。
更新 2 在这里阅读:http://oauth.net/core/1.0a/#signing_process 似乎请求的参数必须全部用于签名,但这并不完全清楚(如果有人可以更好地解释它,我真的很感激)。 这很奇怪,因为如果它是真的,那就违背了 Tumblr 帮助台的话,而如果它不是真的,整个过程就会有点混乱。 顺便说一句,此时我也被同一点击中了。
【问题讨论】:
标签: php arrays api oauth tumblr