制作一个简单的Link Preview服务

1. 什么是Link Preview

Link Preview是指鼠标移动到一个超链接上,会自动显示该链接的标题、描述、图片等信息,如下图所示:

维基百科

当我们在浏览维基百科时,会发现在发送维基百科的链接时,会自动显示维基百科的标题、描述、图片等信息,这就是Link Preview的效果。效果有点类似,标签的 title 属性,但是Link Preview的效果更加丰富,而且不需要等待太长时间。

也是最近逛推的时候,发现了这个网站:Cali Castle,增加了这个功能,大概实现是一个get请求返回了一张图片,然后在页面上显示了这张图片,这个图片就是Link Preview的效果。

Cali Castle

2. 如何实现(待更新)

待更新……

  1. 接口能力:使用 nodejs 实现一个接口,接收一个 url 参数,返回一个图片。
  2. 业务开发:使用 API 返回的图片。展示出来(显示隐藏等逻辑)。

3. 本地开发(待更新)

  • chrome-aws-lambda
  • puppeteer

4. 部署

这里提供了两种部署方式:Vercel、阿里云;因为我在Vercel上部署的时候,发现内存不足<sup> [问题1] </sup>,部分功能受到限制,所以就在阿里云上部署了。

4.1 部署到Vercel(待更新)

需要注意的是, Vercel 的免费版,内存有限制,我们只能实现基本的功能,访问日志和缓存截图文件<sup> [1] </sup>:

4.2 部署到阿里云ECS

4.2.1 安装依赖

我的服务器是阿里云的ECS,系统是CentOS Linux release 7.9.2009,安装以下依赖:

  • alsa-lib.x86_64
  • atk.x86_64
  • cups-libs.x86_64
  • gtk3.x86_64
  • ipa-gothic-fonts
  • libXcomposite.x86_64
  • libXcursor.x86_64
  • libXdamage.x86_64
  • libXext.x86_64
  • libXi.x86_64
  • libXrandr.x86_64
  • libXScrnSaver.x86_64
  • libXtst.x86_64
  • pango.x86_64
  • xorg-x11-fonts-100dpi
  • xorg-x11-fonts-75dpi
  • xorg-x11-fonts-cyrillic
  • xorg-x11-fonts-misc
  • xorg-x11-fonts-Type1
  • xorg-x11-utils
yum install -y alsa-lib.x86_64 atk.x86_64 cups-libs.x86_64 gtk3.x86_64 ipa-gothic-fonts libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXrandr.x86_64 libXScrnSaver.x86_64 libXtst.x86_64 pango.x86_64 xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-fonts-cyrillic xorg-x11-fonts-misc xorg-x11-fonts-Type1 xorg-x11-utils

安装依赖项后,您需要使用此命令更新 nss 库

yum update nss -y

参见官方文档:Chrome doesn’t launch on Linux

需要安装依赖,否则会报一些奇怪的错误 <sup> [问题2] </sup>。

4.2.2 执行部署

把代码上传到服务器。安装依赖:

阿里云上安装依赖,需要使用淘宝的镜像源,否则会报错,安装依赖:

cnpm install

测试代码是否可以正常运行:

node index.js
> Server is start 9000.

打开一个新的终端,测试接口是否正常:

curl http://localhost:9000/api?url=https://webclown.net

注意这里返回的是一个图片实体文件,终端输出内容比较多。

配置nginx,配置文件如下:

server {
    listen       80;
    server_name  webclown.com;

    location /api {
        proxy_pass http://localhost:9000;
        proxy_redirect http://localhost:9000 https://webclown.net;
    }
}

如果真正用于生成环境,设置防盗链功能,防止被恶意盗用,简单的防盗链可以以 referer、user Agent 为条件,设置防盗链,如下所示:

server {
    ...
    location /api {
        # 如果 reffer 不是 webclown.net 则返回 403
        if ($http_referer !~* (webclown.net)) {
            return 403;
        }
        # 如果没有 ua 则返回 403
        if ($http_user_agent = "") {
            return 403;
        }
        proxy_pass http://localhost:9000;
        proxy_redirect http://localhost:9000 https://webclown.net;
    }
    ...
}

问题

  • 问题1:Vercel 内存不足,无法正常运行。
    Error: Runtime exited with error: exit status 1
    Runtime.ExitError
  • 问题2:阿里云上,无法正常运行,没有安装依赖。
    error while loading shared libraries: libatk-bridge-2.0.so.0: cannot open shared object file: No such file or directory

注:

  1. 缓存截图文件:以链接的上的query参数的 md5 作为文件名,生成缓存截图文件,加快访问速度,这里也只是简单的实现,不考虑文件的持久化储存、定时清理等边界功能,这是一个复杂的点,这里不展开说明。

参考资料:

  1. Express
  2. Vercel
  3. Puppeteer
  4. alixaxel / chrome-aws-lambda
  5. Chrome doesn’t launch on Linux
  6. Cali Castle
  7. michaelkitas / Puppeteer-Vercel

获取统计相关免费数据源

Trading Economics

https://tradingeconomics.com/

世界银行

https://www.worldbank.org/en/home

Our World in Data

https://ourworldindata.org/

OECD

https://data.oecd.org/

IMF

https://www.imf.org/en/Data

中国统计局

http://www.stats.gov.cn/

TIPS

尽可能查找一手信息,一手信息的价值远远大于二手信息。

  • 一个国家数据
    • GDP
    • CPI
    • 就业率
    • ……
  • 一个公司
    • 公司年报
    • 创始人访谈
    • ……

在 macOS 上安装 Photoprism

目的

二次开发 或 贡献代码(Contribution)

准备

  • 系统:macOS Ventura 13.3.1 (22E261)(M1 Pro)
  • git
  • make
  • docker & docker-compose
  • nodejs

开始

参照官方文档:Setting Up Your Development Environment

1、克隆仓库

git clone git@github.com:photoprism/photoprism.git

cd photoprism

2、启动本地开发环境

make docker-build

docker compose up

# 或 后台进程
# docker compose up -d

3、安装依赖

make terminal

make dep

make build-js

make build-go

./photoprism start

完成

执行到这一步基本上就完成。

  • http://localhost:2342
  • https://localssl.dev

账号密码去 docker-compose.yml 文件里面环境变量(environment)处寻找。

  • 账号KEY: PHOTOPRISM_ADMIN_USER
  • 密码KEY: PHOTOPRISM_ADMIN_PASSWORD

遇见问题

问题一:docker compose up 无法正常安装 tensorflow lib 库

执行 docker compose up 时有一个步骤需要安装 tensorflow lib 库,我这边碰见一个问题是,

安装了一个不存在的版本:https://dl.photoprism.app/tensorflow/arm64/libtensorflow-arm64-auto-1.15.2.tar.gz,连接上多了一个 auto

正确版本应该是:https://dl.photoprism.app/tensorflow/arm64/libtensorflow-arm64-1.15.2.tar.gz

修改一下这个文件的68行: scripts/dist/install-tensorflow.sh:68,删除选中的代码即可。

临时删除(-${TF_DRIVER})

是否正确,需要去这个网站查看下是否有对应的源文件:https://dl.photoprism.app/tensorflow/arm64

问题二:make build-go 安装慢

make build-go 安装慢,可以设置代理(阿里云):

export GO111MODULE=on
export GOPROXY=https://mirrors.aliyun.com/goproxy/
make build-go

macOS 如何修复问文件夹权限 drwxr-xr-x+、drwxr-xr-x@ 删除+、@权限

@

规则:如果文件夹有@,则表示有ACL权限。

xattr -c <finder>

示例:

> ll
drwxr-xr-x@ 14 yantao  admin   448B  4 17 01:38 code
> xattr -c code
> ll
drwxr-xr-x  14 yantao  admin   448B  4 17 01:38 code

+

规则:如果文件夹有+,则表示有ACL权限或者有扩展属性。

chmod -N <finder>

示例:

> ll
drwxr-xr-x+   5 yantao  admin     170 Oct  5 03:43 Desktop
drwxr-xr-x+  17 yantao  admin     578 Sep 25 22:20 Documents
> chmod -N ~/Destop
> ll
drwxr-xr-x    5 yantao  admin     170 Oct  5 03:43 Desktop
drwxr-xr-x+  17 yantao  admin     578 Sep 25 22:20 Documents

一些资料

七牛云对象云存储

https://developer.qiniu.com/dora/3683/img-directions-for-use

图片处理 参数 简介
图片瘦身 imageslim 将存储在七牛的JPEG、PNG格式的图片实时压缩而尽可能不影响画质。
图片基本处理 imageView2 可对图片进行缩略操作,生成各种缩略图。imageView2 接口可支持处理的原图片格式有 psd、jpeg、png、gif、webp、tiff、bmp。
图片高级处理- 缩放 thumbnail 将图片缩放至指定大小。
图片高级处理- 裁剪 crop 普通裁剪、缩放裁剪
图片高级处理- 旋转 auto-orient
rotate 自适应旋转、普通旋转。
图片高级处理- 格式转换 format
colors 格式转换、GIF 颜色控制。
图片高级处理- 渐进显示 interlace 将图片调整为渐进显示。
图片高级处理- 背景色填充 background 对图片填充背景颜色
图片高级处理- 质量变换 q 对图片质量进行调节
图片高级处理- 高斯模糊 blur 对图片进行模糊处理
图片高级处理- 锐化 sharpen 对图片进行锐化处理
图片高级处理- 去除元信息 strip 可去除图片元信息,包括 exif 信息
图片高级压缩 format imageView2 和 imageMogr2 支持图片高级压缩功能,可以更加高效地将图片转化为 HEIF 高压缩比格式。
图片基本信息 imageInfo 可以获取图片格式、大小、色彩模型信息。
图片水印处理 watermark 提供四种水印接口:图片水印、文字水印,文字平铺水印、混合水印。
图片盲水印处理 watermark 为原图添加不可见水印,不影响原图质量。
图片EXIF信息 exif 获取数码相机照片的可交换图像文件格式。
图片圆角处理 roundPic 将图片生成圆角图片,并且可以指定图片的圆角大小。
图片主色调 imageAve 用于计算一幅图片的平均色调。
动图合成 animate 用于将数张图片合成 GIF。
图片全景拼接服务 stitch 可以帮助您将多张图像拼接起来,拼成一幅大的图像来创建全景图像。

Element-ui 使用经验总结

el-popover

<el-popover
  placement="top"
  width="160"
  trigger="hover"
  ref="popover"
  v-model="visible">
  <p>确认要清空所有互斥关系吗?</p>
  <div style="text-align: right; margin: 0">
    <el-button size="mini" type="text" @click="hidePopover">取消</el-button>
    <el-button type="primary" size="mini" @click="confirm">确定</el-button>
  </div>
  <i class="el-icon-delete" slot="reference"></i>
</el-popover>
export default {
    methods: {
        confirm() {
            this.hidePopover()
        },
        hidePopover() {
            this.visible = false;
            this.$refs['popover'].doClose()
        },
    }
}