快速接入

最近更新时间:2025-12-24 14:21:42

我的收藏

socks5 接入

1. 调用移动权益认证(可选)

对于支持移动权益免流的客户,先调用 /api/v2/client/enableCMCCRightsVerify 获取免流认证码。
参数配置:
token:移动提供的 token。
guid:搭配 token 一起使用。
salt:盐值,加密使用。
如果成功,记录返回值 authCode,在下面第二步时填入。
如果失败,则可以根据需求给用户提示。

2. 配置加速参数(必选)

首先,从腾讯云控制台获取 appId 和 app 密钥,然后参考附录的源代码,计算 appSign.
再调用 /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

业务 app 流量引入步骤 4中指定 socks5 端口,流量将按配置好的规则转发。

附录:appSign 计算方法

Python

import jwt
from datetime import datetime, timedelta
from typing import Tuple


class JWTGenerator:
@classmethod
def 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 token

if __name__ == "__main__":
try:
# 请替换为控制台获取的APP密钥
secret_key = "QGZzL0M6L3dpbmRvd3Mvd2luLmluaT9yYXc/aW1wb3J0Jg=="
# 请替换为设备名称,每个设备请使用不通的device_name
device_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 main

import (
"fmt"
"github.com/golang-jwt/jwt/v4"
)

type JWTGenerator struct{}

// GenerateSign 生成JWT签名
func (g *JWTGenerator) GenerateSign(secretKey string, deviceName string) (string, error) {
// 创建 payload
claims := jwt.MapClaims{
"deviceName": deviceName,
}

// 创建 token
token := 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_name
deviceName := "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) {
// 将密钥字符串转换为 SecretKey
SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
// 创建 payload
Map<String, Object> claims = new HashMap<>();
claims.put("deviceName", deviceName);
// 构建 JWT
return Jwts.builder()
.setClaims(claims)
.signWith(key)
.compact();
}
public static void main(String[] args) {
try {
// 请替换为控制台获取的APP密钥
String secretKey = "QGZzL0M6L3dpbmRvd3Mvd2luLmluaT9yYXc/aW1wb3J0Jg==";
// 请替换为设备名称,每个设备请使用不同的device_name
String 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 main

import (
"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
}