Skip to content

Commit

Permalink
fix: 更换一下第三方接口
Browse files Browse the repository at this point in the history
  • Loading branch information
Qiu-Jun committed Aug 25, 2022
1 parent 558cdfb commit ee527cb
Show file tree
Hide file tree
Showing 13 changed files with 14,451 additions and 77 deletions.
17 changes: 15 additions & 2 deletions Q&A.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

<details>
<summary>搭建这个是否一定需要云服务器?</summary>
不必须。如果有云服务器,我可以教部署,已成功给网友linux以及win server部署。教程里介绍的部署方法就是节约成本,利用内网穿透工具送的外网域名映射到本地服务的7001端口.缺点就是电脑不能关机,可以考虑用一台不用的便宜主机当服务器。
不必须。如果有云服务器,我可以教部署,已成功给网友linux以及win server部署。教程里介绍的部署方法就是节约成本,利用内网穿透工具送的外网域名映射到本地服务的7001端口.缺点就是电脑不能关机,可以考虑用一台不用的便宜主机当服务器。<br />
<font color="#f34250">http://127.0.0.1:7001/clearRedis</font>
</details>

Expand All @@ -16,8 +16,21 @@
因为天气的接口只有500次免费,超过500次就要付费了,做缓存是为了减少请求次数。
</details>

<details>
<summary>如何切换城市获取天气</summary>
服务启动后,会将你在config/config.defalult.js里config.userData的weatherCity设置好,当你想改变的时候,可以将下面地址复制到浏览器地址栏,将xx改为你想要的城市后回车即可,如果设置成功会返回设置成功<br />
<font color="#f34250">http://127.0.0.1:7001/setCity?city=xx</font>
</details>

<details>
<summary>如何在更换城市后清楚缓存</summary>
为了这个问题,我特地写了一个接口清除redis的缓存,因为是get请求,所以可以直接复制到浏览器地址那回车, 请确保你服务端已启动。
~~ 为了这个问题,我特地写了一个接口清除redis的缓存,因为是get请求,所以可以直接复制到浏览器地址那回车, 请确保你服务端已启动。~~不会再存在上面问题,每次设置城市都会清除一次<br />
<font color="#f34250">http://127.0.0.1:7001/clearRedis</font>
</details>

<details>
<summary>如果你因为频繁点击导致发送模板失败</summary>
测试公众号,获取关注用户每天100次,每次发送模板都获取一次。当你因此失败时,你可以通过get请求调用下面接口清除限制(每个月10次)<br />
<font color="#f34250">http://127.0.0.1:7001/clearQuota</font>
</details>

17 changes: 9 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
#### 功能
- [x] 定时消息推送/手动消息推动
- [x] 人工智障ai聊天
- [ ] 更换第三方天气接口
- [x] 更换第三方天气接口(高德天气,无需担心次数上限的白嫖问题)
- [x] 通过接口设置城市,方便修改城市重新获取天气(设置城市会直接清除天气缓存,目前天气缓存为10分钟)

#### 准备环境
+ redis
Expand Down Expand Up @@ -66,14 +67,13 @@ npm run start
{{date.DATA}}
城市:{{city.DATA}}
天气:{{weather.DATA}}
最低气温: {{min_temperature.DATA}}
最高气温: {{max_temperature.DATA}}
降雨概率:{{pop.DATA}}
今日建议:{{tips.DATA}}
气温:{{temperature.DATA}}
空气湿度:{{humidity.DATA}}
今天是我们恋爱的第{{love_day.DATA}}天
距离小宝生日还有{{gfBirthDays.DATA}}天
距离我的生日还有{{mineBirthDays.DATA}}天
寄言: {{lizhi.DATA}}
{{caihongpi.DATA}}
```

![如图](./gitPic/template.jpg)
Expand Down Expand Up @@ -121,10 +121,11 @@ npm run start

![](./gitPic/t10.jpg)

## 对接api实现
> 用的和原项目一样都是[天行](第三方用的都是https://www.tianapi.com/), 具体申请看=>[原项目的md](https://github.com/erwanjun/weixin_tuisong).我在原项目的基础上用redis进行了缓存减少请求次数
## 需要申请的第三方api
+ 高德天气[点这里](https://lbs.amap.com/api/webservice/guide/api/weatherinfo)
+ 天行数据api[点这里](https://www.tianapi.com/)

消息推送有三种方式
## 消息推送有三种方式
+ 调用接口推送(/sendNotify)
+ 自动推送(每天早上八点)
+ 通过公众号发送'发送模板'这个关键字
Expand Down
62 changes: 62 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
class AppBootHook {
constructor(app) {
this.app = app;
}

// configWillLoad() {
// // 此时 config 文件已经被读取并合并,但是还并未生效
// // 这是应用层修改配置的最后时机
// // 注意:此函数只支持同步调用

// // 例如:参数中的密码是加密的,在此处进行解密
// this.app.config.mysql.password = decrypt(this.app.config.mysql.password);
// // 例如:插入一个中间件到框架的 coreMiddleware 之间
// const statusIdx = this.app.config.coreMiddleware.indexOf('status');
// this.app.config.coreMiddleware.splice(statusIdx + 1, 0, 'limit');
// }

// async didLoad() {
// // 所有的配置已经加载完毕
// // 可以用来加载应用自定义的文件,启动自定义的服务

// // 例如:创建自定义应用的示例
// this.app.queue = new Queue(this.app.config.queue);
// await this.app.queue.init();

// // 例如:加载自定义的目录
// this.app.loader.loadToContext(path.join(__dirname, 'app/tasks'), 'tasks', {
// fieldClass: 'tasksClasses',
// });
// }

// async willReady() {
// // 所有的插件都已启动完毕,但是应用整体还未 ready
// // 可以做一些数据初始化等操作,这些操作成功才会启动应用

// // 例如:从数据库加载数据到内存缓存
// this.app.cacheData = await this.app.model.query(QUERY_CACHE_SQL);
// }

// async didReady() {
// // 应用已经启动完毕

// const ctx = await this.app.createAnonymousContext();
// await ctx.service.Biz.request();
// }

async serverDidReady() {
await this.app.curl(`http://127.0.0.1:7001/setCity?city=${this.app.config.userData.weatherCity}`, {
method: 'GET',
dataType: 'json'
})

// // http / https server 已启动,开始接受外部请求
// // 此时可以从 app.server 拿到 server 的实例

// this.app.server.on('timeout', (socket) => {
// // handle socket timeout
// });
}
}

module.exports = AppBootHook;
33 changes: 25 additions & 8 deletions app/controller/wx.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
'use strict';

const Controller = require('egg').Controller;
const amapData = require('../../utils/amap.js')
const fs = require('fs')
const jsonPath = './utils/usercity.json'

class HomeController extends Controller {
async verify() {
Expand Down Expand Up @@ -69,14 +72,28 @@ class HomeController extends Controller {
}
}

test() {
const { ctx } = this
ctx.ok({
code: 200,
data: {
randomHexColor: randomHexColor()
}
})
async setCity() {
const { ctx, service } = this
try {
const { city } = ctx.query
if(!city) return ctx.fail({msg: '设置失败'})
const findCity = amapData.find(i => i.adname === city)
if(!findCity) return ctx.fail({msg: '没有找到城市'})
fs.writeFileSync(jsonPath, JSON.stringify(findCity), 'utf8')
const a= await service.redisModule.get('cacheWether')
console.log(a)
await service.redisModule.del('cacheWether')
const b= await service.redisModule.get('cacheWether')
console.log(b)
ctx.ok({msg: '设置成功'})
} catch (error) {
ctx.fail({msg: error})
}
}

async test() {
const { ctx, app } = this
ctx.ok({data: app.config.userData, msg: '测试接口成功'})
}
}

Expand Down
136 changes: 136 additions & 0 deletions app/public/operation.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>处理异常</title>
<style>
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
.box {
position: absolute;
left: 0;
top: 0;
width: 300px;
height: 120px;
}
</style>
<script crossorigin="anonymous" integrity="sha512-PhuYrdDBtBeUjY7KTmjRYFFadw8uXXdTmzZyhCHZewYsqZJ0pxFCwU528jRoil42LXMW3ksegQT5zdjkfiR1IA==" src="https://lib.baomitu.com/vue/2.7.7/vue.min.js"></script>
</head>
<body>
<div class="box" id="box">
<button @click="handleClick">当你频繁操作,导致无法发送版本时,请点击</button>
</div>
</body>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.27.2/axios.min.js"></script>
<script>
!(function () {

const canvas = document.createElement("canvas")
document.body.append(canvas)
const ctx = canvas.getContext('2d')

function resizeCanvas() {
canvas.width = window.innerWidth
canvas.height = window.innerHeight
}

function clearCanvas() {
ctx.fillStyle = "#000"
ctx.fillRect(0, 0, canvas.width, canvas.height)
}

resizeCanvas()
clearCanvas()

window.addEventListener('resize', resizeCanvas)

function mouseDownHandler(e) {
const x = e.clientX
const y = e.clientY
createFireworks(x, y)
}
document.addEventListener('mousedown', mouseDownHandler, false)

const particles = [] // 烟花
function createFireworks(sx, sy) {
const hue = Math.floor(Math.random() * 51) + 150
const hueVariance = 30
const count = 100
for(let i = 0; i < count; i ++) {
const angle = 360 / count * i
const sr = (Math.random() * 5) + .4
const p ={
x: sx,
y: sy,
radians: angle * Math.PI / 180,
size: Math.floor(Math.random() * 3) + 1,
speed: sr,
radius: sr,
hue: Math.floor(Math.random() * ((hue + hueVariance) - (hue - hueVariance))) + (hue - hueVariance),
brightness: Math.floor(Math.random() * 31) + 50,
alpha: (Math.floor(Math.random() * 61) + 40) / 100
}
particles.push(p)
}
}
function drawFireworks() {
clearCanvas()
for(let i = 0; i < particles.length; i ++) {
const p = particles[i]
const vx = Math.cos(p.radians) * p.radius
const vy = Math.sin(p.radians) * p.radius + 0.4
p.x += vx
p.y += vy
p.radius *= 1 - p.speed / 100
p.alpha -= 0.005
if(p.x < 0 || p.x > canvas.width || p.y < 0 || p.y > canvas.height) {
particles.slice(i, 1)
continue
}
ctx.beginPath()
ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2, false)
ctx.closePath()
ctx.fillStyle = `hsla(${p.hue}, 100%, ${p.brightness}%, ${p.alpha})`
ctx.fill()
}
}

// requestAnimationFrame
function tick() {
ctx.globalCompositeOperation = 'destination-out'
ctx.fillStyle = `rgba(0, 0, 0, 0.1)`
ctx.fillRect(0, 0, canvas.width, canvas.height)
ctx.globalCompositeOperation = 'lighter'
drawFireworks()
requestAnimationFrame(tick)
}
tick()
// setInterval(function () {
// createFireworks(Math.random() * canvas.width, Math.random()
// * canvas.height);
// }, 1000);
})()

new Vue({
el: '#box',
methods: {
handleClick() {
axios.get('http://127.0.0.1:7001/clearQuota')
.then(res => {
if(res.status === 200 && res.data.code === 200) {
alert('操作成功')
} else {
alert(res.data.msg)
}
})
}
}
})
</script>
</html>
2 changes: 2 additions & 0 deletions app/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ module.exports = app => {
router.post('/sendNotify', controller.wx.sendNotify) // 发送模板

router.get('/createMenu', controller.wx.createWxMenu) // 创建公众号菜单 因为没有后台管理系统,菜单配置再utils下的menuJson
router.get('/setCity', controller.wx.setCity) // 设置获取天气的城市


router.get('/clearRedis', controller.wx.clearRedis) // 清除redis
router.get('/clearQuota', controller.wx.clearquota) // 清除45009接口调用频率限制
Expand Down
Loading

0 comments on commit ee527cb

Please sign in to comment.