NodeJs RWfile

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

网站版浏览视图

手机端浏览视图

删除弹框

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;
        }
}