前言
接入其他存储的方案太过昂贵,多吉云就成了咱这普通人的最优选。
很可惜的是多吉云没有被任何一家图床程序接入,于是自己动手接入成了最后的选择。
多吉云使用的是腾讯的COS作为底层然后又做了个API接口获取密钥
用多吉云的密钥访问自己的API接口来获取可以访问的密钥
而且密钥是三段式(accessKeyId
/secretAccessKey
/sessionToken
)临时密钥
真TM日狗
兼容多吉云
曲线救国方案临时版,并不是最优解
本来打算直接新增存储策略的,但是改半天都用不了,还给干500错误了
编辑文件 App/Enums/Strategy/S3Option.php
添加上 session_Token
转换 sessionToken
<?php
namespace App\\Enums\\Strategy;
final class S3Option
{
/\*\* @var string 访问url \*/
const Url = ’url‘;
/\*\* @var string AccessKeyId \*/
const AccessKeyId = ’access\_key\_id‘;
/\*\* @var string SecretAccessKey \*/
const SecretAccessKey = ’secret\_access\_key‘;
/\*\* @var string sessionToken \*/
const sessionToken = ’session\_Token‘;
/\*\* @var string Endpoint \*/
const Endpoint = ’endpoint‘;
/\*\* @var string 区域 \*/
const Region = ’region‘;
/\*\* @var string Bucket \*/
const Bucket = ’bucket‘;
}
编辑文件 app/Services/ImageService.php
给AwsS3添加上 sessionToken
的获取 ’token‘ => $configs->get(S3Option::sessionToken)
StrategyKey::S3 => new AwsS3V3Adapter(
client: new S3Client(\[
’credentials‘ => \[
’key‘ => $configs\->get(S3Option::AccessKeyId),
’secret‘ => $configs\->get(S3Option::SecretAccessKey),
’token‘ => $configs\->get(S3Option::sessionToken)
\],
’endpoint‘ => $configs\->get(S3Option::Endpoint),
’region‘ => $configs\->get(S3Option::Region),
’version‘ => ’2006-03-01‘,
\]),
bucket: $configs\->get(S3Option::Bucket),
新增一个php文件,命名随意,随便扔个地方调用一下,文件调用就可以获取把密钥传到数据库里了
因为是密钥有两小时可用时间,最好还是定时访问更新,直接调用也是可以的,不过要搞清楚优先级
每天的调用量是80000 次 / 天,想必用上多吉的都是穷逼一个,这个调用足够了
可以直接调用文件或者在开个网站内网hosts定时访问
<?php
// 曲线救国方案
// 多吉云的存储API为永久密钥,但是这是用来获取AWS S3临时密钥的
// 临时密钥有三个 accessKey,secretKey,sessionToken
// header(’content-type:application/json‘);
function dogecloud\_api($apiPath, $data = array(), $jsonMode = false) {
// 这里替换为你的多吉云API的永久 AccessKey 和 SecretKey,可在用户中心 - 密钥管理中查看
$accessKey = ”XXXXXXXXXX“;
$secretKey = ”XXXXXXXXXXXXX“;
$body = $jsonMode ? json\_encode($data) : http\_build\_query($data);
$signStr = $apiPath . ”\\n“ . $body;
$sign = hash\_hmac(’sha1‘, $signStr, $secretKey);
$Authorization = ”TOKEN “ . $accessKey . ”:“ . $sign;
$ch = curl\_init();
curl\_setopt($ch, CURLOPT\_URL, ”https://api.dogecloud.com“ . $apiPath);
curl\_setopt($ch, CURLOPT\_RETURNTRANSFER, true);
curl\_setopt($ch, CURLOPT\_FOLLOWLOCATION, true);
curl\_setopt($ch, CURLOPT\_SSL\_VERIFYPEER, 1); // 如果是本地调试,或者根本不在乎中间人攻击,可以把这里的 1 和 2 修改为 0,就可以避免报错
curl\_setopt($ch, CURLOPT\_SSL\_VERIFYHOST, 2); // 建议实际使用环境下 cURL 还是配置好本地证书
if(isset($data) && $data){
curl\_setopt($ch, CURLOPT\_POST, true);
curl\_setopt($ch, CURLOPT\_POSTFIELDS, $body);
curl\_setopt($ch, CURLOPT\_HTTPHEADER, array(
’Content-Type: ‘ . ($jsonMode ? ’application/json‘ : ’application/x-www-form-urlencoded‘),
’Authorization: ‘ . $Authorization
));
}
$ret = curl\_exec($ch);
curl\_close($ch);
return json\_decode($ret, true);
}
$api = dogecloud\_api(’/auth/tmp\_token.json‘, array(
”channel“ => ”OSS\_FULL“,
”scopes“ => array(”\*“)
), true);
// 临时密钥,两小时内有效,定时访问就行,随便怎么放
// 绑定Lsky的数据库
$servername = ”XXXXXXX“; //数据库主机名
$dbname = ”XXXXXX“; //使用的数据库
$username = ”XXXXX“; //数据库连接用户名
$password = ”XXXXX“;//对应的密码
// 重构json表
$DogeAPI = \[
’url‘ => ’XXXXX‘, //云存储的访问域名,举例https://miraipip.2w2.top
’bucket‘ => ’XXXXX‘, //调用时所需的 s3Bucket 参数。
’region‘ => ’automatic‘, //自动选区
’queries‘ => ’‘,
’endpoint‘ => ’XXXXXXXXXXXXX‘, //调用所需的 s3Endpoint 参数。如 https://cos.ap-guangzhou.myqcloud.com/
’access\_key\_id‘ => $api\[’data‘\]\[’Credentials‘\]\[’accessKeyId‘\],
’secret\_access\_key‘ => $api\[’data‘\]\[’Credentials‘\]\[’secretAccessKey‘\],
’session\_Token‘ => $api\[’data‘\]\[’Credentials‘\]\[’sessionToken‘\],
\];
$ApiData = json\_encode($DogeAPI);
$ApiData = addslashes($ApiData);
// 你要是想看看原内容就把下面去了
// echo json\_encode($api);
// 入库
try {
$conn = new PDO(”mysql:host=$servername;dbname=$dbname“, $username, $password);
// 设置 PDO 错误模式,用于抛出异常
$conn\->setAttribute(PDO::ATTR\_ERRMODE, PDO::ERRMODE\_EXCEPTION);
// 下面是查询ID 100 的存储策略信息
// 可以吧查询阉了保留更新
$sql = ”SELECT \* FROM \`strategies\` WHERE \`id\` = 100 “;
// 更新strategies表ID为 100 的 configs 值
// 每创建一个存储策略的ID都是不一样的,你只需要找到用于多吉云AWS S3策略的ID就行了
$sql = ”UPDATE \`strategies\` SET \`configs\` = ’$ApiData‘ WHERE \`strategies\`.\`id\` = 100“;
// 使用 exec() ,没有结果返回
$conn\->exec($sql);
}
catch(PDOException $e)
{
echo $sql . ”<br>“ . $e\->getMessage();
}
$conn = null;
// $DogeAPI = $api\[’data‘\]\[’Credentials‘\];
// 写入文件
// echo json\_encode($DogeAPI);
// $json\_string = json\_encode($DogeAPI);// 过滤
// file\_put\_contents(’user.json‘, $json\_string);
// $DogeCloudAPI = file\_get\_contents(’user.json‘);
?>
以上就是全部了!