吐槽部分
我不能代表任何群体和标签,我只是我而已。我既不高尚也不卑鄙,那只是另外的标签罢了。
看了今天王志安的视频,发现他以前在国内被中国人搞,去台湾被同胞搞,去日本被法轮工(跑出去的中国人)搞,被在日华人搞,果真是这辈子和中国人有仇,在世界任何一个地方都不太安全。同时也感慨,这样直白地说出事情本质实际是更高文明的特征,可能高信噪比的沟通方式可能还没有被当代文明的执政者和既得利益者接受吧,干掉所有比我聪明的人 那我就是世界上最聪明的人,虽SB却也没毛病。
记录一次POST转发的代码实践
今日遇到一个需求,需要通过表单绑定的飞书多维表格的自动化流程中的发送post部分,向自部署服务器内部署的 wcfhttp 发送 post 请求以实现表单及时推送到微信群内,但直接暴露这个 wcfhttp 的9999端口到公网上很危险,那应该如何操作呢?
首先我们汇总一下相关的信息:
- 表单提交后需要触发飞书多维表格自动化流程,发送 POST 请求,实现本地 wcfhttp 推送信息到微信群
- 软路由的DDNS已经把 abc.com 指向到了办公室的局域网,可以随时进行端口映射,比如把 abc.com:9999 映射到局域网 192.168.110.25:9999
- 直接将局域网某IP的9999端口映射出去暴露在公网上很危险,可能会被黑
- 192.168.110.25 是服务器,里面运行有 wcfhttp,可以通过发送相应的 GET POST 请求实现微信的群发信息、图片、文件等
所以想到一个办法,写一个 python 程序,实现以下流程:
- 将服务器的 10086 端口映射出去,并监听
- 当收到特定的(飞书多维表格自动化发送的)POST 请求且 JSON 格式 OK 时候,继续执行,否则返回 404 或其他错误码
- 将收到的 JSON 请求转发到服务器 9999 端口,并触发最终的微信信息发送
尽量以仅简单的程序和内在库实现
JSON格式
{
"msg":"消息在这里",
"receiver":"894563123132321@chatroom" # 这是微信群id
}
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
import requests
class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
try:
data = json.loads(post_data)
# 检查JSON数据中是否包含指定的字符串,比如 894563123132321@chatroom 是微信群id
if "894563123132321@chatroom" in data.get("receiver", ""):
# 9999/text 是发送信息的url ,在docs中可查阅其他情况
requests.post('http://localhost:9999/text', json=data)
self.send_response(200) # 正确的话返回200状态
self.end_headers()
self.wfile.write(b'Request forwarded')
else:
self.send_response(404) # 若微信群id不对,则返回404状态
self.end_headers()
except json.JSONDecodeError:
self.send_response(400)
self.end_headers()
self.wfile.write(b'Invalid JSON')
except requests.RequestException:
self.send_response(500)
self.end_headers()
self.wfile.write(b'Failed to forward request')
def run(server_class=HTTPServer, handler_class=RequestHandler, port=10086): # 监听10086端口
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f'Server running on port {port}...') # 在程序运行界面给用户提示
httpd.serve_forever()
if __name__ == "__main__":
run()
在实际执行的时候,10086端口可能行不通,这时候换一下端口可能突然就可行了,原因没有深究,个人不太懂,读者有兴趣可以探索一下。
基于这个想法可以做进一步的加密:
- 第一次发送 JSON 请求的时候增加比如 128 位的复杂密码
- 程序收到 POST 请求的 JSON 后判断密码是否正确,如正确将此段消除随后转发 POST 请求
由此,在服务器上运行本程序,就可以实现一个“墙”兼“转发器”的程序了。
一些有趣的Github项目
xCAD.NET framework for developing applications for CAD systems (xarial.com)
Library of macros and scripts to automate SOLIDWORKS (codestack.net) 一些SW内的vba案例 可供学习