前言

我们公司领沃云电脑平台的用户总是抱怨steam登录常常失败,自从steam撤走了中国的CM服务器后,每到高峰期就是网络连接失败的重灾区,增量了N多平台的东西,这次终于有时间来收拾这个登录的问题了。

先抓个包,确定需要的加速

首先还是用了fiddler工具对steam平台登陆时抓了个包,抓到了他登陆时必用的接口api.steampowered.com 就是这个罪魁祸首了,高峰期响应基本超过20秒以上,或者直接无响应。

引入一个新知识,PAC脚本

我最初也只知道手动代理,知道可以填写socks=xxxxx或者直接就是http代理,没想到上面的自动脚本才是真的好用。
PAC也叫代理自动配置脚本,全名是Proxy Auto-config
以下均以windows为例,因为本次用例也主要是为公司的steam平台进行加速
1、打开方式WIN+I打开WINDOWS设置--------->网络和INTERNET--------->左侧:代理--------->最上面的自动检测设置和使用设置脚本都打开
2、开始设置脚本地址,记得脚本地址目前在win10及其以上系统已经不能使用file:// 的方式打开本地文件了,仅支持http , 就连https都不支持,不支持其他协议比如ftp等。
3、脚本的编写,创建一个以pac为后缀名的文件,pac的写法就是js代码(如果不生效或者有问题,一定是你的pac文件,你写错了,你写错了,你写错了!)
var proxy = "PROXY 127.0.0.1:9081;";
var direct = "DIRECT;";function FindProxyForURL(url, host) {if (dnsDomainIs(host,"api.steampowered.com")){return proxy;}else{return direct;}
}
// 注解:先来说说这个proxy 可以写 SOCKS xxx.xxx.xxx.xxx:xxxx
// 支持容灾:比如这个proxy可以写成如下:
var proxy = "PROXY 127.0.0.1:8080; SOCKS 127.0.0.1:8081; DIRECT";
// 解释一下,意思就是先走http代理PROXY 127.0.0.1:8080,如果走不通就走SOCKS 127.0.0.1:8081,如果还是走不通,就直连不走任何代理了。
// 然后就是一个方法,FindProxyForURL ,里面有不少方法,比如正则匹配shExpMatch(url,"*baidu*"),只要跟baidu沾边的比如api.baidu.com
// 当然本例中只是为了固定的api.steampowered.com域名进行代理加速,就用的是dnsDomainIs(host,"api.steampowered.com"),然后就返回的是proxy代理的内容。其他域名就直接走直连,我默认是没有做容灾的,因为服务器服务是放k8s上面,遇到服务出现问题直接替换服务。
// 还有很多方法可查看文档,就不多赘述https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file

开启PAC自动配置

编写一份open_pac.bat 的批处理文件

这里自行更改一下倒数第三行最后的 http://xxx.pac 改成你自己上传后的地址。

@echo off
color 0a
title Use autoconfig script
echo Starting......
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections" /v DefaultConnectionSettings /t REG_BINARY /d 46000000020000000900 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections" /v SavedLegacySettings /t REG_BINARY /d 46000000020000000900 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /d "http://xxx.pac" /f
echo End
@echo off

## 安装goproxy

go get github.com/elazarl/goproxy

直接上服务端,顺手给http代理加上校验

稍微解释一下原理,我这边儿是做了一个本地代理来进行中转,客户端连接到服务端,然后开一个本地端口8091,然后系统http代理就连接到这个本地服务上去,本地服务拿到请求,带上请求头账号密码,就发给服务端;

服务端此时就是等待用户请求,并查看当前请求的所带头的账号密码是否正确,正确就进行proxy代理即可。

以下是服务端代码:编译后启动用-p设置端口,如 server -p 8082

package mainimport ("flag""fmt""log""net/http""github.com/elazarl/goproxy""github.com/elazarl/goproxy/ext/auth"
)const (username = "anyanfei"password = "**********"
)var (serverPort = ""
)func init() {flag.StringVar(&serverPort, "p", "8001", "Setting server http proxy port like 8080")
}func main() {flag.Usage = func() {flag.PrintDefaults()}flag.Parse()if serverPort == "" {log.Fatalln("Error: please setting correct server port")}endProxy := goproxy.NewProxyHttpServer()endProxy.Verbose = trueauth.ProxyBasic(endProxy, "my_realm", func(user, pwd string) bool {return user == username && pwd == password})log.Println("serving proxy server port at", serverPort)http.ListenAndServe(":"+serverPort, endProxy)fmt.Println("The proxy server end.")
}

客户端代码:

package mainimport ("encoding/base64""fmt""log""net/http""net/url""os""os/signal""syscall""github.com/elazarl/goproxy"
)const (serverIp   = "http://xxx.xxx.xxx.xxx"serverPort = ":8082"proxyAuthHeader = "Proxy-Authorization"username        = "anyanfei"password        = "**********"middleProxyPort = ":9081"
)func main() {middleProxy := goproxy.NewProxyHttpServer()middleProxy.Verbose = truemiddleProxy.Tr.Proxy = func(req *http.Request) (*url.URL, error) {return url.Parse(serverIp + serverPort)}connectReqHandler := func(req *http.Request) {SetBasicAuth(username, password, req)}middleProxy.ConnectDial = middleProxy.NewConnectDialToProxyWithHandler(serverIp+serverPort, connectReqHandler)middleProxy.OnRequest().Do(goproxy.FuncReqHandler(func(req *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) {return req, nil}))//log.Println("the final server at", serverIp+serverPort) // 上线这句话有一定不能有log.Println("the middle proxy at", middleProxyPort)err := http.ListenAndServe(middleProxyPort, middleProxy)if err != nil {log.Fatalln(err)}onSignal := make(chan os.Signal)signal.Notify(onSignal, syscall.SIGINT, syscall.SIGTERM)select {case sig := <-onSignal:fmt.Println("exit proxy client", sig)return}
}// SetBasicAuth 设置proxy请求头,以base64加密当前字符串
func SetBasicAuth(username, password string, req *http.Request) {req.Header.Set(proxyAuthHeader, fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(username+":"+password))))
}// 直接运行即可

因为goproxy包里面解析的时候用的是Proxy-Authorization 并用base64decode解析了这个请求头,所以客户端加密的时候,也用到了base64encode,详情可以自行去看源码,写得挺不错的。

启动完了就可以用了,为我们领沃云电脑解决steam用户登录不上的问题贡献一份力量。

参考资料

goproxy:https://github.com/elazarl/goproxy

2022 GopherChina大会报名火热进行中!

扫描下方二维码即可报名参与

大会合作、现场招聘及企业购票等事宜请联系微信:18516100522

戳这里 Go !

实战 goproxy 为中国steam登录加速相关推荐

  1. JS逆向steam登录

    JS逆向steam登录 前言: 我们爬虫有时候,会遇到登录才能获取到数据的情况,最开始的时候我们只需要加入请求的data参数就可以,可是现在网站为了反爬,对登录的密码或者账号都做了加密处理,如果我们不 ...

  2. 【JS 逆向百例】XHR 断点调试,Steam 登录逆向

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:Steam ...

  3. PHP steam第三方登录,网站支持第三方STEAM登录了

    只要是上传过DEMO的玩家,网站管理员会帮你绑定你的steamid 然后你就可以使用STEAM登录了,如果没有绑定过steamid的,需要联系管理员帮你绑定. 将你的STEAMID,例子:STEAM_ ...

  4. 小米商城html代码_微服务架构实战:商城的用户登录与账户切换设计、订单查询设计...

    商城的用户登录与账号切换设计 在移动商城的设计中,除商品和分类查询是完全开放权限的页面外,其他涉及个人隐私的个人信息.订单查询和购物车等都必须进行权限管理. 有关用户权限管理的功能,在这里根据移动设备 ...

  5. 全球及中国STEAM素质教育行业发展价值与运营能力状况分析报告2022版

    全球及中国STEAM素质教育行业发展价值与运营能力状况分析报告2022版 HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS-- [修订日期]:2021年11 ...

  6. Docker 中国官方镜像加速

    通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像.该镜像托管于中国大陆,本地用户现在将会享受到更快的下载速度和更强的稳定性,从而能够更敏捷地开发和交付 Docker ...

  7. docker简易使用中国官方镜像加速

    通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像.该镜像托管于中国大陆,本地用户现在将会享受到更快的下载速度和更强的稳定性,从而能够更敏捷地开发和交付 Docker ...

  8. 【WEB API项目实战干货系列】- API登录与身份验证(三)

    上一篇: [WEB API项目实战干货系列]- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. ...

  9. qt登录界面跳转_每天10分钟,木辛老师带你实战慕课软件开发:登录界面开发第2课...

    软件实战开始,快速提供编程能力:通过实战,分析产品需求,梳理设计需求,提升项目分析和架构的能力.快点跟着木辛老师一起学习吧! 请点击右上角"关注"按钮关注我们哟:跟着木辛老师学习P ...

最新文章

  1. 一文带你搞懂 MySQL 分区!
  2. 对称加密算法DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES。
  3. 从字符串指定位置删除指定个数的字符
  4. 数据结构——顺序表(二)
  5. SQL Server遍历表中记录的2种方法
  6. Vue Axios的配置 (高仿饿了么)
  7. BZOJ2976 : [Poi2002]出圈游戏
  8. 工作效率 工具_我使用的工具加快了我的工作流程,使我的工作效率更高
  9. 利用 Python 写一个颜值测试小工具
  10. 跟我一起认识axure(三)
  11. phpstudy命令行中数据表插入中文显示不了的问题
  12. phper需要掌握的技能(简)
  13. iOS中如何添加自定义的字体库
  14. python jupyter notebook 上传文件_使用jupyter notebook将文件保存为Markdown,HTML等文件格式...
  15. 常数除以0的极限是什么_【高数总结求极限方法】百度作业帮
  16. 老哥们着急求助一下:报错ORA-39083,ORA-00001
  17. HTML计算平均成绩,成绩平均分怎么算
  18. 【c++笔记一】名字空间(namespace)
  19. 【业务办理】广州市户口市内迁移流程
  20. 深入了解ElasticSearch的Nested数据类型

热门文章

  1. 关于华硕天选2笔记本所用的mt7921网卡问题
  2. PHP 导出cvs文件
  3. html开头乱码,HTML乱码怎么办?
  4. vivo Y55A解账户锁刷机包 线刷包救砖教程
  5. 如何能练就成一个卓越的程序员
  6. 【在线听】香港回归20周年历年金曲奖歌曲
  7. nginx上传图片大小限制
  8. 林仕鼎谈数据中心计算(二):存储资源分层
  9. android-pdf阅读器(Android开源项目)
  10. Mac终端神器iterm2常用配置