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

这篇具有很好参考价值的文章主要介绍了解决内网拉取企微会话存档代理问题的一种办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题:客户的服务都是内网的,不能直接访问外网;访问外网的话需要走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 {

    @Resource
    private ProxyService proxyService;

    public static void main(String[] args) {
        SpringApplication.run(ForwardProxyApplication.class, args);
    }

    @Override
    public 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);

    @Resource
    private 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;
    }

    @Override
    public 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文章来源地址https://www.toymoban.com/news/detail-723997.html

到了这里,关于解决内网拉取企微会话存档代理问题的一种办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 远程服务器设置代理共享本地网络-解决内网环境无法git、pip等

    部分服务器不连外网,导致无法使用git、无法装包等问题,离线安装过于繁琐,本文使用clash共享本地win电脑网络给远程服务器,仅用于服务器(linux内网)和本地电脑(win可连接外网),且本地与服务器处于同一局域网下(如校园网) 步骤如下: 本地电脑Clash,开启Allow LAN功能, 端口

    2023年04月18日
    浏览(43)
  • 内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 )

    在渗透中,有时候 Cobalt Strike 会话可能会受限制,所以我们需要把 Cobalt Strike 会话转移到 MSF 上进行后面的渗透。也有的时候会话在 MSF 上,但是我们需要 操作更简便 或者 展示力更好,所以我们会把 MSF 上的会话转移到 Cobalt Strike 上进行后面的渗透. 内网安全:Cobalt Strik

    2024年02月09日
    浏览(39)
  • 内网Gitlab如何拉取代码

    一、安装Git        公司会给你共享盘地址,或者发给你环境,不管怎样git安装上即可,傻瓜式无脑next安装。       安装完成后鼠标右键能看到Git bash 就说明成功了! 二、初始化信息       拿到公司给你的Git账号后,将信息初始化一下,登录到公司给你的Gitlab地址上,右上

    2024年02月02日
    浏览(42)
  • 成集云 | 乐享问题邀请同步企微提醒 | 解决方案

    源系统 成集云 目标系统 腾讯乐享是腾讯公司开发的一款企业社区化知识管理平台,它提供了包括知识库、问答、课堂、考试、活动、投票和论坛等核心应用。这个平台凝聚了腾讯10年的管理经验,可以满足政府、企业和学校在知识管理、学习培训、文化建设和内部沟通的多

    2024年02月11日
    浏览(75)
  • 幻兽帕鲁转移/迁移游戏存档之后,无法迁移角色存档,进入游戏需要重新建角色问题(已解决),服务器到服务器之间的存档转移

    很多朋友在迁移幻兽帕鲁游戏存档到服务器的时候,可能会遇到一个问题,就是迁移完成后,进入到游戏会发现又需要从头开始,重新新建角色。 其实这个问题也很好解决,因为Palworld服务端有两种,一种是有APPID,还有一种是没有APPID。   如果迁移的前后服务器版本不一致

    2024年02月20日
    浏览(47)
  • 使用VPN代理之后,无法使用Git拉取代码

    使用了VPN代理后,拉取代码报错 解决办法 原因:git需要设置代理 第一种办法:git需要设置代理,如vpn端口号为8888,则Git设置代理为:8888 第二种办法:直接取消代理 查看代理: 取消代理: 然后在拉取代码,发现就可以了

    2024年02月13日
    浏览(38)
  • Docker Registry本地镜像仓库结合内网穿透实现远程拉取推送镜像

    Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)镜像,不受本地局域网限制! 使用官网安装方式,docker命令一键启动,该命令启动一个registry的容器,版本是2,挂载宿主机端口是5000端口,挂载后,5000端口就是我们连接镜像仓库的本地端口 执行

    2024年02月03日
    浏览(44)
  • Qt安装工具MaintenanceTool安装插件出现无法下载存档的解决方法

    在移植Qt项目时,代码中出现头文件QTextCodec无法找到的错误(QTextCodec是Qt5中的类,Qt6删除了该类),我使用的是Qt6版本,查阅解决方法,找到的方法要在Qt安装工具MaintenanceTool中添加组件Qt 5 Compatibility Module  1、点击添加或移除组件都会出现提示: Your MaintenanceTool appears to b

    2024年02月15日
    浏览(58)
  • windows、Ubuntu安装QT时经常出现“无法下载存档……”解决办法

    说明:以windows为例,ubuntu操作一样 下载好exe执行文件,双击执行时,经常出现下图提示“无法下载存档……”,是由于默认使用的是境外源,有两种解决方式; 清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/ 北京理工大学:http://mirror.bit.edu.cn/qtproject/ 中国互联网络信息中心:h

    2024年02月16日
    浏览(79)
  • 内网安全:Socks 代理 || 本地代理 技术.

    Socks 代理又称全能代理,就像有很多跳线的转接板,它只是简单地将一端的系统连接到另外一端。支持多种协议,包括http、ftp请求及其它类型的请求。它分socks 4 和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份验证机制等协议。其标准端口为10

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包