看群里聊天说到单身问题,弄个计数统计一下单身人数,代码很简单,半小时左右差不多搞定,大致写下过程吧
网站版浏览视图

手机端浏览视图

删除弹框

Telegram通知
微信也有别人做的机器人,但是安全第一,我没使用

两个简单的api
https://message.jiangshanyunyuefu.com/sendMessage?text
https://message.jiangshanyunyuefu.com/deleteMessage?text
NodeJs-server
没有特殊需求, 用VSCode手动写写就行了
const express = require('express')
const bodyParser = require('body-parser')
const axios = require('axios');
const http = require('http')
const path = require('path')
const fs = require('fs')
const store = require('store')
const app = express()
app.use(bodyParser.json())
// 允许所有内容跨域
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Content-Type')
next()
})
// 首页载体
app.get('/', function (req, res) {
const html = fs.readFileSync(path.resolve(__dirname, 'index.html'), 'utf-8')
res.send(html)
})
// 获取api消息(没有用数据库,radis也没用,这么点数据量,直接存文件就行了)
app.get('/sendMessage', function (req, res) {
// 将query参数给编码一下传输过来再解码就行
var text = JSON.parse(decodeURIComponent(req.query.text))
console.log(text)
try {
text = JSON.stringify(text)
writerMessage(text)
} catch (e) {
res.send({'result': 'error'})
} finally {
sendToTelegram(req, res, "收到信息: "+ip +"\r\n"+ text)
}
})
function writerMessage(text) {
fs.readFile("/root/intbird/nodejs/message.config", (err, data) => {
if (err) {
res.send({'result': 'error','message' : err})
return
}
// 写入文件之前读取所有的文件内容,再一次写入
var results = (data && data.length>0) ? JSON.parse(data) : [];
results.push(text)
var resultsSaved = JSON.stringify(results)
console.log('results:' + resultsSaved)
// 新旧数据一并写入
fs.writeFile("message.config", resultsSaved, err => {
if (err) {
res.send({'result': 'error','message' : err})
}
res.send({'result': 'ok'})
});
})
}
// 发送到telegram机器人
function sendToTelegram(req, res, text) {
const ip = 'none'
const path = 'https://*******text=' +text
axios.get(path)
.then(response => {
// res.send({'result': 'ok'})
})
.catch(error => {
// res.send({'result': 'error'})
})
}
app.get('/getMessage', function (req, res) {
fs.readFile("message.config", (err, data) => {
if (err) {
res.send({'result': 'error','message' : err})
return
}
var results = (data && data.length>0) ? JSON.parse(data) : [];
console.log("results:"+results)
res.send({result:'ok', data : results})
})
})
// 加个删除通知,手动删一下
app.get('/deleteMessage', function (req, res) {
var text = decodeURIComponent(req.query.text)
const sendText = "删除信息:\r\n"+ text
const ip = 'none'
sendToTelegram(encodeURIComponent(sendText))
})
const httpServer = http.createServer(app)
httpServer.listen(3000, function () {
console.log(`\nsuccess : http://ip:3000\n`)
})
VueJs-web
页面稍微好看点引入个elementui就行
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width; initial-scale=1; maximum-scale=1; minimum-scale=1; user-scalable=no;">
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
var vue = new Vue({
el: '#app',
data: function() {
return {
visible: false,
options: [
{
value: '1',
label: '男'
},
{
value: '2',
label: '女'
}
],
option: '',
email: "",
content: "",
tableData: [],
dialogVisible : false
}
},
created(){
this.getText()
},
methods: {
isEmpty(value) {
if (null == value || value.length<=0) {
return true
}
return false
},
toast(message) {
this.$notify({
title: '通知:',
message: message
})
},
postData() {
if (this.isEmpty(this.option)|| this.isEmpty(this.email)|| this.isEmpty(this.content)) {
this.toast('写点东西再发')
} else {
const text = {'sex':this.option,'email':this.email,'content':this.content}
this.sendText(JSON.stringify(text))
}
},
getText() {
axios.get('https://xxx.xxx.com/getMessage')
.then(response => {
if (response.data.hasOwnProperty("data")) {
this.tableData = response.data.data
}
})
.catch(error=> {
this.toast(error)
});
},
sendText(text) {
axios.get('https://xxx.xxx.com/sendMessage?text=' + encodeURIComponent(text))
.then(response => {
this.toast(response.data)
this.getText()
})
.catch(error=> {
this.toast(error)
this.getText()
});
},
deleteData() {
if (this.isEmpty(this.email)) {
this.toast("联系方式还没填写呢")
} else if (this.content != "我要删除"){
this.toast("请在个人简介里输入四个字: 我要删除")
} else {
const text = {'sex':this.option,'email':this.email,'content':this.content}
axios.get('https://xxx.xxx.com/deleteMessage?text=' + encodeURIComponent(JSON.stringify(text)))
.then(response => {
this.toast(response.data)
this.getText()
})
.catch(error=> {
this.toast(error)
this.getText()
});
}
}
}
})
</script>
Nodejs-server-run
vscode直接devpush到远程主机或者手动都一样

install nodejs
https://nodejs.org/en/download/package-manager/
# Using Ubuntu
curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
# Using Debian, as root
curl -fsSL https://deb.nodesource.com/setup_14.x | bash -
apt-get install -y nodejs
新建一个systemctl任务,添加开机启动就行
[Unit]
Description=Description for intbird
WantedBy=network-online.target
After=network-online.target
[Service]
Type=forking
User=root
Group=root
ExecStart=xxxxxx/node.js.sh
Restart=on-failure
RestartSec=5s
TimeoutStartSec=0
RemainAfterExit=yes
[Install]
Nginx网关配置
proxy: Headers
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Host
ngx_http_realip_module
这台服务器nginx,caddy等都有,随便用个nginx就行
server
{
listen 127.0.0.1:4443 proxy_protocol;
listen 127.0.0.1:4444 http2 proxy_protocol;
server_name xxx.xxx.com;
charset utf-8;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_pass http://127.0.0.1:3000;
}
}
