├── README.md └── main.go /README.md: -------------------------------------------------------------------------------- 1 | # wechatJumper 2 | 3 | 4 | 直接使用方式: 5 | 6 | 7 | 8 | https://wq.jd.com/mjgj/link/GetOpenLink?rurl=https://dc2.jd.com/auto.php?service=transfer&type=pms&to=http%3a%2f%2fmjbbs.jd.com%2fuc_server%2favatar.php%3fuid%3d173158%26size%3dmiddle&openlink=1 9 | 10 | 11 | 12 | 13 | 14 | 15 | 如跳转失败或跳转到京东官方页面,则需要自行寻找 符合白名单规则的京东二级域名,上传自己的宣传图片,如二维码,以上 16 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | /** 4 | @author: ECH2O 5 | @time: 2018-7-4 14:37:14 6 | @tip: access_token 有效期限为一年 7 | */ 8 | 9 | import ( 10 | "net/http" 11 | "fmt" 12 | "net/url" 13 | "strings" 14 | "io/ioutil" 15 | "encoding/json" 16 | "time" 17 | ) 18 | 19 | func main() { 20 | 21 | http.HandleFunc("/openlink", JDRender) 22 | 23 | http.ListenAndServe(":8989", nil); 24 | } 25 | 26 | type JDConfig struct { 27 | access_token string 28 | app_key string 29 | method string 30 | sgin string 31 | } 32 | 33 | func conf() JDConfig { 34 | return JDConfig{ 35 | "d485f611-7d1f-49d5-97a9-d5ac5450c659", 36 | "8E76F960FE21B40A83B167F22223759C", 37 | "jingdong.wxsq.mjgj.link.GetOpenLink", 38 | "35D5AA4F312FD08D8070B951105A8D9C", 39 | } 40 | } 41 | 42 | func JDRender(w http.ResponseWriter, r *http.Request) { 43 | 44 | r.ParseForm() 45 | jdUrl := r.Form.Get("url") 46 | _, err := url.ParseRequestURI(jdUrl) 47 | if err != nil || !strings.Contains(jdUrl, "jd.com") { 48 | errInfo := `{"errcode":-1,"message":"不支持的资源域名 Only => *.jd.com"}` 49 | fmt.Fprintf(w, errInfo) 50 | return 51 | } else { 52 | jdRurl := url.QueryEscape(strings.Split(jdUrl, ":")[1]) 53 | data := url.Values{"jump": {"0"}, "rurl": {url.QueryEscape("http://dc2.jd.com/auto.php?service=transfer&type=pms&to=" + jdRurl + "&openlink=1")}} 54 | body := strings.NewReader(data.Encode()) 55 | clt := http.Client{} 56 | resp, err := clt.Post(JDApi(), "application/x-www-form-urlencoded", body) 57 | if err != nil { 58 | fmt.Print(err.Error()) 59 | return 60 | } 61 | content, err := ioutil.ReadAll(resp.Body) 62 | respBody := string(content) 63 | var dat map[string]interface{} 64 | if err := json.Unmarshal([]byte(respBody), &dat); err == nil { 65 | r, _ := json.Marshal(dat["jingdong_wxsq_mjgj_link_GetOpenLink_responce"]) 66 | if err := json.Unmarshal(r, &dat); err == nil { 67 | r, _ := json.Marshal(dat["open_link_result"]) 68 | fmt.Fprintf(w, string(r)) 69 | } 70 | } 71 | } 72 | fmt.Print("\r\n访问者ip:" + r.Header.Get("X-Real-Ip") + strings.Split(r.RemoteAddr, ":")[0]) 73 | 74 | } 75 | 76 | func JDApi() string { 77 | return "https://api.jd.com/routerjson?access_token=" + conf().access_token + 78 | "&app_key=" + conf().app_key + 79 | "&method=" + conf().method + 80 | "&v=2.0&sign=" + conf().sgin + 81 | "×tamp=" + string(time.Now().Unix()) 82 | } 83 | --------------------------------------------------------------------------------