在本文中,将详细介绍如何在 Vercel 平台上部署一个具有分类功能的随机图片 API。通过这个 API,用户可以根据不同的分类获取随机图片链接,并且还可以从所有分类中随机获取一张图片。

项目结构

首先,我们需要确定项目的目录结构,如下所示:

random-image-api/
├── api/
│ ├── meinv.txt
│ ├── dongman.txt
│ ├── randomImage.js
├── public/
│ ├── index.html
│ ├── favicon.ico
├── package.json
└── vercel.json

1. 准备分类文本文件

api 目录下创建 meinv.txtdongman.txt 文件,并在每个文件中添加图片链接,每行一个链接。例如:

当然你也可以自己创建新分类,只要格式为.txt就行

meinv.txt

https://example.com/meinv1.jpg
https://example.com/meinv2.jpg

dongman.txt

https://example.com/dongman1.jpg
https://example.com/dongman2.jpg

2. 创建 randomImage.js

api 目录下创建 randomImage.js 文件,并添加以下代码:

const express = require('express');
const fs = require('fs');
const path = require('path');
const cors = require('cors'); const app = express(); // 使用cors中间件
app.use(cors({
origin: '*'
// 或者指定特定的域名
// origin: 'https://www.api1.link'
})); // 从public目录中读取静态文件
app.use(express.static('public')); // 从指定文件中获取随机图像链接的函数
const getRandomImage = (filePath) => {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
reject(err);
} else {
const lines = data.split('\n').filter(line => line.trim() !== '');
const randomLine = lines[Math.floor(Math.random() * lines.length)];
resolve(randomLine);
}
});
});
}; // 从所有文本文件中随机获取图片链接的函数
const getRandomImageFromAllFiles = () => {
return new Promise((resolve, reject) => {
const dirPath = path.join(__dirname);
fs.readdir(dirPath, (err, files) => {
if (err) {
reject(err);
} else {
const txtFiles = files.filter(file => file.endsWith('.txt'));
if (txtFiles.length === 0) {
reject(new Error('No text files found'));
} else {
const promises = txtFiles.map(file => getRandomImage(path.join(dirPath, file)));
Promise.all(promises)
.then(results => {
const allImages = results.flat();
const randomImage = allImages[Math.floor(Math.random() * allImages.length)];
resolve(randomImage);
})
.catch(reject);
}
}
});
});
}; // 所有类别随机图像的路由
app.get('/random', async (req, res) => {
try {
const imageUrl = await getRandomImageFromAllFiles();
res.redirect(imageUrl);
} catch (error) {
res.status(404).send('No images found');
}
}); // 主页文档的默认路由
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, '../public/index.html'));
}); // 指定类别随机图像的路由
app.get('/:category', async (req, res) => {
const category = req.params.category;
const filePath = path.join(__dirname, `${category}.txt`); try {
const imageUrl = await getRandomImage(filePath);
res.redirect(imageUrl);
} catch (error) {
res.status(404).send('Category not found');
}
}); module.exports = app;

3. 创建 index.html

public 目录下创建 index.html 文件,内容如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>随机图 | API</title>
<link rel="icon" href="/favicon.ico">
<style>
html,
body {
margin: 0;
color: #424242;
font-weight: 300;
font-family: "-apple-system", "BlinkMacSystemFont",
"Helvetica Neue", "PingFang SC", "Microsoft YaHei",
"Source Han Sans SC", "Noto Sans CJK SC",
"WenQuanYi Micro Hei", "sans-serif";
font-size: 16px;
} * {
box-sizing: border-box;
} header {
padding: 40vh 0 8vh 0;
text-align: center;
font-weight: 100;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
height: 100vh;
overflow: hidden;
background: #a0e5e4;
} h1,
h2,
h3 {
font-weight: 400 !important;
font-weight: bold;
margin: 0;
} h1 {
font-size: 3.5rem;
padding: 20px;
} h2 {
font-size: 2rem;
font-weight: 300;
text-align: center;
} h3 {
font-size: 1.5rem;
font-weight: 300;
} #scroll-down {
background-color: transparent;
margin-top: 2rem;
width: 2rem;
height: 2rem;
border-radius: 50%;
border: 2px solid #424242;
cursor: pointer;
animation: bounce 2s infinite 2s;
} #scroll-down::before {
display: block;
content: "";
transform: rotate(-45deg) translate(0.15rem, 0.15rem);
width: 0.4rem;
height: 0.4rem;
border: 2px solid #424242;
border-width: 0px 0 2px 2px;
} a {
text-decoration: none;
color: #5fbf62;
font-weight: bold;
} p {
font-size: 18px;
line-height: 1.6;
} main {
padding: 1vw;
} section {
padding: 1rem;
} footer {
padding: 1vh;
text-align: center;
background-color: #aaaaaa;
} footer a {
color: #1e03ea;
} footer a:hover {
text-decoration: underline;
} @keyframes bounce {
0%,
100%,
20%,
50%,
80% {
transform: translateY(0);
} 40% {
transform: translateY(-10px);
} 60% {
transform: translateY(-5px);
}
}
</style>
</head> <body>
<header>
<section>
<h1>随机图 | API</h1>
<h3>使用文档</h3>
</section>
<button id="scroll-down"></button>
</header>
<main>
<section>
<h2>随机图片 API</h2>
<p>欢迎使用随机图片 API!你可以通过以下路径获取随机图片:</p>
<ul>
<li><strong>/random</strong> - 随机获取 <a>一张</a> 图片</li>
<li><strong>/meinv</strong> - 随机获取 <a>美女</a> 图片</li>
<li><strong>/dongman</strong> - 随机获取 <a>动漫</a> 图片</li>
</ul>
<p>示例:</p>
<ul>
<li>
<a href="/random" target="_blank"
>https://your-domain.vercel.app/random</a
>
</li>
<li>
<a href="/meinv" target="_blank"
>https://your-domain.vercel.app/meinv</a
>
</li>
<li>
<a href="/dongman" target="_blank"
>https://your-domain.vercel.app/dongman</a
>
</li>
</ul>
</section>
</main>
<script>
document
.getElementById("scroll-down")
.addEventListener("click", function () {
document.querySelector("main").scrollIntoView({
behavior: "smooth",
});
});
</script>
<footer>
<p>
<a href="https://github.com/aizhiqian">Github</a>
</p>
</footer>
</body>
</html>

4. 添加 favicon.ico

favicon.ico 文件放在 public 目录下。你可以使用任意图标生成工具生成 favicon.ico 文件。

5. 创建 package.json

在项目根目录下创建 package.json 文件,内容如下:

{
"name": "random-image-api",
"version": "1.0.0",
"main": "api/randomImage.js",
"dependencies": {
"express": "^4.19.2",
"cors": "^2.8.5"
}
}

6. 创建 vercel.json

在项目根目录下创建 vercel.json 文件,内容如下:

{
"version": 2,
"builds": [
{
"src": "api/randomImage.js",
"use": "@vercel/node"
},
{
"src": "/public/**",
"use": "@vercel/static"
}
],
"routes": [
{
"src": "/",
"dest": "/public/index.html"
},
{
"src": "/favicon.ico",
"dest": "/public/favicon.ico"
},
{
"src": "/(.*)",
"dest": "/api/randomImage.js"
}
]
}

7. 部署到 Vercel

当然你也可以创建一个新的 Github 仓库,把代码推送到该仓库,然后在 Vercel 中选择该仓库直接部署。

这样你就不需要执行下述命令了。

在项目根目录中,打开终端并运行以下命令以部署到 Vercel:

npm install -g vercel
vercel

按照提示登录或注册 Vercel 账号,并选择你的项目配置。部署完成后,你将获得一个域名。通过访问该域名及其路径,你可以实现上述功能。

例如:

  • https://your-domain.vercel.app/ 显示项目的主页
  • https://your-domain.vercel.app/random 获取所有 .txt 文件中的随机图片
  • https://your-domain.vercel.app/meinv 获取 “meinv.txt” 文件中的随机图片
  • https://your-domain.vercel.app/dongman 获取 “dongman.txt” 文件中的随机图片
  • https://your-domain.vercel.app/新分类 获取 “新分类.txt” 文件中的随机图片

这样,你就成功创建并部署了一个具有分类功能的随机图片 API,并添加了主页说明文档。希望这篇文章能帮助你在 Vercel 上轻松部署你的随机图片 API。

在 Vercel 部署随机图 API的更多相关文章

  1. 整理记录一些好用的随机图API

    最近自己博客使用的随机图API有些不稳定,自己又去搜集了一些有意思的随机图API,这里做一个整理记录 注意!!!本文链接最后测试时间----2021年11月21日 主题作者Tagaki的API(有时候 ...

  2. 【vps】教你写一个属于自己的随机图API

    [vps]教你写一个自己的随机图API 前言 刚刚开始使用halo博客的时候,我就发现halo博客系统是可以使用随机图当背景的,所以也是使用了网上一些比较火的随机图API. 在上次发现了各种图片API ...

  3. 小幻美图 API

    『不忘初心,方得始终.』 小幻美图 API 更新:2015.03.29 目前提供的API共有10种! 必应各种今日获取API共4种! 本站收录图片获取API共4种! 网络图片尺寸修改API共1枚! 百 ...

  4. 15个随机图片API

    15个随机图片API 妈妈再也不用担心我网站没图用了呜 请不要重复刷新此页面 ! 找了很久的说,你难道不想收藏一下吗 其中有些 API 速度并不太好,可能会拖慢贵站的速度 我也不能保证这些 API 能 ...

  5. Erdos-Renyi随机图的生成方式及其特性

    1 随机图生成简介 1.1 \(G_{np}\)和\(G_{nm}\) 以下是我学习<CS224W:Machine Learning With Graphs>[1]中随机图生成部分的笔记, ...

  6. 【百度地图API】发布静态图API啦!只需一个网址,即可展示定制百度地图!

    原文:[百度地图API]发布静态图API啦!只需一个网址,即可展示定制百度地图! 摘要: 百度地图静态图API!您无须执行任何“特殊”操作便可在网页上显示此图片. 不需要 JavaScript.我们只 ...

  7. 刷题总结——随机图(ssoi)

    题目: 随机图 (random.cpp/c/pas) [问题描述] BG 为了造数据,随机生成了一张�个点的无向图.他把顶点标号为1~�. 根据BG 的随机算法,对于一个点对�, �(1 ≤ � &l ...

  8. rocketmq学习(二) rocketmq集群部署与图形化控制台安装

    1.rocketmq图形化控制台安装 虽然rocketmq为用户提供了使用命令行管理主题.消费组以及broker配置的功能,但对于不够熟练的非运维人员来说,命令行的管理界面还是较难使用的.为此,我们可 ...

  9. 部署.Net Core APi+Vue 到 linux centos 服务器(一)

    部署.Net Core APi+Vue 到 linux centos 服务器(一) 前言:项目采用的是 .net core 作为接口,vue作为前端. 此时需要把整个项目架设到linux centos ...

  10. 【cs224w】Lecture 1 & 2 - 图的性质 及 随机图

    目录 Lecture 1: Introduction Lecture 2: Properties and Random Graph Degree Distribution Path Length Cl ...

随机推荐

  1. HTML标签 b 和 strong 的区别

    <b>标签和<strong>标签都表示加粗,效果通常是一样的: <b>:义演丁真<strong>:义演丁真 类似的还有<em>和<i& ...

  2. 为什么会有unknown模块

    当一个模块在free后,他的线程仍然在运行时,会导致GetModuleName失败,返回unknown

  3. ROS中无法定位软件包问题

    ROS 和ubuntu版本对应关系

  4. 元类、实现ORM

    阅读目录: 元类 元类实现ORM 元类 1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class Obj ...

  5. .NET云原生应用实践(五):使用Blazor WebAssembly实现前端页面

    本章目标 使用Blazor WebAssembly实现管理"贴纸"页面 集成认证与授权机制 如果你对Blazor WebAssembly的使用不感兴趣,可以跳过本章的阅读.你也可以 ...

  6. MobaXterm连接Ensp回车显示^M,无法敲回车并且报错

    最近,在使用MobaXterm连接ensp的时候,发现输入回车键,却不能出现回车的效果,反而打出了^M字符. 临时解决办法: 永久解决办法: 加入以下三行,可以永久关闭回显 [MottyOptions ...

  7. 远程连接Docker服务

    背景 本地开发了一个SpringBoot项目,想通过Docker部署起来,我本地是Window10系统,由于某些原因不能虚拟化并且未安装Docker-Desktop,所以我在想有没有办法本地不需要虚拟 ...

  8. ARC134C The Majority

    ARC134C The Majority link:[ARC134C] The Majority 小清新数学题.(反正我做不出来) 简要题意 有\(K\)个箱子,编号为\(1\)到\(K\)的箱子.起 ...

  9. YIi2 Object 报错问题

    yii2的老版本会有在PHP7运行的错误提示 Cannot use yii\base\Object as Object because 'Object' is a special class name ...

  10. NoSQL一致性

    上面我们讲到了通过将数据冗余存储到不同的节点来保证数据安全和减轻负载,下面我们来看看这样做引发的一个问题:保证数据在多个节点间的一致性是非常困难的.在实际应用中我们会遇到很多困难,同步节点可能会故障, ...