socks5 接入
1. 调用移动权益认证(可选)
对于支持移动权益免流的客户,先调用
/api/v2/client/enableCMCCRightsVerify 获取免流认证码。参数配置:
token:移动提供的 token。
guid:搭配 token 一起使用。
salt:盐值,加密使用。
如果成功,记录返回值 authCode,在下面第二步时填入。
如果失败,则可以根据需求给用户提示。
2. 配置加速参数(必选)
再调用
/api/v2/client/mp-speeder(配置加速参数接口)按如下参数配置:
appId:填入从腾讯云控制台获取的应用 id。
appSign:根据app密钥计算而来,算法参见附录。
scheduleMode:rtc
authCode(可选):填入第一步移动权益认证接口返回的
authCode。其它可选参数根据需要选填。
3. 配置转发规则(可选,仅当需要T2段加速时开启)
调用
/api/v2/client/multi-mode(流转发策略配置接口),指定转发策略:指定参数:
area:T2 段的下车点,按照 API 概览中的示例选择。
speedMode:选择35
4. 开启 socks5 服务(必选)
调用
/api/v2/client/socks5(配置socks5 server接口)开启 socks5 server。指定参数:
enable: true。
port:客户指定。
userName:客户指定。
passWord:客户指定。
5. 开启加速
调用(开启加速接口)后,SDK 将首先连接就近腾讯云网关。
curl -X POST "http://127.0.0.1:9801/api/v2/client/mp-speeder/start" -H "accept: */*" -H "Content-Type: application/json"
6. 将流量引入socks5
附录:appSign 计算方法
Python
import jwtfrom datetime import datetime, timedeltafrom typing import Tupleclass JWTGenerator:@classmethoddef generate_sign(cls, secret_key, device_name: str) -> Tuple[str, int]:"""生成JWT签名"""now = datetime.utcnow()payload = {"deviceName": device_name}token = jwt.encode(payload,secret_key,algorithm="HS256")return tokenif __name__ == "__main__":try:# 请替换为控制台获取的APP密钥secret_key = "QGZzL0M6L3dpbmRvd3Mvd2luLmluaT9yYXc/aW1wb3J0Jg=="# 请替换为设备名称,每个设备请使用不通的device_namedevice_name = "test"sign = JWTGenerator.generate_sign(secret_key, device_name)print(f"Signature: {sign}")except Exception as e:print(f"Error generating token: {str(e)}")
golang
package mainimport ("fmt""github.com/golang-jwt/jwt/v4")type JWTGenerator struct{}// GenerateSign 生成JWT签名func (g *JWTGenerator) GenerateSign(secretKey string, deviceName string) (string, error) {// 创建 payloadclaims := jwt.MapClaims{"deviceName": deviceName,}// 创建 tokentoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)// 使用密钥签名signedToken, err := token.SignedString([]byte(secretKey))if err != nil {return "", err}return signedToken, nil}func main() {// 请替换为控制台获取的APP密钥secretKey := "QGZzL0M6L3dpbmRvd3Mvd2luLmluaT9yYXc/aW1wb3J0Jg=="// 请替换为设备名称,每个设备请使用不同的device_namedeviceName := "test"generator := &JWTGenerator{}sign, err := generator.GenerateSign(secretKey, deviceName)if err != nil {fmt.Printf("Error generating token: %v\\n", err)return}fmt.Printf("Signature: %s\\n", sign)}
Java
<dependencies><!-- JWT 库 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.5</version><scope>runtime</scope></dependency></dependencies>
上面这段配置是 Java 项目通过 Maven 引入 JWT 工具库的依赖。
import io.jsonwebtoken.Jwts;import io.jsonwebtoken.security.Keys;import javax.crypto.SecretKey;import java.nio.charset.StandardCharsets;import java.util.Date;import java.util.HashMap;import java.util.Map;public class JWTGenerator {/*** 生成JWT签名* @param secretKey 密钥字符串* @param deviceName 设备名称* @return JWT token*/public static String generateSign(String secretKey, String deviceName) {// 将密钥字符串转换为 SecretKeySecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));// 创建 payloadMap<String, Object> claims = new HashMap<>();claims.put("deviceName", deviceName);// 构建 JWTreturn Jwts.builder().setClaims(claims).signWith(key).compact();}public static void main(String[] args) {try {// 请替换为控制台获取的APP密钥String secretKey = "QGZzL0M6L3dpbmRvd3Mvd2luLmluaT9yYXc/aW1wb3J0Jg==";// 请替换为设备名称,每个设备请使用不同的device_nameString deviceName = "test";String sign = generateSign(secretKey, deviceName);System.out.println("Signature: " + sign);} catch (Exception e) {System.out.println("Error generating token: " + e.getMessage());e.printStackTrace();}}}
附录:encryptSign 计算方法
golang
package mainimport ("crypto/sha256""fmt""golang.org/x/crypto/chacha20""net")// 加解密共用func encryptOrdecrypt(ip net.IP, psk []byte) ([]byte, error) {if ip.To4() == nil {return nil, fmt.Errorf("invalid ipv4 address")}key := sha256.Sum256(psk)encryptKey := key[:32]nonce := make([]byte, 12)cipher, err := chacha20.NewUnauthenticatedCipher(encryptKey, nonce)if err != nil {return nil, err}// 原地加密(32bit精确输出)ciphertext := make([]byte, net.IPv4len)cipher.XORKeyStream(ciphertext, ip.To4())return ciphertext, nil}