白嫖Gitee实现远程公告功能和小型文件上传下载

备注:20240527更新:新增私人令牌下载模式

一、准备工作

1、打开Gitee网站:Gitee.comicon-default.png?t=N7T8https://gitee.com/
2、获取access_token,用于身份验证
  • 登录后点击右上角头像,在下拉菜单中进入个人主页
  • 点击左边的个人设置
  • 点击左边菜单中的安全设置->私人令牌
  • 点击右上角生成新令牌
  • 根据提示填写信息,点击提交
  • 在弹出的页面复制令牌,注意备份保存
3、创建一个仓库用来存放文件
  • 可以把远程仓库看成一个云盘
  • 点击右上角+号->新建仓库 
  • 填写仓库名称和路径,这里需要记住路径 后续会用到,建议名称和路径保持一致

二、代码

1、上传/更新文件

参数:

file_path:待上传文件的地址,远程文件名称也会取该文件名称

target_path:上传到远程仓库内的地址,默认是根目录

owner:用户名,即仓库地址gitee.com/后面的内容

repo_path:远程仓库路径,即第一步提到的路径,即仓库地址最后的内容

access_token:第一步获取的私人令牌

该函数可以实现将本地文件上传至指定的远程仓库,如果该文件已经存在就更新文件

import base64
import os
import requests

def upload_file(file_path, target_path='',owner = "", repo_path = "",access_token = "",message="upload file"):
    base_url = "https://gitee.com/api/v5/repos/"
    
    try:
        with open(file_path, "rb") as file:
            file_content = base64.b64encode(file.read()).decode("utf-8")

        filename = os.path.basename(file_path)
        target_path = os.path.join(target_path, filename)
        data = {
            "access_token": access_token,
            "message": message,
            "content": file_content,
        }

        api_url = base_url + owner + "/" + repo_path + "/contents/" + target_path
        response = requests.post(api_url, data=data)

        # 如果文件已存在,尝试使用更新API
        if response.status_code == 400:
            update_data = {
                "access_token": access_token,
                "content": file_content,
                "sha": "",  # 在获取文件内容API中获取,先设置为空字符串
                "message": "update file",  # 可以自定义
            }

            # 获取文件的信息,以获取正确的SHA值
            get_file_url = (
                f"https://gitee.com/api/v5/repos/{owner}/{repo_path}/contents/{target_path}"
            )
            get_file_response = requests.get(
                get_file_url, params={"access_token": access_token}
            )

            if get_file_response.status_code == 200:
                sha_value = get_file_response.json().get("sha", "")
                update_data["sha"] = sha_value
                # 使用正确的SHA值进行更新
                update_url = f"https://gitee.com/api/v5/repos/{owner}/{repo_path}/contents/{target_path}"
                response = requests.put(update_url, data=update_data)

        # 检查最终的响应状态码
        response.raise_for_status()

        return response

    except Exception as e:
        return f"错误:{str(e)}"

# 示例用法
if __name__ == "__main__":
    upload_file("D:\\test.txt")
2、下载文件

依赖安装:(显示下载进度)

pip install tqdm

代码:

需要assess_token的版本:(20240527更新,可以下载最大100MB的文件)

 参数:

  remote_path:远程文件在仓库中的地址

  save_path:文件保存目录

  owner:用户名,即仓库地址gitee.com/后面的内容

  repo_path:远程仓库路径,即第一步提到的路径,即仓库地址最后的内容

  overwrite:是否覆盖下载,默认不覆盖

  access_token:私人令牌

from tqdm import tqdm
import os
import requests
import random
from pathlib import Path


# 保存到D:downloads目录下
def download_file(
    name,
    save_path="D:\\downloads",
    repo_path="",
    owner="",
    access_token="",
    overwrite=False,
):
    url = f"https://gitee.com/api/v5/repos/{owner}/{repo_path}/raw/{name}?random={str(random.randint(1, 1000))}"
    try:

        # 构造文件的完整路径
        file_name = os.path.basename(name)
        file_path = Path(os.path.join(save_path, file_name))
        # 检查远程文件是否存在
        head_response = requests.head(
            url,
            params={
                "access_token": access_token,
            },
        )
        if head_response.status_code != 200:
            print(f"远程文件丢失,更新失败: {head_response.status_code}")
            return False
        # 检查本地文件是否已经存在
        if not overwrite and file_path.exists():
            print(f"文件 '{file_name}' 已存在,将不再下载。")
            return True
        # 发起HTTP请求
        response = requests.get(
            url,
            stream=True,
            params={
                "access_token": access_token,
            },
        )
        # 获取文件总大小
        total_size = int(response.headers.get("content-length", 0))
        # 设置进度条
        block_size = 1024  # 1 KB
        progress_bar = tqdm(
            total=total_size,
            unit="B",
            unit_scale=True,
            unit_divisor=1024,
            miniters=1,
            desc="Downloading",
        )
        # 保存文件到桌面
        with open(file_path, "wb") as file:
            for data in response.iter_content(block_size):
                progress_bar.update(len(data))
                file.write(data)
        # 关闭进度条
        progress_bar.close()
        print(f"{file_name}已下载到{save_path}")
        return True
    except Exception as e:
        print(f"下载失败: {e}")
        return False

# 示例代码
if __name__ == "__main__":
    # 可以下载不超过100MB的文件
    download_file("360.exe")

直链下载版本,无需access_token,但是只能下10MB以内的文件

 参数:

  remote_path:远程文件在仓库中的地址

  save_path:文件保存目录

  owner:用户名,即仓库地址gitee.com/后面的内容

  repo_path:远程仓库路径,即第一步提到的路径,即仓库地址最后的内容

  overwrite:是否覆盖下载,默认不覆盖

import os
import random
import requests
from tqdm import tqdm
from pathlib import Path


def download_file(
    remote_path,
    save_path="D:\\downloads",
    repo_path="",
    owner="",
    overwrite=False,
):
    url = f"https://gitee.com/{owner}/{repo_path}/raw/master/{remote_path}?random={str(random.randint(1, 1000))}"
    try:
        file_name = os.path.basename(remote_path)
        file_path = Path(os.path.join(save_path, file_name))
        head_response = requests.head(url)
        if head_response.status_code != 200:
            print(f"远程文件丢失,更新失败")
            return False
        if not overwrite and file_path.exists():
            print(f"文件 '{file_name}' 已存在,将不再下载。")
            return True
        response = requests.get(url, stream=True)
        total_size = int(response.headers.get("content-length", 0))
        block_size = 1024  # 1 KB
        progress_bar = tqdm(
            total=total_size,
            unit="B",
            unit_scale=True,
            unit_divisor=1024,
            miniters=1,
            desc="Downloading",
        )
        with open(file_path, "wb") as file:
            for data in response.iter_content(block_size):
                progress_bar.update(len(data))
                file.write(data)
        progress_bar.close()
        print(f"{file_name}已下载到{save_path}")
        return True
    except Exception as e:
        print(f"下载失败: {e}")
        return False


# 示例用法
if __name__ == "__main__":
    download_file("hello.info")
3、拓展

直接获取远程文本文件的内容

例如可以用来获取公告或文档,方便远程更新

支持转义字符,例如\n  \t 等,包括改变文本和背景颜色的转义字符

import os
import random
import requests
from tqdm import tqdm
from pathlib import Path


def get_remote_text(remote_path, repo_path="", owner=""):
    url = f"https://gitee.com/{owner}/{repo_path}/raw/master/{remote_path}?random={str(random.randint(1, 1000))}"
    try:
        response = requests.get(url)
        response.raise_for_status()
        content = (
            response.content.decode("unicode_escape")
            .encode("latin1")
            .decode("utf-8")
            .strip()
        )
        return content
    except requests.exceptions.RequestException as e:
        return None
# 示例用法
if __name__ == "__main__":
    print(get_remote_text("hello.info"))

三、总结

本文是基于Python实现的,但是也可以按照文中描述的请求方法在其他语言中应用,实现类似的效果

附:Gitee API 文档链接

Gitee API 文档icon-default.png?t=N7T8https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoRawPath

electron-updater是一个用于Electron应用程序的自动更新模块。要使用gitee作为更新服务器,你需要配置electron-updater以使用gitee的release功能。以下是配置流程: 1. 在gitee上创建一个仓库,用于存放你的应用的更新版本。 2. 在该仓库中发布一个新的release,并且上传更新后的应用文件,通常这些文件包括: - 打包后的应用的.exe文件(Windows) - 打包后的应用的.dmg文件(macOS) - 打包后的应用的.AppImage文件(Linux) - 任何其他必要的资源文件 3. 设置好release后,记录下该release的标签名(tag),例如 `v1.0.0`,因为electron-updater将使用这个标签来检查更新。 4. 在你的Electron应用中,配置`electron-builder`或`electron-packager`,确保它们将应用打包后上传到gitee。 5. 在你的Electron应用代码中,使用`electron-updater`模块配置更新服务器和更新检查。示例代码如下: ```javascript const { app, dialog, autoUpdater } = require('electron'); // 设置gitee的release URL const feedURL = 'https://gitee.com/your-username/your-repo/raw/branch/update.yml'; // 使用gitee的raw URL,并指向你的更新配置文件 // 使用github的更新模式 const { GithubUpdater } = require('electron-updater'); const updater = new GithubUpdater(); updater.updateConfig({ feedURL, // 指向更新配置文件的URL owners: ['your-username'], // gitee上的用户名 repo: 'your-repo', // 仓库名 }); // 检查更新 autoUpdater.setFeedURL(feedURL); autoUpdater.checkForUpdates(); // 接收更新事件 autoUpdater.on('update-available', (_event, releaseNotes, releaseName) => { dialog.showMessageBox({ type: 'info', title: '应用更新', message: `发现新版本: ${releaseName}`, detail: releaseNotes, }).then(() => { // 下载更新 autoUpdater.downloadUpdate(); }); }); autoUpdater.on('update-downloaded', (_event, releaseNotes, releaseName) => { dialog.showMessageBox({ type: 'info', title: '更新下载完毕', message: `新版本: ${releaseName} 已下载!`, }).then(() => { setImmediate(() => autoUpdater.quitAndInstall()); }); }); ``` 注意:在上面的代码中,你需要将`feedURL`、`owners`和`repo`替换成你自己的gitee仓库信息。`feedURL`需要指向一个包含更新信息的YAML文件,该文件可以在gitee仓库中配置并更新。 6. 在你的gitee仓库中创建一个更新配置文件(如`update.yml`),并在其中填写发布版本的相关信息。 7. 当Electron应用运行时,`autoUpdater`将会检查配置的URL,如果存在新版本,则根据你的代码逻辑进行下载和安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值