poster

package
v0.0.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 6, 2021 License: Apache-2.0 Imports: 20 Imported by: 0

README

POSTER 小程序分享海报

GO建纯后端绘制的小程序海报图片

生成带二维码的分享海报图片,常见的解决方式是在前端页面进行canvas绘制并获取快照图片,后端生成的案例寥寥无几。
poster就是后端生成海报图片的一种简单实现,其适用于微信小程序海报分享,提示用户长按保存到系统相册后可以转发给朋友、分享到朋友圈。用户点击朋友圈图片,长按识别二维码后就可以跳转到小程序中。

海报案例

生成的海报内容包括主图、二维码图、文字内容和标题。

海报

开始

准备

下载build里面的可执行文件和相关字体
目录文件,除了poster二进制程序外还需要font字体文件

- poster
- resources/font.ttc
运行
# 首次需要增加执行权 chmod +x ./poster
# 首次运行会提示填写配置,填写完后再次运行
./poster
# 调试ok后在后台运行
# nohup ./poster &

配置文件

{
    "mapp": {
        "app_id": "小程序app_id,可选,除非命令行测试运行,否则请用自己的业务系统维护的access_token传值替代",
        "app_secret": "小程序app_secret,可选,除非命令行测试运行,否则请用自己的业务系统维护的access_token传值替代"
    },
    "output_dir": "海报保存目录,可选,默认:./output/",
    "listen_port": "http服务监听端口,可选,默认:2020",
    "fontfile_path": "字体路径,可选,默认: ./resources/font.ttc"
}
HTTP调用
POST / HTTP/1.1
Host: 127.0.0.1:2020
Content-Type: application/x-www-form-urlencoded

access_token=32_fsmZvI40T32ZFTagB4h264eeK1Xgk-XU3Z7DeWTXj4KB24eJkw4Tq3olPVI0Y-s0rBBb8WIVKFVCN5_t7_NXaj5FBq9SDvzHTbrj4_xczKGq3QOByxankwjTbmskDsSG8BPJkReAC0csBu7RKTIaAAAUDS&
scene=10&
page=pages/index/index&
width=640&
title=标题文字&
content=内容文字&
image_url=http://img.mcdsh.com/storage/images/800/O5xEIoExzNk97bRLhaIe0izqo3XbnXKi6j9BWPQb.jpeg&
border_color=#ffffff

参数

access_token 是微信请求微信接口的access_token,需要在自己的业务系统中保持唯一,避免单独使用appid 和 appsecret生成,生成小程序码需要使用到这个参数。
scenepage是小程序获取二维码的参数 width 是海报图片的宽度,string类型,太大会失真 title 是海报底部主标题,不易过长 content 是文字描述,最多可显示3行文字
image_url 是海报主图的URL链接,也可以是主机本地文件绝对路径
border_color 边框和背景色,换其他颜色二维码会有些锯齿

正常返回

{
  "error": 0,
  "result": {
    "poster": "DSGSrZHwzOwFrr6V.jpg",
    "qrcode": "d7VWwZQRprO56Zun.jpg"
  }
}

输出目录中会生成海报图片和小程序码图片,将目录暴露到web目录中即可访问到(比如 ln -s /your/output/dir /var/www/html/poster)。

HTTP请求也支持JSON格式

POST / HTTP/1.1
Host: 127.0.0.1:2020
Content-Type: application/json

{
	"access_token":"32_lpIVQGG-qAdXpaUn__X3W47MmWwm-8fIKDmreYnm77ON0E76BmtZXsoZpoIL0_HOre_D6Gr53s4Wv_n41n7mrmUAA7hm-SROYREM0xhX6oCtSds2QoYwv5wtqGh4uRIzCJPJ-ka8BWaJr_l6IYSdADAQGA",
	"scene":"10",
	"page":"pages/index/index",
	"width":"640",
	"title":"标题文字",
	"content":"内容文字",
	"image_url":"http://img.mcdsh.com/storage/images/800/O5xEIoExzNk97bRLhaIe0izqo3XbnXKi6j9BWPQb.jpeg",
    "border_color":"#ffffff"
}
CLI命令行测试运行

可以直接使用命令行方式跑一遍看下效果,此方式需要填写配置文件中的mapp.app_id 和 mapp.app_secret,会挤掉自己业务系统中的access_token,仅供测试。

./poster -cli \
-imageURL=http://img.mcdsh.com/storage/images/800/O5xEIoExzNk97bRLhaIe0izqo3XbnXKi6j9BWPQb.jpeg \
-title=BestFriendsChina \
-content=我叫小爱,今年一岁啦,领养代替买卖,赶紧扫码带我回家吧! \
-scene=15625 \
-page=pages/pets/petDetail/petDetail

输出结果

运行成功
小程序码文件 Rw695X5PjQypzIxO.jpg
海报文件 4oikqQLBVrZHBanX.jpg

总结

这次更新取消强制填写appid和appsecret参数,改为由用户自己实现access_token的获取并传值,解决小程序生成二维码时,access_token容易被自己的业务系统挤掉导致失败的问题。
移除了复杂的调用方式,使用最简单的http表单数据格式和json格式发送请求,简化到开箱即用。

Documentation

Index

Constants

View Source
const (
	// DesignWidth 设计宽度
	DesignWidth = 640
	// DesignHeight 设计高度
	DesignHeight = 1080
	// ImageHeight 图片区域640
	ImageHeight = 840
	// BodyHeight 信息区域240
	BodyHeight = 240
)
View Source
const MPGETAccessTokenURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"

MPGETAccessTokenURL 获取accessToken

Variables

View Source
var C conf

C 配置实列

Functions

func DrawPoster

func DrawPoster(s Style) (fileName string, err error)

DrawPoster 绘制海报

func GetRandomName

func GetRandomName(length int) (name string)

GetRandomName 获取随机的文件名

func Init

func Init()

Init 加载配置文件

func RequestQRCode

func RequestQRCode(req QRCodeReq, saveName string, ak string) (string, error)

RequestQRCode 获取小程序二维码 saveName 不包含后缀,为空的话就是随机文件名 返回文件名和错误,文件存储在OutputDIR目录中

func ServeHTTP

func ServeHTTP()

ServeHTTP 简单http接口

Types

type Border

type Border struct {
	Width  int         //设计的边框宽度
	Length int         //设计的边框长度
	Shape  *image.RGBA //形状,黑色代表形状占用空间点
}

Border 边框样式

func GetBorder

func GetBorder() (b Border, err error)

GetBorder 获取边框样式 边框是一段矩形,黑点值代表边框实际占用

type MPAccessToken

type MPAccessToken struct {
	Errcode     int       `json:"errcode"`
	Errmsg      string    `json:"errmsg"`
	AccessToken string    `json:"access_token"`
	ExpiresIn   int       `json:"expires_in"`
	ExpiresAt   time.Time //过期时间,s
}

MPAccessToken 小程序获取的access_token

func GetMPAccessToken

func GetMPAccessToken() (MPAccessToken, error)

GetMPAccessToken 获取小程序授权的accesstoken

type Padding

type Padding struct {
	Top    int
	Right  int
	Bottom int
	Left   int
}

Padding 补白尺寸

type QRCodeReq

type QRCodeReq struct {
	Scene string `json:"scene"`
	Page  string `json:"page"`
	Width int    `json:"width"`
}

QRCodeReq 请求获取二维码的数据

type Style

type Style struct {
	ImageURL       string     //主图http链接或文件链接
	QRCodeURL      string     //二维码http链接或文件链接
	Title          string     //标题
	Content        string     //文字内容
	OutputFileName string     //保存文件名,可选
	OutputDIR      string     //保存文件目录,可选
	BorderColor    color.RGBA // 边框颜色,可选
}

Style 样式

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL