抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

介绍

本文使用Gitee实现Volantis主题友链功能,其中友链使用的是site标签,因为该标签可以展示图片,如

1
{% sites repo:example.json api:https://example.dearxuan.com %}

友链api的最终路径为 api + “版本” + repo,如上面代码的最终路径为

1
https://example.dearxuan.com/v1/example.json

其中版本可能会改变,在友链页面查看源代码,Ctrl+F搜索你的api路径即可找到最终路径

在使用前请先创建好对应文件,如上面的例子,则需要创建网站根目录/v1/example.json

PHP文件

在任意网站目录下创建php文件,如"gitee.php"(文件名随意),粘贴以下代码,其中“password”为你自己设置的密码,之后会用到

“path”为你的友链最终路径,其中__FILE__是指运行目录,通常就是你的网站的根目录,也可以改为绝对路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?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);
}

仓库设置

导入或自建以下仓库

1
https://gitee.com/dearxuan/friends.git

修改README文件,替换为自己网站的信息

其中.gitee/ISSUE_TEMPLATE.zh-CN.md文件用于存放issue模板,可以视需求修改

在仓库的 “管理”-“WebHooks” 中添加一个新的WebHook,如下图

其中URL为你的php文件的路径,WebHook密码就是上面你自己修改的密码.勾选“Issue”事件,并“激活”

DearXuan

使用

在issue页面新建issue,注意要确保格式正确,否则无法解析为json

修改issue的状态,其中只有“已完成”会展示.原本想用tag,但是gitee不支持issue的tag推送

在webhook页面可以看到历次请求结果

如果先修改状态再删除issue,会导致触发两次删除操作,wenhook页面可以看到报错,但是不影响使用

评论