volantis使用php实现Gitee友链

介绍

本文使用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页面可以看到报错,但是不影响使用

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页
评论 2

打赏作者

Dear_Xuan

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值