Skip to content

Commit 157fe16

Browse files
committed
Update readme, remove myDialer, add default error response.
1 parent da8ebd5 commit 157fe16

File tree

3 files changed

+60
-41
lines changed

3 files changed

+60
-41
lines changed

README.md

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,28 @@
22

33
一个自动切换12306 CDN的代理,只需设置浏览器的代理为此软件监听端口,每次查询请求都会更换CDN,达到快速刷票的目的。
44

5-
思路来自[分享12306秒票杀手锏源码](http://www.cnblogs.com/guozili/p/3512490.html)
6-
7-
# 推荐使用此方法 [Fiddler设置教程](https://github.com/cxjava/AutoChange12306CDN/wiki/Fiddler%E8%AE%BE%E7%BD%AE%E6%95%99%E7%A8%8B)
8-
95
# 使用方法
106

11-
* 查找自己当前环境最快的CDN地址,运行findIP/findIP.exe,相同目录下面会生成12306_ip.txt,IP是Ping速度由快到慢进行排列,只需选取前30个IP写入到config.ini里面的cdn= []
12-
* 添加自己需要查票的起点站和终点站到config.ini,请仔细阅读config.ini里面的相关项配置,如果不清楚,不要随意修改配置
13-
* 打开本软件,设置谷歌浏览器的代理地址为本软件监听地址:127.0.0.1:8080,修改代理的软件有[Proxy SwitchySharp](https://chrome.google.com/webstore/detail/dpplabbmogkhghncfbfdeeokoefdjegm) 安装教程请参考 [谷歌 Chrome 配合 SwitchySharp 扩展](https://github.com/goagent/goagent/blob/wiki/InstallGuide.md#%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%BE%E7%BD%AE%E6%96%B9%E6%B3%95)
14-
* 如果使用谷歌浏览器订票,请在订票页面,按F12,选择下面的console栏,在光标位置输入:window.autoSearchTime = 2000; 再按回车。此操作为了设置每次查询间隔为2秒,官网默认为5秒,自己可以设置其他值。
15-
* 如果使用[12306订票助手.NET版](http://www.fishlee.net/soft/12306/#C-308)订票,请设置其中的代理地址为本软件的监听地址:127.0.0.1:8080
16-
* 谷歌浏览器如果通过本软件访问: https://kyfw.12306.cn/otn/leftTicket/init ,会出现证书错误问题,消息如下:
7+
* 软件启动后会查找当前环境最快的`12306 CDN`地址,`iprange.conf`是所有的12306的CDN地址。
8+
* 打开本软件,设置谷歌浏览器的代理地址为本软件监听地址:`127.0.0.1:8888`,修改代理的软件有[Proxy SwitchySharp](https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif) 安装配置教程请参考 [Chrome SwitchySharp配置](https://www.switchyomega.com/settings/)
9+
* 如果使用谷歌浏览器订票,请在订票页面,按`F12`,选择下面的`console`栏,在光标位置输入:`window.autoSearchTime = 1000`; 再按回车。此操作为了设置每次查询间隔为`1`秒,官网默认为`5`秒,自己可以设置其他值,但是最好不要小于`1`秒(即`1000`),设置太小容易被封IP。
10+
* 谷歌浏览器如果通过本软件访问: [https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc](https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc) ,会出现证书错误问题,消息如下:
1711

1812
> #### 您的连接不是私密连接
1913
>
2014
> #### 攻击者可能会试图从kyfw.12306.cn窃取您的信息(例如:密码、通讯内容或信用卡信息)。
2115
>
2216
> #### 高级
23-
点击 高级 ,再次点击 "继续kyfw.12306.cn(不安全)"
17+
点击 *高级* ,再次点击 "继续kyfw.12306.cn(不安全)"
2418

2519
# 打包好的下载地址
20+
21+
链接:[AutoChange12306CDN](https://github.com/cxjava/AutoChange12306CDN/releases)
22+
23+
## 备用方法(设置稍微复杂一丢丢)[Fiddler抢票设置教程](https://github.com/cxjava/AutoChange12306CDN/wiki/Fiddler%E8%AE%BE%E7%BD%AE%E6%95%99%E7%A8%8B)
24+
2625
链接:[Fiddler抢票需要的软件](https://github.com/cxjava/AutoChange12306CDN/releases/tag/v1.0.1)
2726

28-
#### 最后希望大家都能早日买到火车票票回家团圆
27+
# 最后希望大家都能早日买到火车票票回家团圆
28+
29+
思路来自[分享12306秒票杀手锏源码](http://www.cnblogs.com/guozili/p/3512490.html)

main.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import (
1010
)
1111

1212
var (
13-
logger *log.Logger
14-
cdnChan = make(chan string, 10)
15-
addr = flag.String("a", ":8888", "The proxy listen address")
16-
size = flag.Int("s", 20, "The fastest number of IP")
13+
logger *log.Logger
14+
cdnChan = make(chan string, 10)
15+
fastest = ""
16+
addr = flag.String("a", ":8888", "The proxy listen address")
17+
queryURL = flag.String("q", "/otn/leftTicket/query", "The prefix of 12306 query URL")
18+
size = flag.Int("s", 20, "The fastest number of IP")
1719
)
1820

1921
func init() {
@@ -25,6 +27,7 @@ func addCDN() {
2527
fastestCDN := make(map[string]string, *size)
2628

2729
ips := gscan.ScanIP("./iprange.conf", gscanConf)
30+
fastest = ips[0] + ":443"
2831
t := 0
2932
for _, v := range ips {
3033
if t >= *size {
@@ -34,7 +37,7 @@ func addCDN() {
3437
fastestCDN[v] = v + ":443"
3538
fmt.Println(v)
3639
}
37-
logger.Println("CDN query is done!")
40+
logger.Println("CDN query is done! fastest one is:" + fastest)
3841
logger.Println("Server is listening at ", *addr)
3942

4043
go func() {

mitmserver.go

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ import (
1414
"time"
1515
)
1616

17+
var (
18+
errorResp = "HTTP/1.0 200 OK\r\n" +
19+
"Connection: close\r\n" +
20+
"Content-Type: application/json;charset=UTF-8\r\n" +
21+
"\r\n" +
22+
`{"data":{"flag":"1","map":{"CUW":"重庆北","HKN":"汉口","WCN":"武昌"},"result":["|预订|2400000Z490F|Z49|BXP|CDW|HKN|CUW|22:20|05:32|07:12|N|g%2Bd3SnPhBrp6gzy5Eq4zATL6rGgQn4nznpuJl5niuOcsnDutccVaBIqfJp4%3D|20190101|3|P4|05|08|0|0||||无|||无||无|无|||||10401030|1413|0|0"]},"httpstatus":200,"messages":"","status":true}`
23+
)
24+
1725
const (
1826
Version = "1.1"
1927
ONE_DAY = 24 * time.Hour
@@ -59,15 +67,6 @@ func (handler *HandlerWrapper) ServeHTTP(resp http.ResponseWriter, req *http.Req
5967
}
6068
}
6169

62-
type myDialer struct {
63-
d *net.Dialer
64-
ConnectDial func(network string, addr string) (net.Conn, error)
65-
}
66-
67-
func (d *myDialer) Dial(network, address string) (net.Conn, error) {
68-
return d.ConnectDial(network, address)
69-
}
70-
7170
// DumpHTTPAndHTTPS function to dump the HTTP request header and body
7271
func (handler *HandlerWrapper) DumpHTTPAndHTTPS(resp http.ResponseWriter, req *http.Request) {
7372
req.Header.Del("Proxy-Connection")
@@ -105,23 +104,35 @@ func (handler *HandlerWrapper) DumpHTTPAndHTTPS(resp http.ResponseWriter, req *h
105104
if !matched {
106105
host += ":443"
107106
}
108-
if host == "kyfw.12306.cn:443" && strings.HasPrefix(req.RequestURI, "/otn/leftTicket/query") {
109-
host = <-cdnChan
110-
logger.Println("current CDN is:", host)
107+
if host == "kyfw.12306.cn:443" {
108+
host = fastest
109+
if strings.HasPrefix(req.RequestURI, *queryURL) {
110+
host = <-cdnChan
111+
logger.Println("current CDN is:", host)
112+
connOut, err = tls.DialWithDialer(&net.Dialer{
113+
Timeout: 1 * time.Second,
114+
KeepAlive: 0,
115+
}, "tcp", host, handler.tlsConfig.ServerTLSConfig)
116+
if err != nil {
117+
logger.Println("Dial to", host, "error:", err)
118+
connHj.Write([]byte(errorResp))
119+
return
120+
}
121+
} else {
122+
connOut, err = tls.Dial("tcp", host, handler.tlsConfig.ServerTLSConfig)
123+
if err != nil {
124+
logger.Println("Dial to", host, "error:", err)
125+
return
126+
}
127+
}
128+
} else {
129+
connOut, err = tls.Dial("tcp", host, handler.tlsConfig.ServerTLSConfig)
130+
if err != nil {
131+
logger.Println("Dial to", host, "error:", err)
132+
return
133+
}
111134
}
112135

113-
connOut, err = tls.DialWithDialer(&net.Dialer{
114-
Timeout: 1 * time.Second,
115-
KeepAlive: 0,
116-
}, "tcp", host, handler.tlsConfig.ServerTLSConfig)
117-
if err != nil {
118-
logger.Println("Dial to", host, "error:", err)
119-
connHj.Write([]byte("HTTP/1.0 200 OK\r\n" +
120-
"Connection: close\r\n" +
121-
"\r\n" +
122-
"Body here\n"))
123-
return
124-
}
125136
}
126137

127138
// Write writes an HTTP/1.1 request, which is the header and body, in wire format. This method consults the following fields of the request:
@@ -136,22 +147,26 @@ func (handler *HandlerWrapper) DumpHTTPAndHTTPS(resp http.ResponseWriter, req *h
136147
*/
137148
if err = req.Write(connOut); err != nil {
138149
logger.Println("send to server error", err)
150+
connHj.Write([]byte(errorResp))
139151
return
140152
}
141153

142154
respFromRemote, err := http.ReadResponse(bufio.NewReader(connOut), req)
143155
if err != nil && err != io.EOF {
144156
logger.Println("Fail to read response from remote server.", err)
157+
connHj.Write([]byte(errorResp))
145158
}
146159

147160
respDump, err := httputil.DumpResponse(respFromRemote, true)
148161
if err != nil {
149162
logger.Println("Fail to dump the response.", err)
163+
connHj.Write([]byte(errorResp))
150164
}
151165
// Send remote response back to client
152166
_, err = connHj.Write(respDump)
153167
if err != nil {
154168
logger.Println("Fail to send response back to client.", err)
169+
connHj.Write([]byte(errorResp))
155170
}
156171

157172
<-ch

0 commit comments

Comments
 (0)