惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

帽之岛 | Hat's Land

开源工具 Open Design 正在偷偷泄露你的隐私 把钱花在刀刃上:我的 Claude Code 省钱指南 科技快讯: Cloudflare 出现全球性大规模中断 Google Cloud Platform 核心服务出现全球性大规模中断 Kuma Mieru - 一款基于 Next.js 15 的 Uptime Kuma 仪表盘插件 VPS.Town 香港存储型 VPS 促销:AFF Channel 专属优惠,买断硬盘,1 元升级配置! Cloudflare 自定义页面模板 - Next.js Aqua Speed,一款更强大、更美观的跨平台 CLI 测速工具 中国大陆解禁 Onlyfans,这事保真吗? Google Chrome 从 A~Z & 2024 年度总结 Android 重大密钥泄露事件,将重创 Google 设备认证体系 2024 年国产大语言 AI 模型主观横评 关于运营社群频道:一些个人的感想和反思 DMIT 美国洛杉矶 LAX 硬件升级,全线补货,折后$39美元/年起! 美团信用卡数据泄露传闻:分析与观点 Cloudflare 近日发布第 12 代服务器,AMD, Yes! 浅谈 SS7 攻击:窥探隐私的利器 在 Vite 开发环境中优雅地开始 HTTPS 调试 如何优雅地从 Authy Desktop 中导出 TOTP 密钥 如何注册一个特别的 Outlook 邮箱? Skywolf 香港 Lumen VPS 综合测评,折后 $3美元/月起售,移动神机 聊聊 Linux 系统时间同步机制:从 NTP 到 Chrony 自用脚本 | 自签 SSL 证书 NNC 日本BGP VPS 综合测评 NNC 香港VPS - Premium 综合测评,折后$6/月起 关于我 友情链接 特殊排版测试
自用 API 之随机猫猫头像
Hat · 2024-11-25 · via 帽之岛 | Hat's Land

发布时间:2024-06-18 14:30

最后编辑:2024-11-25 02:55

全文大约 935 字(读完需 4 分钟)

本文目录

简介 ​

本博⁢客的老⁢︀读者可能︀会⁢发现一︁个有意思⁣的︁点:⁣本站的 log︀o⁢ 似乎⁣︁每天都会换一⁢︀只新的猫︀猫头像。⁢

于是笔者⁣索性︁将其封装⁣︁为一个开放⁣的︁ API⁣ 托管︁至 Clo⁣︁udf︁la⁣re Work⁣︁ers︁,方⁣便各位读⁣︁者免费调用。︀

使用指南 ​

基本信息 ​

AP⁢I︁ 端点:⁣ https://random-cat-assets-r2.hats-land.com/
速率限制︁:⁣ 30 RPM/IP (每I︀P每⁢分钟30次⁣请︁求)︀
响应格⁢式:⁣ WebP, PNG, JSON 可︁选

直接引用图片 ​

GET https://random-cat-assets-r2.hats-land.com/api/v1/images

A⁣︁PI 默认根⁣据浏︁览器请求信息自⁢适︀应返⁢︀回 WebP⁢ 还是 P︀NG,︀如⁢果你想指⁣定︁返回的︁图片⁣格式,可以⁢添加︀以下⁣参数:︁

  • ?format=png 强︀制返回⁢ PNG 格式的⁢︀图片
  • ?format=webp 强制︁返回⁣ W⁢ebP︀ 格式的︁图片

JSON API ​

请求 ​

GET https://random-cat-assets-r2.hats-land.com/api/v1/json

响应 ​

J⁣SON A⁣PI︁ 示例返回:⁣︁

json

{
  "url": {
    "png": "https://s3-apac.hats-land.com/cat-assets/avatar/pb-5767334.png",
    "webp": "https://s3-apac.hats-land.com/cat-assets/avatar/pb-5767334.webp"
  },
  "width": 853,
  "height": 853
}

小贴士 ​

  1. 此 A︁PI 并⁣不保⁢证 SL︀A 可用⁢性︀,请提⁣前处理︁可能遇到⁢的︀错误。

  2. 请⁢尽︀量选择⁣ Web︁P 格式,目前⁣︁浏览器中⁢︀除了︀ IE 均⁢支持⁣ WebP︁。

常见问题 ​

这个 API 适合生产环境直接依赖吗? ​

不︁建议将⁣其作为唯一︁头⁣像⁢来源。它︀更︀适合⁢默认头像、⁢占︀位图等轻量︀场景⁢,生产环境⁢︀建︁议⁣做缓存和降⁣级逻︁辑。︀

什么时候应优先选择 JSON 接口? ​

当你⁢需要拿到图片⁢尺︀寸、做前︁端⁣自定︁义渲⁣染或后续处⁣︁理时,⁣优先使︁用 /api/v1/json,这⁣︁样可以同时︁拿到 png/webp 地址⁣与︁宽高⁣信息。︁

为什么推荐优先使用 WebP? ​

WebP⁣ 通常能⁣在接近︁质量下⁣显著︁降低体积,⁢︀减少︀页面加⁢载时间和⁣︁带宽开销,适⁣合︁头像这⁢类高︀频︀资源。

示例代码 ​

你⁢可以使用以⁢︀下代⁣码︁示例以实现︀快⁢速嵌入︁这个 ap⁣i︀,例如控⁢制面板中的默⁣︁认头像。⁢(︀可⁣选择不同︁语⁣︁言哦)

原生 Fetch 实现jQuery.js 实现原生 xhr 实现Vue 3React 18Svelte

javascript

(()=>{
  const getRandomCat = () => 
    fetch('https://random-cat-assets-r2.hats-land.com/api/v1/json', {
      headers: { 'Accept': 'application/json' }
    })
    .then(r => r.json())
    .then(d => {
      const i = new Image();
      i.src = d.url.webp; // 可选 d.url.png
      i.alt = 'Random Cat Avatar';
      document.querySelector('.random-cat')?.replaceChildren(i);
    })
    .catch(e => console.error('RandomCat fetch failed:', e));

  document.addEventListener('DOMContentLoaded', getRandomCat);
})();

javascript

$(document).ready(() => {
  $.ajax({
    url: 'https://random-cat-assets-r2.hats-land.com/api/v1/json',
    method: 'GET',
    dataType: 'json',
    headers: { 'Accept': 'application/json' }
  })
  .done(data => {
    const img = $('<img>', {
      src: data.url.webp, // 可选 data.url.png
      alt: 'Random Cat Avatar'
    });
    $('.random-cat').empty().append(img);
  })
  .fail(err => console.error('RandomCat fetch failed:', err));
});

javascript

(()=>{
  const xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://random-cat-assets-r2.hats-land.com/api/v1/json');
  xhr.setRequestHeader('Accept', 'application/json');
  
  xhr.onload = function() {
    if (xhr.status === 200) {
      const data = JSON.parse(xhr.responseText);
      const img = new Image();
      img.src = data.url.webp; // 可选 data.url.png
      img.alt = 'Random Cat Avatar';
      document.querySelector('.random-cat')?.replaceChildren(img);
    }
  };
  
  xhr.onerror = function() {
    console.error('RandomCat fetch failed:', xhr.statusText);
  };
})();

vue

<template>
  <div class="random-cat">
    <img v-if="catUrl" :src="catUrl" alt="Random Cat Avatar" />
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'

const catUrl = ref('')

const getRandomCat = async () => {
  try {
    const res = await fetch('https://random-cat-assets-r2.hats-land.com/api/v1/json', {
      headers: { 'Accept': 'application/json' }
    })
    const data = await res.json()
    catUrl.value = data.url.webp // 可选 data.url.png
  } catch (err) {
    console.error('RandomCat fetch failed:', err)
  }
}

onMounted(getRandomCat)
</script>

jsx

import { useState, useEffect } from 'react'

function RandomCat() {
  const [catUrl, setCatUrl] = useState('')

  useEffect(() => {
    fetch('https://random-cat-assets-r2.hats-land.com/api/v1/json', {
      headers: { 'Accept': 'application/json' }
    })
      .then(r => r.json())
      .then(d => setCatUrl(d.url.webp)) // 可选 d.url.png
      .catch(e => console.error('RandomCat fetch failed:', e))
  }, [])

  return (
    <div className="random-cat">
      {catUrl && <img src={catUrl} alt="Random Cat Avatar" />}
    </div>
  )
}

export default RandomCat;

svelte

<script>
  import { onMount } from 'svelte'
  
  let catUrl = ''
  
  onMount(async () => {
    try {
      const res = await fetch('https://random-cat-assets-r2.hats-land.com/api/v1/json', {
        headers: { 'Accept': 'application/json' }
      })
      const data = await res.json()
      catUrl = data.url.webp // 可选 data.url.png
    } catch (err) {
      console.error('RandomCat fetch failed:', err)
    }
  })
</script>

<div class="random-cat">
  {#if catUrl}
    <img src={catUrl} alt="Random Cat Avatar" />
  {/if}
</div>

HTML 使用示例 ​

html

<div class="random-cat" style="aspect-ratio:1/1"></div>

参考资料 ​

相关阅读 ​

版权信息 (点击展开)

cs

Copyright (c) @ Hat's Blog www.hats-land.com
Released Date @ 2024-09-26 '/archives/technology/open-api-for-random-cat-avatars'
GPG Signature: 'https://www.hats-land.com/gpg-public.txt' (F166C5F4F897B96A07390B8574E3D911A0E70FEC)

// -----BEGIN PGP MESSAGE-----

// hF4DYvdQZ6S+TycSAQdA4YLsG2kv3qaa0J5LKHRD56rI8wna3OoKIwnHVzOiQCww
// axDk+KcrP3YULoLr7857CluyUtM+UW/Zyg9F0WYzDgeG9aPBMlh/W2eKWQ9qdDeh
// 1MCCAQkCECgQXU6drqBDjsv3t9nRLpMS/aMGtZ5/PrYRPROymKdDuSz48qiQQkHo
// XBtf2goIqYwYngpXD/b9F+vJ09O1UhxKCZUllIhMArM/GcUJTKmWsCGwp7YA/noW
// zuNVud4K34PUiodjvuyEIsEP/8E2C32FG4MtPOkYJ3Q5VNNliq3nh7Q/BCOaGSKb
// JpsezETOmxbwATVK6NphwBeEWVWA0wcHghSTj8itDNHH3WBeUwINptcpQ66wzuJ6
// gq5pt3wQ77d+gcHUW8yXk8i6F3eRS1q1qmc5/hQKlBWNsC+Xo+l7VJOsd2/sfkjh
// LAA84DyJPkyt3TAUyfMlv5WHoCBd3hgjHQFNMf+X1j8zmusc5qO2oJTp6DAfMgs9
// CVQvIWPgM64jTYFJYz+RdPSaevJD1HEuiNaY7KtCUIJfA1RMYw==
// =ahI2
// -----END PGP MESSAGE-----