介绍
本文使用Gitee实现Volantis主题友链功能,其中友链使用的是site标签,因为该标签可以展示图片,如
{% sites repo:example.json api:https://example.dearxuan.com %}
友链api的最终路径为 api + “版本” + repo,如上面代码的最终路径为
https://example.dearxuan.com/v1/example.json
其中版本可能会改变,在友链页面查看源代码,Ctrl+F搜索你的api路径即可找到最终路径
在使用前请先创建好对应文件,如上面的例子,则需要创建 网站根目录/v1/example.json
PHP文件
推荐直接下载压缩包,附带我的友链页模板,点此查看我的友链页
在任意网站目录下创建php文件,如"gitee.php"(文件名随意),粘贴以下代码,其中“password”为你自己设置的密码,之后会用到
“path”为你的友链最终路径,其中__FILE__是指运行目录,通常就是你的网站的根目录,也可以改为绝对路径
<?php
$password = "************************"; // Gitee推送密码
$path = dirname(__FILE__)."/v1/example.json"; // 友链路径
// 验证权限
$token = array_key_exists("HTTP_X_GITEE_TOKEN", $_SERVER)
? $_SERVER["HTTP_X_GITEE_TOKEN"]
: "";
if($password == $token){
//更新友链
$body = json_decode(file_get_contents("php://input"), true);
UpdateFriends($body);
}else{
//返回403
echo "403 Forbidden";
}
/** 根据不同的请求类型执行不同的函数 */
function UpdateFriends($body): void
{
switch ($body["action"]){
case "state_change": // 状态改变
Update($body);
break;
case "open": // 新建issue
// 不执行任何操作
break;
case "delete": // 删除
Delete($body);
break;
}
}
/** 更新或新增友链 */
function Update($body): void
{
$issueBody = json_decode($body["issue"]["body"], true);
if($issueBody == null){
echo "issue格式错误";
return;
}
$result = array(
"iid" => $body["iid"],
"title" => $issueBody["title"],
"url" => $issueBody["url"],
"avatar" => $issueBody["avatar"],
"screenshot" => $issueBody["screenshot"],
"description" => $issueBody["description"],
);
//读取文件,转化为数组
global $path;
$str = file_get_contents($path);
$friends = json_decode($str, true)["content"];
if($friends == null){
$friends = array();
}
//是否展示该友链,只有"closed"才要展示
if($body["state"] == "closed"){
//遍历数组查看是否有重复项
foreach ($friends as $key => $value){
if($value["iid"] == $result["iid"]){
//找到重复,则程序结束
echo "url:\"".$result["url"]."\"已存在";
return;
}
}
//没有重复,则添加至末尾
$friends[] = $result;
echo "已添加".$result["url"];
}else{
//不展示该友链
foreach ($friends as $key => $value){
if($value["iid"] == $result["iid"]){
//删除该项
unset($friends[$key]);
echo "已移除".$result["url"];
break;
}
}
}
//生成新的json,且不转义
$newJson = json_encode(array(
"code" => "0",
"content" => array_values($friends),
), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
file_put_contents($path, $newJson);
}
/** 删除友链 */
function Delete($body): void
{
$iid = $body["iid"];
//读取文件,转化为数组
global $path;
$str = file_get_contents($path);
$friends = json_decode($str, true)["content"];
foreach ($friends as $key => $value){
if($body["number"] == $iid){
//删除该项
unset($friends[$key]);
echo "已删除\"".$iid."\"";
break;
}
}
//生成新的json,且不转义
$newJson = json_encode(array(
"code" => "0",
"content" => array_values($friends),
), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
file_put_contents($path, $newJson);
}
仓库设置
导入或自建以下仓库
https://gitee.com/dearxuan/friends.git
修改README文件,替换为自己网站的信息
其中.gitee/ISSUE_TEMPLATE.zh-CN.md文件用于存放issue模板,可以视需求修改
在仓库的 “管理”-“WebHooks” 中添加一个新的WebHook,如下图
其中URL为你的php文件的路径,WebHook密码就是上面你自己修改的密码。勾选“Issue”事件,并“激活”
使用
在issue页面新建issue,注意要确保格式正确,否则无法解析为json
修改issue的状态,其中只有“已完成”会展示。原本想用tag,但是gitee不支持issue的tag推送
在webhook页面可以看到历次请求结果
如果先修改状态再删除issue,会导致触发两次删除操作,wenhook页面可以看到报错,但是不影响使用