a4 - 分享链接生成以及其可视化

a4 - 分享链接生成以及其可视化

黄鹏宇 375 2022-09-26

需求

我们知道 “微信小程序码” 只能在微信app内部识别并跳转,但如果我们需要用短信、或者在其他应用内推广,该怎么实现呢?怎么评估推广的转化率呢?
先来看看效果:请使用手机打开 https://miniapp.aceword.xyz

效果展示

  1. 短信视频
  2. 钉钉视频
  3. 统计页面
    image-1664210349611

实现原理

  1. 《小程序生成URL》
  2. 但上述方法有个坑,《小程序链接生成与使用规则调整公告》,简单来说,一个链接只能被一个用户使用。
  3. 所以我们需要做一个中间跳转页,在跳转页动态生成小程序链接并跳转。即 miniapp.aceword.xyz

具体实现

技术栈

  • python
  • flask
  • redis
  • mysql
  • chartjs

使用python的flask提供web服务,使用redis作为缓存,mysql持久化访问数据。
chartjs制作简易的可视化,这个后续可以根据自己的业务逻辑添加

我们把整个流程分为3个步骤

  1. 获取accessToken并缓存
  2. 生成链接
  3. 访问统计

1. 获取accessToken并缓存

《 微信文档-获取接口调用凭据 》
很简单,直接用python的request库获取,然后存入redis中,设其失效时间为2小时。
代码如下:

1. 获取accessToken

这里写了个发送获取失败的邮件,由于跟业务无关,就不展开说了

import requests
import json

# 小程序的相关密钥
mpAppid = "小程序APPID"
mpSecret = "小程序秘钥"

GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+mpAppid+"&secret="+mpSecret
def getAccessToken():
	# 发送请求
	tokenResult=requests.get(GET_ACCESS_TOKEN_URL)
	errorLog = tokenResult.text
	# 转为json
	tokenResultDict = json.loads(errorLog)
	# 正常
	if('access_token' in tokenResultDict):
		return tokenResultDict['access_token']
	# 发生错误
	else:
		# 发送错误到邮箱
		sendEmail("获取A4纸的accessToken失败------------"+tokenResult.text,"获取accessToken失败")	
		return None

2. 存入redis

使用线程池

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
redisAccessTokenKey = "a4#AccessToken"
redisAccessTokenExpireSeconds = 7200

def noop():
    r = redis.Redis(connection_pool=pool)
    # 从redis中获取access_token
    accessToken = r.get(redisAccessTokenKey)
    if(accessToken == None):
        accessToken = getAccessToken()
        r.set(redisAccessTokenKey,accessToken,redisAccessTokenExpireSeconds)

2. 获取url

《 微信文档-获取 URL Link 》

具体参数可查阅上述文档
这里有个小tip,如果等到用户访问以后再生成,会比较慢,所以可以提前缓存一些链接,但要注意每天的额度是30万条。

def getJumpUrl(accessToken):
  requestData = {
    "path": "pages/index/index",
    "expire_interval": 10, # 失效间隔天数
    "expire_type": 1  
  }
  data = json.dumps(requestData)
  r = requests.post("https://api.weixin.qq.com/wxa/generate_urllink?access_token="+accessToken,data=data)
  resultDict = json.loads(r.text)
  if('url_link' in resultDict):
    return resultDict['url_link']
  else:
    return None

3. 访问数据持久化与查询

数据库只有一张表,对from做了索引

image-1664210222721

1. 插入数据

"INSERT INTO `link_record`(ip,`from`) VALUES('%s','%s');"%(ip,_from)

2. 查询近7天数据

SELECT
	`from`,
	DATE( create_date ) AS 'date',
	count(*) AS 'count'
FROM
	link_record
WHERE
	DATE_SUB( CURDATE(), INTERVAL 6 DAY ) <= create_date 
GROUP BY
	DATE(create_date),`from`
ORDER BY DATE(create_date)

4. 可视化网站

《 chart.js文档 》
比较简单,直接cdn+操作原生dom实现的。
唯一有点麻烦的地方是flask 渲染模板时的传参

总结

一个比较简单且实用的项目,后续会着重对可视化页面进行迭代开发。
代码仓库: https://www.github.com/suyu610/a4_link_jumper