解决内网拉取企微会话存档代理问题的一种办法

问题:客户的服务都是内网的,不能直接访问外网;访问外网的话需要走kong网关才能出去。

会话存档官网说可以使用socket5http方式拉取会话存档;我这边尝试了直接使用kong网关的ip和端口配置进去,是访问不了的

我后面就又尝试了使用nginxsquid 做正向代理的方式使用http方式访问,也是没有成功;这两种做代理服务器为什么不能成功,没有理解;有知道的朋友可以告诉我一下,有成功使用这两个做代理服务器拉取消息成功的朋友可以分享下经验。

搞一个socket5的代理服务器是可以成功,我没有试过,但是问过踩过坑的人说这种方式可行。

如果懒得麻烦再搭一个代理服务器,那就可以自己动手写一个简单的代理服务器搞定它。

大概的交互流程如下:
在这里插入图片描述

下面是全部的代码,拷过去,调一调应该就能用了

ForwardProxyApplication

import xxx.ProxyService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.annotation.Resource;@SpringBootApplication
public class ForwardProxyApplication implements CommandLineRunner {@Resourceprivate ProxyService proxyService;public static void main(String[] args) {SpringApplication.run(ForwardProxyApplication.class, args);}@Overridepublic void run(String... args) throws Exception {proxyService.start(args);}
}

ProxyConfig

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;@Configuration
public class ProxyConfig {@Value("${socket.port}")public Integer socketPort;@Value("${proxy.host}")public String proxyHost;@Value("${proxy.port}")public Integer proxyPort;
}

ProxyService

import xxx.config.ProxyConfig;
import xxx.thread.ProxyHandleThread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Objects;@Service
public class ProxyService {private static final Logger logger = LoggerFactory.getLogger(ProxyService.class);@Resourceprivate ProxyConfig proxyConfig;public void start(String[] args) {ServerSocket ss = null;try {ss = new ServerSocket(proxyConfig.socketPort);logger.info("Server running at http://0.0.0.0:{}", proxyConfig.socketPort);} catch (IOException e1) {e1.printStackTrace();}while (true) {try {assert ss != null;Socket socket = ss.accept();socket.setSoTimeout(1000 * 60);String line = "";InputStream is = socket.getInputStream();String tempHost = "", host;int port = 80;String type = null;OutputStream os = socket.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));int temp = 1;StringBuilder sb = new StringBuilder();while ((line = br.readLine()) != null) {logger.info(line + "-----------------");if (temp == 1) {  type = line.split(" ")[0];if (type == null) continue;}temp++;String[] s1 = line.split(": ");if (line.isEmpty()) {break;}for (int i = 0; i < s1.length; i++) {if (s1[i].equalsIgnoreCase("host")) {tempHost = s1[i + 1];}}sb.append(line).append("\r\n");line = null;}sb.append("\r\n"); if (tempHost.split(":").length > 1) {port = Integer.parseInt(tempHost.split(":")[1]);}host = tempHost.split(":")[0];Socket proxySocket = null;if (host != null && !host.equals("")) {// todo 这里最重要的host = proxyConfig.proxyHost;port = proxyConfig.proxyPort;proxySocket = new Socket(host, port);proxySocket.setSoTimeout(1000 * 60);OutputStream proxyOs = proxySocket.getOutputStream();InputStream proxyIs = proxySocket.getInputStream();if (Objects.requireNonNull(type).equalsIgnoreCase("connect")) {  os.write("HTTP/1.1 200 Connection Established\r\n\r\n".getBytes());os.flush();} else {proxyOs.write(sb.toString().getBytes(StandardCharsets.UTF_8));proxyOs.flush();}new ProxyHandleThread(is, proxyOs).start(); //监听客户端传来消息并转发给服务器new ProxyHandleThread(proxyIs, os).start(); //监听服务器传来消息并转发给客户端}} catch (IOException e) {e.printStackTrace();}}}
}

ProxyHandleThread

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketTimeoutException;public class ProxyHandleThread extends Thread {private final InputStream input;private final OutputStream output;public ProxyHandleThread(InputStream input, OutputStream output) {this.input = input;this.output = output;}@Overridepublic void run() {try {BufferedInputStream bis = new BufferedInputStream(input);byte[] buffer = new byte[1024];int length = -1;while ((length = bis.read(buffer)) != -1) {output.write(buffer, 0, length);length = -1;}output.flush();try {Thread.sleep(5000);     //不能执行完了,就把线程关掉,不然双方交互的数据还没有处理完,这里写了个睡眠 5s,可以酌情考虑} catch (InterruptedException e) {e.printStackTrace();}} catch (SocketTimeoutException e) {try {input.close();output.close();} catch (IOException e1) {e1.printStackTrace();}} catch (IOException e) {e.printStackTrace();} finally {try {input.close();output.close();} catch (IOException e) {e.printStackTrace();}}}
}

没有搞定的,可以加好友一起聊聊,请备注csdn加我的
在这里插入图片描述

感谢 https://blog.csdn.net/jumprn/article/details/90173852

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/92514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<C++> 哈希表模拟实现STL_unordered_set/map

哈希表模板参数的控制 首先需要明确的是&#xff0c;unordered_set是K模型的容器&#xff0c;而unordered_map是KV模型的容器。 要想只用一份哈希表代码同时封装出K模型和KV模型的容器&#xff0c;我们必定要对哈希表的模板参数进行控制。 为了与原哈希表的模板参数进行区分…

开源layui前端框架 收款码生成系统源码 多合一收款码生成源码 带50多套UI模板

Layui前端的多合一收款码在线生成系统源码_附多套前端UI模板。 卡特三合一收款码生成系统源码&#xff0c;和收款啦采用一样的原理。 内部多达50多套模板&#xff0c;前端跟付款界面都特别好看。 识别收款码之后会自动加密&#xff0c;非常安全。 一样没有后台&#xff0c;一样…

spring6-实现简易版IOC容器

手写简易版IOC容器 1、回顾Java反射2、实现Spring的IoC 我们都知道&#xff0c;Spring框架的IOC是基于Java反射机制实现的&#xff0c;下面我们先回顾一下java反射。 1、回顾Java反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所…

机器人过程自动化(RPA)入门 9. 管理和维护代码

仅仅创建一个自动化项目是不够的。无论是决定使用哪种布局,还是正确命名步骤,以正确的方式组织项目都很重要。项目也可以在新的项目中重用,这对用户来说非常方便。本章解释了我们可以重用项目的方法。我们还将学习配置技术并看到一个示例。最后,我们将学习如何集成TFS服务器…

如何两个不同的脚本文件之间传递参数

两个不同的Shell脚本之间如何访问传递的参数取决于它们是如何调用的。如果一个Shell脚本1调用另一个Shell脚本2并且想要将参数传递给被调用的脚本2&#xff0c;可以使用以下方法&#xff1a; 方法1&#xff1a;通过位置参数传递参数 这是一种常见的方法&#xff0c;其中一个脚…

XSS详解

XSS一些学习记录 XXS短标签、属性、事件、方法短标签属性事件函数弹窗函数一些对于绕过有用的函数一些函数使用payload收集 浏览器编码问题XML实体编码URL编码JS编码混合编码 一些绕过方法利用constructor原型污染链构造弹框空格绕过圆括号过滤绕过其他的一些绕过 参考 XXS短标…

中国1km土壤特征数据集(2010年)

简介&#xff1a; 中国1km土壤特征数据集&#xff08;2010&#xff09;是基于第二次全国土壤调查的中国1:1000000比例尺土壤图和8595个土壤剖面图&#xff0c;以及美国农业部&#xff08;USDA&#xff09;中国区域土地和气候模拟标准&#xff0c;开发了一个多层土壤粒度分布数…

Apache shiro RegExPatternMatcher 权限绕过漏洞 (CVE-2022-32532)

漏洞描述 2022年6月29日&#xff0c;Apache 官方披露 Apache Shiro &#xff08;CVE-2022-32532&#xff09;权限绕过漏洞。 当Apache Shiro中使用RegexRequestMatcher进行权限配置&#xff0c;且正则表达式中携带"."时&#xff0c;未经授权的远程攻击者可通过构造恶…

C#,数值计算——Ranlim32的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// High-quality random generator using only 32-bit arithmetic.Same conventions /// as Ran.Period is 3.11E37 . Recommended only when 64-bit arithmetic is not /// a…

01-http概述

HTTP概述 HTTP使用的是可靠地数据传输协议。HTTP属于应用层协议 Web客户端和服务器 web服务器&#xff1a;又称http服务器&#xff0c;用于存储web内容&#xff0c;并向web客户端提供web内容web客户端&#xff1a;用于请求web服务器的应用软件&#xff0c;常见为浏览器 资源…

【ShaderLab PBR 嗜血边缘角色_美式朋克风格_“Niohoggr“_角色渲染(第一篇)】

嗜血边缘角色Cyberpunk style Unity 渲染 《嗜血边缘》截取其中的片段如下:资源分析其中Guitar贴图4张模型:人物细节图:人物模型 Inspector面板这里做一个区域区分:Body贴图1_BC贴图1_BC属性:Body贴图2_NBody贴图3_CMBody贴图4_SRMBody贴图4_RGBReflection Probe第一版Sha…

【Linux】线程同步和互斥

目录 一、线程互斥1.相关概念2.互斥锁&#xff08;mutex&#xff09;3.互斥锁的原理4.自定义封装一个锁 二、可重入和线程安全三、死锁死锁概念死锁四个必要条件如何避免死锁 四、线程同步1.条件变量概念条件变量接口基于阻塞队列实现生产者消费者模型 2.信号量概念信号量操作接…

深入理解React中fiber

一、前言 Fiber是对React核心算法的重写&#xff0c;Fiber是React内部定义的一种数据结构&#xff0c;将更新渲染耗时长的大任务&#xff0c;分为许多的小片。Fiber节点保存啦组件需要更新的状态和副作用&#xff0c;一个Fiber代表一个工作单元。 二、Fiber在React做了什么 …

快速排序与冒泡排序以及代码

快速排序 快速排序&#xff08;Quicksort&#xff09;是一种常用的排序算法&#xff0c;它基于分治的思想。 时间复杂度&#xff1a;O&#xff08;nlogn&#xff09; 空间复杂度&#xff1a;O&#xff08;logn&#xff09; 快速排序的基本思想如下&#xff1a; 选择一个元素…

xxl-job 2.2之后版本高版本executor未授权访问漏洞

xxl-job 低版本executor未授权访问 低版本的executor未授权访问漏洞是 POST /run HTTP/1.1 Host: your-ip:9999 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like G…

【租车骑绿道】python实现-附ChatGPT解析

1.题目 租车骑绿道 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车 输入描述 第一行两个数字m、n,自行车限重m,代表部门总…

如何初始化一个vue项目

如何初始化一个vue项目 安装 vue-cli 后 ,终端执行 vue ui npm install vue-cli --save-devCLI 服务 | Vue CLI (vuejs.org) 等一段时间后 。。。 进入项目仪表盘 设置其他模块 项目构建后目录 vue.config.js 文件相关配置 官方vue.config.js 参考文档 https://cli.vuejs.o…

BI神器Power Query(25)-- 使用PQ实现表格多列转换(1/3)

实例需求&#xff1a;原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中&#xff0c;att1、att3、att5为一组&#xff0c;att2、att3、att6为另一组&#xff0c;数据如下所示。 更新表格数据 原始数据表&#xff1a; Col1Col2Att1Att2Att3Att4Att5Att6AAADD…

链表的注意事项

LeetCode 19 删除链表的倒数第N个结点 1、sudo.next head;和head sudo.next; 的区别&#xff1f; 他们是不一样的&#xff0c;前者是将head赋给sudo.next&#xff0c;而后者是将sudo.next赋给head。 首先ab&#xff0c;那么b必须存在 我想要将sudo作为虚拟头节点&#xf…

SEO搜索引擎

利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名&#xff0c;吸引更多的用户访问网站&#xff0c;提高网站的访问量&#xff0c;提高网站的销售能力和宣传能力&#xff0c;从而提升网站的品牌效应 搜索引擎优化的技术手段 黑帽SEO 通过欺骗技术和滥用搜索算法来推销毫不…