Compare commits
	
		
			2 Commits
		
	
	
		
			v0.1
			...
			00b07f7e2b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 00b07f7e2b | |||
| 197918a26d | 
							
								
								
									
										13
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								README.md
									
									
									
									
									
								
							| @ -1,6 +1,15 @@ | ||||
| ### sati bridge | ||||
| # sati bridge | ||||
| прослойка, эмулирующая API других сервисов. для использования готового софта с [sati.ac](https://sati.ac) | ||||
|  | ||||
| на данный момент реализованы: | ||||
| - RuCaptcha | ||||
| - AntiGateV2 | ||||
| - AntiGateV2 | ||||
|  | ||||
| ## установка и запуск (windows) | ||||
| - скачайте мост со [страницы релизов](https://git.sati.ac/sati.ac/bridge/releases) | ||||
| - создайте новую папку и поместите в неё софт | ||||
| - запустите exeшник от администратора, он закроется, это нормально. рядом должна появиться папка data, с конфигом `config.json` и сертификатом `ca.crt` внутри | ||||
| - далее вам нужно добавить в конфиг ваш API токен: замените `"token": ""` на `"token": "ВАШ_ТОКЕН"`. взять его можно [тут](https://sati.ac/dashboard). если ваш софт использует API схожее с одним из тех, что поддерживаются, но на другом домене, то вы можете добавить его в extraDomains, например так: `{ "example.com": "AntiGateV2" }` | ||||
| - добавьте корневой сертификат в хранилище доверенных корневых центров сертификации, кликнув на него, и выбрав нужное хранилище | ||||
| - снова запустите exeшник с правами администратора, если в логе есть сообщение `starting api server`, то мост успешно запущен | ||||
| - проверьте работу софта, открыв [bridge.sati.ac](https://bridge.sati.ac) в браузере. если все работает - там будет показана статистика | ||||
| @ -115,19 +115,20 @@ func (a *antigateV2Api) getTaskResult(request struct { | ||||
| 		response.Status = "ready" | ||||
| 		response.EndTime = &task.EndTime | ||||
| 		response.Cost = task.Entity.Cost | ||||
| 		switch task.Result.(type) { | ||||
| 		switch result := task.Result.(type) { | ||||
| 		case *sati.ReCaptcha2Result: | ||||
| 			response.Solution = struct { | ||||
| 				GRecaptchaResponse string `json:"gRecaptchaResponse"` | ||||
| 			}{task.Result.(*sati.ReCaptcha2Result).Token} | ||||
| 			}{result.Token} | ||||
| 		case *sati.TurnstileResult: | ||||
| 			response.Solution = struct { | ||||
| 				Token     string `json:"token"` | ||||
| 				UserAgent string `json:"userAgent"` | ||||
| 			}{ | ||||
| 				task.Result.(*sati.TurnstileResult).Token, | ||||
| 				a.ctx.Config.AntiGateV2.TurnstileUserAgent, | ||||
| 			} | ||||
| 			}{result.Token, a.ctx.Config.AntiGateV2.TurnstileUserAgent} | ||||
| 		case *sati.FunCaptchaResult: | ||||
| 			response.Solution = struct { | ||||
| 				Token string `json:"token"` | ||||
| 			}{result.Token} | ||||
| 		default: | ||||
| 			return errorTaskNotSupported | ||||
| 		} | ||||
| @ -169,6 +170,18 @@ func (a *antigateV2Api) createTask(request struct { | ||||
| 			PageUrl: task.WebsiteURL, | ||||
| 			SiteKey: task.WebsiteKey, | ||||
| 		}) | ||||
| 	case "FunCaptchaTask", "FunCaptchaTaskProxyless": | ||||
| 		var task struct { | ||||
| 			WebsiteURL       string            `json:"websiteURL"` | ||||
| 			WebsitePublicKey string            `json:"websitePublicKey"` | ||||
| 			Data             map[string]string `json:"data"` | ||||
| 		} | ||||
| 		mapstructure.Decode(request.Task, &task) | ||||
| 		id = a.ctx.Registry.CreateTask(&sati.FunCaptchaTask{ | ||||
| 			PageUrl: task.WebsiteURL, | ||||
| 			SiteKey: task.WebsitePublicKey, | ||||
| 			Data:    task.Data, | ||||
| 		}) | ||||
| 	default: | ||||
| 		return errorTaskNotSupported | ||||
| 	} | ||||
|  | ||||
| @ -72,6 +72,24 @@ type okResponse simpleResponse | ||||
|  | ||||
| func (r *okResponse) text() string { return "OK|" + r.Request } | ||||
|  | ||||
| func parsePhpAssociativeArray(values map[string][]string, arrayName string) map[string]string { | ||||
| 	result := make(map[string]string) | ||||
| 	prefix := arrayName + "[" | ||||
| 	suffix := "]" | ||||
|  | ||||
| 	for key, values := range values { | ||||
| 		if strings.HasPrefix(key, prefix) && strings.HasSuffix(key, suffix) && len(values) > 0 { | ||||
| 			result[key[len(prefix):len(key)-len(suffix)]] = values[0] | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(result) == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	return result | ||||
| } | ||||
|  | ||||
| func (a *ruCaptchaApi) endpointIn(params url.Values) ruCaptchaResponse { | ||||
| 	var id uint32 | ||||
| 	switch params.Get("method") { | ||||
| @ -125,6 +143,26 @@ func (a *ruCaptchaApi) endpointIn(params url.Values) ruCaptchaResponse { | ||||
| 			Action:  action, | ||||
| 			CData:   cData, | ||||
| 		}) | ||||
| 	case "funcaptcha": | ||||
| 		siteKey := params.Get("publickey") | ||||
| 		pageUrl := params.Get("pageurl") | ||||
| 		data := parsePhpAssociativeArray(params, "data") | ||||
| 		if siteKey == "" || pageUrl == "" { | ||||
| 			return &simpleResponse{0, "ERROR_BAD_PARAMETERS"} | ||||
| 		} | ||||
|  | ||||
| 		var serviceUrl *string | ||||
| 		if params.Has("surl") { | ||||
| 			val := params.Get("surl") | ||||
| 			serviceUrl = &val | ||||
| 		} | ||||
|  | ||||
| 		id = a.ctx.Registry.CreateTask(&sati.FunCaptchaTask{ | ||||
| 			SiteKey:    siteKey, | ||||
| 			PageUrl:    pageUrl, | ||||
| 			ServiceUrl: serviceUrl, | ||||
| 			Data:       data, | ||||
| 		}) | ||||
| 	default: | ||||
| 		return &simpleResponse{0, "ERROR_ZERO_CAPTCHA_FILESIZE"} | ||||
| 	} | ||||
| @ -143,11 +181,13 @@ func (r *get2Response) text() string { | ||||
| } | ||||
|  | ||||
| func (a *ruCaptchaApi) convertTaskResult(task *Task) string { | ||||
| 	switch task.Result.(type) { | ||||
| 	switch result := task.Result.(type) { | ||||
| 	case *sati.ReCaptcha2Result: | ||||
| 		return task.Result.(*sati.ReCaptcha2Result).Token | ||||
| 		return result.Token | ||||
| 	case *sati.TurnstileResult: | ||||
| 		return task.Result.(*sati.TurnstileResult).Token | ||||
| 		return result.Token | ||||
| 	case *sati.FunCaptchaResult: | ||||
| 		return result.Token | ||||
| 	} | ||||
|  | ||||
| 	a.ctx.Logger.WithFields(logrus.Fields{ | ||||
|  | ||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -2,7 +2,7 @@ module git.sati.ac/sati.ac/bridge | ||||
|  | ||||
| go 1.20 | ||||
|  | ||||
| require git.sati.ac/sati.ac/sati-go v0.0.0-20230630184329-03a405a25122 | ||||
| require git.sati.ac/sati.ac/sati-go v0.0.0-20230713145537-57719018ca00 | ||||
|  | ||||
| require ( | ||||
| 	github.com/gorilla/websocket v1.5.0 // indirect | ||||
|  | ||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							| @ -4,6 +4,8 @@ git.sati.ac/sati.ac/sati-go v0.0.0-20230629103120-de6961c4f6ec h1:DHmxYp62PfGP+j | ||||
| git.sati.ac/sati.ac/sati-go v0.0.0-20230629103120-de6961c4f6ec/go.mod h1:dsLvwV5+2YUjWRAuTYFf/EMvoH/twUu/NWA0t5Yl3pQ= | ||||
| git.sati.ac/sati.ac/sati-go v0.0.0-20230630184329-03a405a25122 h1:Uff2QZeRDk+3cm3cN9tUiUoT2VoKcwbIf32wYgYSUNU= | ||||
| git.sati.ac/sati.ac/sati-go v0.0.0-20230630184329-03a405a25122/go.mod h1:dsLvwV5+2YUjWRAuTYFf/EMvoH/twUu/NWA0t5Yl3pQ= | ||||
| git.sati.ac/sati.ac/sati-go v0.0.0-20230713145537-57719018ca00 h1:emjsk5AubG3EiCbiG0WAG6xAZXoNNwO/yteYj/J0TqA= | ||||
| git.sati.ac/sati.ac/sati-go v0.0.0-20230713145537-57719018ca00/go.mod h1:dsLvwV5+2YUjWRAuTYFf/EMvoH/twUu/NWA0t5Yl3pQ= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	