149 lines
5.0 KiB
Python
149 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
||
import json
|
||
import hmac
|
||
import time
|
||
import random
|
||
import hashlib
|
||
import requests
|
||
from urllib.parse import urlparse
|
||
|
||
# 示例参数
|
||
secret_key = "3yc8c8bg1dym0zaiwjh867al"
|
||
end_point = "https://openapi-hk.armcloud.net"
|
||
access_key_id = "gz8f1u0t63byzdu6ozbx8r5qs3e5lipt"
|
||
default_bypass_domain = ['rr1---sn-i3b7knsl.gvt1.com']
|
||
|
||
|
||
def calculate_signature(timestamp, path, body):
|
||
string_to_sign = timestamp + path + (body if body else "")
|
||
signature = hmac.new(
|
||
secret_key.encode('utf-8'),
|
||
string_to_sign.encode('utf-8'),
|
||
hashlib.sha256
|
||
).hexdigest()
|
||
return signature
|
||
|
||
|
||
def sig_request(req: requests.Request):
|
||
re_qu = urlparse(req.url)
|
||
query_string = ""
|
||
if req.method == "GET":
|
||
query_string = re_qu.query
|
||
elif req.method == "POST":
|
||
query_string = req.data
|
||
# 生成时间戳
|
||
timestamp = str(int(time.time() * 1000))
|
||
signature = calculate_signature(timestamp=timestamp, path=re_qu.path, body=query_string)
|
||
req.headers["authver"] = "2.0"
|
||
req.headers["x-ak"] = access_key_id
|
||
req.headers["x-timestamp"] = timestamp
|
||
req.headers["x-sign"] = signature
|
||
|
||
|
||
def api(api_endpoint, payload):
|
||
try:
|
||
headers = {"Content-Type": "application/json"}
|
||
payloads = json.dumps(payload)
|
||
|
||
# 3. 发送请求
|
||
r = requests.Request('POST', api_endpoint,
|
||
headers=headers, data=payloads)
|
||
sig_request(r)
|
||
session = requests.Session()
|
||
response = session.send(r.prepare())
|
||
response.raise_for_status()
|
||
# 4. 解析响应
|
||
result = response.json()
|
||
# print("API %s %s %s", api_endpoint, payloads, result)
|
||
if result.get("code") == 200:
|
||
if isinstance(result['data'], dict):
|
||
return [result['data']]
|
||
elif isinstance(result['data'], list):
|
||
return result['data']
|
||
# 5. 业务状态码检查
|
||
error_map = {
|
||
110003: "ADB命令执行失败,请联系管理员",
|
||
110012: "命令执行超时,请稍后重试"
|
||
}
|
||
error_code = result.get("code")
|
||
err_msg = " %s %s %s" % (error_map.get(
|
||
error_code, f"未知错误: {result.get('msg')}"), error_code, result.get("ts"))
|
||
except requests.exceptions.RequestException as e:
|
||
err_msg = f"网络请求异常: {str(e)} 500"
|
||
except json.JSONDecodeError:
|
||
err_msg = "响应解析失败 502"
|
||
except KeyError as e:
|
||
err_msg = f"响应字段缺失: {str(e)} 503"
|
||
print(err_msg)
|
||
return []
|
||
|
||
|
||
def set_network_proxy(pad_codes, account, password, ip, port, proxy_type, proxy_name,
|
||
bypass_package_list=None,
|
||
bypass_ip_list=None,
|
||
bypass_domain_list=None,
|
||
enable=True,
|
||
s_uot=False):
|
||
"""
|
||
设置网络代理配置
|
||
|
||
参数说明:
|
||
pad_codes (list): 实例列表 (必填)
|
||
enable (bool): 启用代理 (必填)
|
||
account (str): 账号
|
||
password (str): 密码
|
||
ip (str): 代理IP
|
||
port (int): 代理端口
|
||
proxy_type (str): 代理类型 (proxy/vpn)
|
||
proxy_name (str): 代理协议 (socks5/http-relay)
|
||
bypass_package_list (list): 不走代理的包名列表
|
||
bypass_ip_list (list): 不走代理的IP列表
|
||
bypass_domain_list (list): 不走代理的域名列表
|
||
s_uot (bool): 是否开启UDP连接
|
||
|
||
返回: API响应数据或错误信息
|
||
"""
|
||
# 构造请求URL (替换为实际域名)
|
||
url = end_point + "/openapi/open/network/proxy/set"
|
||
# 构造请求体
|
||
if isinstance(pad_codes, str):
|
||
pad_codes = [pad_codes]
|
||
payload = {
|
||
"padCodes": pad_codes,
|
||
"enable": enable,
|
||
"sUoT": s_uot
|
||
}
|
||
# 添加可选参数
|
||
if account:
|
||
payload["account"] = account
|
||
if password:
|
||
payload["password"] = password
|
||
if ip:
|
||
payload["ip"] = ip
|
||
if port:
|
||
payload["port"] = port
|
||
if proxy_type:
|
||
payload["proxyType"] = proxy_type
|
||
if proxy_name:
|
||
payload["proxyName"] = proxy_name
|
||
if bypass_package_list:
|
||
payload["bypassPackageList"] = bypass_package_list
|
||
if bypass_ip_list:
|
||
payload["bypassIpList"] = bypass_ip_list
|
||
if bypass_domain_list:
|
||
bypass_domain_list.extend(default_bypass_domain)
|
||
payload["bypassDomainList"] = bypass_domain_list
|
||
return api(url, payload)
|
||
|
||
|
||
# tasks = set_network_proxy(pad_codes=["ACP250915XAGEH03"],
|
||
# account=f'uniproxy-zone-custom-region-US-session-{random.randint(1000000, 1000000000)}-sessTime-20',
|
||
# password='uniproxy',
|
||
# ip='adv1.uipoxy.com', port=3000,
|
||
# proxy_name='socks5',
|
||
# proxy_type='proxy')
|
||
# print(tasks)
|
||
# set_cmd = f"/data/wyproxy/run.sh -proxy socks5://6255452-2ff229fb:uniproxy@adv1.uipoxy.com:3000 -dns 8.8.8.8 -noudp"
|
||
# # curl -x socks5://uniproxy-zone-custom:uniproxy@adv1.ipmoyu.com:3000 ipinfo.io
|
||
# # curl -x socks5://uniproxy-zone-custom-region:uniproxy@adv1.ipmoyu.com:3000 ipinfo.io
|