欧意API接口的常见配置方法
在数字货币交易领域,自动化交易和数据分析的重要性日益凸显。欧意(OKX)API接口作为连接交易平台与个人程序的桥梁,为用户提供了灵活且高效的交易方式。本文将深入探讨欧意API接口的常见配置方法,帮助开发者和交易者更好地利用这一工具。
1. 注册与实名认证
在开始使用欧易(OKX)API之前,您必须先在欧易交易所注册一个账户,并完成严格的实名认证流程。 实名认证(KYC,Know Your Customer)不仅是确保账户安全的关键措施,也是符合全球金融监管要求的基本义务。 根据欧易官方指南,您需要准备有效的身份证明文件,例如身份证、护照或驾驶执照,并按照平台指示上传清晰的扫描件或照片。 为了进一步验证您的身份,欧易可能会要求您进行实时的视频认证,在视频中展示您的身份证明文件并配合工作人员进行验证。 只有成功完成所有实名认证步骤后,您才有资格申请并启用欧易提供的API接口,以便进行程序化交易和数据访问。
2. 创建API Key
完成身份认证后,登录欧易(OKX)交易所账户,前往用户中心并找到“API管理”或类似名称的选项。点击“创建API Key”按钮,启动API Key的创建流程。在创建API Key时,需详细配置以下关键参数,这些参数直接影响API Key的功能和安全性:
- API Key 名称: 为API Key指定一个具有描述性的名称,以便于识别和管理。例如,“量化交易机器人”、“持仓监控”或“数据挖掘”。清晰的命名有助于区分不同的API Key及其用途。
- Passphrase: 设置一个高强度的Passphrase,用于加密API Key,增强安全性。Passphrase相当于API Key的密码,用于在发送API请求时生成签名。务必使用包含大小写字母、数字和特殊字符的复杂Passphrase,并安全存储。一旦丢失,将需要重新创建API Key。
- 权限设置: 欧易API提供精细化的权限控制,涵盖“交易权限”(包括现货交易、合约交易、杠杆交易等)、“只读权限”(仅能获取数据,不能进行任何交易操作)、“提现权限”(允许通过API发起提现请求)以及其他特定权限。根据实际应用场景精确选择所需权限至关重要。最小权限原则是保障资金安全的关键。例如,若仅需获取市场行情数据,则只需勾选“只读权限”,避免授予不必要的交易或提现权限。启用“合约交易”权限时,务必仔细了解相关风险。
- IP 限制: 实施IP地址访问控制是提高API Key安全性的有效手段。将允许访问API Key的IP地址加入白名单,拒绝来自未授权IP地址的访问请求。这可以有效防止未经授权的访问和潜在的安全威胁。建议定期审查和更新IP白名单,确保其与实际应用场景保持一致。企业用户可使用专线IP或固定出口IP,个人用户可绑定常用IP地址。
成功创建后,欧易交易所将生成API Key(公钥)和Secret Key(私钥)。API Key作为你的身份标识,在API请求中公开使用,而Secret Key则用于对API请求进行数字签名,验证请求的合法性。 务必采取极其严格的安全措施保管Secret Key,切勿以任何方式泄露给任何第三方。 一旦发现Secret Key泄露,应立即撤销该API Key并重新生成新的API Key,同时检查账户是否存在异常活动。建议定期轮换API Key,进一步提升安全性。 开启二次验证也能提升安全性。务必不要将API Key和Secret Key存储在不安全的地方,例如公共网盘、聊天记录或未加密的文本文件中。
3. API 请求签名
欧易(OKX)API 采用严格的签名机制,旨在验证每个 API 请求的真实性和完整性,确保只有经过授权的请求才能被处理。所有对欧易 API 的调用都必须使用与 API Key 配对的 Secret Key 进行签名,否则将被拒绝。这种机制有效防止了恶意用户伪造请求或篡改数据,保障了用户的资产安全和交易安全。
-
构造预签名字符串 (Pre-sign String):
严格按照 API 文档的参数要求,将所有必要的请求参数按照指定的顺序和格式拼接成一个字符串。这个字符串需要包含所有参与请求的参数,包括但不限于查询参数、POST 请求体(如果使用 POST 方法)以及其他特殊参数。参数的顺序至关重要,必须与 API 文档中明确规定的顺序完全一致。遗漏参数或参数顺序错误都会导致签名验证失败。
对于 POST 请求,请求体通常需要进行 JSON 序列化处理,确保其符合 API 的格式要求。序列化后的 JSON 字符串也必须按照特定的规则进行排序(例如按照键名进行字典排序),以保证每次生成的预签名字符串一致。
-
计算签名 (Signature Calculation):
使用 HMAC-SHA256 算法对预签名字符串进行哈希运算,生成最终的签名。HMAC-SHA256 是一种消息认证码算法,它使用 Secret Key 作为密钥,将预签名字符串作为输入,通过哈希运算生成固定长度的摘要,即签名。
计算签名时,通常需要结合 Passphrase (密码短语)、时间戳 (timestamp) 和预签名字符串。Passphrase 是一个可选的安全措施,可以进一步增强 API 密钥的安全性。时间戳用于防止重放攻击,确保请求的新鲜度。
几乎所有主流编程语言都提供了 HMAC-SHA256 算法的库或函数。开发者可以根据自己使用的编程语言选择合适的库来实现签名计算。
-
添加签名到请求头 (Adding Signature to Request Header):
将计算得到的签名以及其他必要的认证信息添加到 API 请求的 HTTP Header 中。欧易 API 要求在 Header 中包含以下关键字段:
-
OK-ACCESS-KEY
: 您的 API Key,用于标识您的账户。请务必妥善保管您的 API Key,避免泄露。 -
OK-ACCESS-SIGN
: 通过 HMAC-SHA256 算法计算得到的签名。这是验证请求合法性的关键。 -
OK-ACCESS-TIMESTAMP
: 发送请求时的时间戳,以 Unix 时间戳格式表示。用于防止重放攻击。 -
OK-ACCESS-PASSPHRASE
: 您的 Passphrase (如果已设置)。如果没有设置 Passphrase,则不需要添加此字段。
正确设置这些 Header 字段对于成功调用欧易 API 至关重要。请仔细检查每个字段的值,确保其与您的账户信息和签名计算结果一致。
-
时间戳在 API 安全中扮演着重要角色,主要用于抵御重放攻击。重放攻击是指攻击者截获合法的 API 请求,然后未经授权地重新发送该请求。为了防止此类攻击,欧易服务器会验证请求头中的
OK-ACCESS-TIMESTAMP
字段,检查时间戳是否在有效的时间窗口内。如果时间戳过旧,服务器将拒绝该请求,认为其可能是重放攻击。
4. 常见编程语言的API配置示例
以下是一些常见编程语言中使用欧易(OKX)API的配置示例,仅供参考。这些示例展示了如何进行身份验证、发起请求以及处理响应,但具体实现可能需要根据你的具体需求进行调整。
4.1 Python
Python 常用于快速开发和数据分析,其丰富的库使其成为与加密货币 API 交互的理想选择。
使用
requests
库进行API调用示例:
import requests
import
import hmac
import hashlib
import base64
from datetime import datetime
# API 密钥和私钥 (务必妥善保管)
API_KEY = "YOUR_API_KEY"
SECRET_KEY = "YOUR_SECRET_KEY"
PASSPHRASE = "YOUR_PASSPHRASE" # 如果设置了Passphrase,则需要提供
# API endpoint
BASE_URL = "https://www.okx.com" # 欧易API域名
API_ENDPOINT = "/api/v5/account/balance"
# 生成签名
def generate_signature(timestamp, method, request_path, body, secret_key):
message = str(timestamp) + method + request_path + body
mac = hmac.new(secret_key.encode("utf-8"), message.encode("utf-8"), hashlib.sha256)
d = mac.digest()
return base64.b64encode(d).decode()
# 设置请求头
timestamp = str(int(datetime.now().timestamp()))
method = "GET"
request_path = API_ENDPOINT
body = "" # GET 请求通常没有请求体
signature = generate_signature(timestamp, method, request_path, body, SECRET_KEY)
headers = {
"OK-ACCESS-KEY": API_KEY,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-TIMESTAMP": timestamp,
"OK-ACCESS-PASSPHRASE": PASSPHRASE, # 如果没有Passphrase,则删除此行
"Content-Type": "application/"
}
try:
response = requests.get(BASE_URL + API_ENDPOINT, headers=headers)
response.raise_for_status() # 检查HTTP错误
print(.dumps(response.(), indent=4)) # 格式化打印JSON响应
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
此示例演示了如何设置身份验证头部并发送简单的GET请求以获取账户余额。请注意替换占位符
YOUR_API_KEY
,
YOUR_SECRET_KEY
, 和
YOUR_PASSPHRASE
为你自己的实际凭据。务必安全地存储和管理你的 API 密钥和私钥。
4.2 JavaScript (Node.js)
JavaScript 在客户端和服务器端都得到了广泛的应用。Node.js 允许你使用 JavaScript 与 API 进行交互。
使用
node-fetch
库进行API调用示例:
const fetch = require('node-fetch');
const crypto = require('crypto');
// API 密钥和私钥 (务必妥善保管)
const API_KEY = "YOUR_API_KEY";
const SECRET_KEY = "YOUR_SECRET_KEY";
const PASSPHRASE = "YOUR_PASSPHRASE"; // 如果设置了Passphrase,则需要提供
// API endpoint
const BASE_URL = "https://www.okx.com"; // 欧易API域名
const API_ENDPOINT = "/api/v5/account/balance";
// 生成签名
function generateSignature(timestamp, method, request_path, body, secret_key) {
const message = timestamp + method + request_path + body;
const hmac = crypto.createHmac('sha256', secret_key);
hmac.update(message);
return hmac.digest('base64');
}
// 设置请求头
const timestamp = String(Math.floor(Date.now() / 1000));
const method = "GET";
const request_path = API_ENDPOINT;
const body = ""; // GET 请求通常没有请求体
const signature = generateSignature(timestamp, method, request_path, body, SECRET_KEY);
const headers = {
'OK-ACCESS-KEY': API_KEY,
'OK-ACCESS-SIGN': signature,
'OK-ACCESS-TIMESTAMP': timestamp,
'OK-ACCESS-PASSPHRASE': PASSPHRASE, // 如果没有Passphrase,则删除此行
'Content-Type': 'application/'
};
async function getAccountBalance() {
try {
const response = await fetch(BASE_URL + API_ENDPOINT, {
method: 'GET',
headers: headers
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.();
console.log(JSON.stringify(data, null, 2)); // 格式化打印JSON响应
} catch (error) {
console.error("发生错误:", error);
}
}
getAccountBalance();
该示例展示了如何使用
node-fetch
库发送 GET 请求并处理响应。同样,请替换示例代码中的占位符为你自己的 API 密钥和私钥,并确保安全地存储它们。
4.3 Java
Java 是一种健壮且广泛使用的语言,非常适合构建需要高可靠性和性能的应用程序。
使用 `HttpClient` 库进行 API 调用示例:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;
import java.util.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class OKXApiExample {
private static final String API_KEY = "YOUR_API_KEY";
private static final String SECRET_KEY = "YOUR_SECRET_KEY";
private static final String PASSPHRASE = "YOUR_PASSPHRASE"; // 如果设置了Passphrase,则需要提供
private static final String BASE_URL = "https://www.okx.com"; // 欧易API域名
private static final String API_ENDPOINT = "/api/v5/account/balance";
public static void main(String[] args) throws Exception {
String timestamp = String.valueOf(Instant.now().getEpochSecond());
String method = "GET";
String requestPath = API_ENDPOINT;
String body = ""; // GET 请求通常没有请求体
String signature = generateSignature(timestamp, method, requestPath, body, SECRET_KEY);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + API_ENDPOINT))
.header("OK-ACCESS-KEY", API_KEY)
.header("OK-ACCESS-SIGN", signature)
.header("OK-ACCESS-TIMESTAMP", timestamp)
.header("OK-ACCESS-PASSPHRASE", PASSPHRASE) // 如果没有Passphrase,则删除此行
.header("Content-Type", "application/")
.GET()
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status Code: " + response.statusCode());
System.out.println("Body: " + response.body());
}
public static String generateSignature(String timestamp, String method, String requestPath, String body, String secretKey) throws Exception {
String preHash = timestamp + method + requestPath + body;
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(preHash.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(rawHmac);
}
}
此 Java 示例使用 `HttpClient` 发送 GET 请求。记得替换占位符并安全存储密钥。
重要提示: 这些示例仅为起点。实际使用中,你需要处理错误、实现重试逻辑、并根据 API 文档的要求调整请求参数和数据格式。务必仔细阅读欧易 API 的官方文档以获取最准确和最新的信息。
Python:
import hashlib import hmac import time import requests import base64
APIKEY = 'YOURAPIKEY' SECRETKEY = 'YOURSECRETKEY' PASSPHRASE = 'YOURPASSPHRASE' BASEURL = 'https://www.okx.com' # 请替换为实际的API域名
def generatesignature(timestamp, method, requestpath, body=None): message = timestamp + method + requestpath + (body if body else '') mac = hmac.new(SECRETKEY.encode('utf-8'), message.encode('utf-8'), hashlib.sha256) d = mac.digest() return base64.b64encode(d).decode()
def sendrequest(method, endpoint, params=None, data=None): timestamp = str(int(time.time())) requestpath = endpoint if params: requestpath += '?' + '&'.join([f'{k}={v}' for k, v in params.items()]) url = BASEURL + endpoint body = None if not data else .dumps(data) signature = generatesignature(timestamp, method, requestpath, body)
headers = {
'OK-ACCESS-KEY': API_KEY,
'OK-ACCESS-SIGN': signature,
'OK-ACCESS-TIMESTAMP': timestamp,
'OK-ACCESS-PASSPHRASE': PASSPHRASE,
'Content-Type': 'application/'
}
try:
if method == 'GET':
response = requests.get(url, headers=headers, params=params)
elif method == 'POST':
response = requests.post(url, headers=headers, data=body, params=params)
else:
raise ValueError(f"Unsupported method: {method}")
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
return response.()
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
return None
JavaScript (Node.js): 使用 Axios 和 Crypto 模块访问 OKX API
此代码示例展示了如何使用 Node.js 中的
crypto
和
axios
模块与 OKX API 进行交互。
crypto
模块用于生成 API 请求所需的签名,
axios
是一个基于 Promise 的 HTTP 客户端,用于发送 HTTP 请求。
引入必要的模块:
const crypto = require('crypto');
const axios = require('axios');
接下来,定义 API 密钥、秘钥、密码和基础 URL。请务必将这些值替换为你自己的实际凭据。 强烈建议将API密钥等敏感信息存储在环境变量中,而不是硬编码在代码中。
const API_KEY = 'YOUR_API_KEY';
const SECRET_KEY = 'YOUR_SECRET_KEY';
const PASSPHRASE = 'YOUR_PASSPHRASE';
const BASE_URL = 'https://www.okx.com'; // 请替换为实际的API域名
generateSignature
函数用于生成 API 请求的数字签名。它接受时间戳、HTTP 方法、请求路径和请求体作为输入。它使用 HMAC-SHA256 算法和你的
SECRET_KEY
对消息进行哈希处理,然后将结果进行 Base64 编码。此签名用于验证请求的真实性和完整性。
function generateSignature(timestamp, method, requestPath, body) {
const message = timestamp + method + requestPath + (body || '');
const hmac = crypto.createHmac('sha256', SECRET_KEY);
hmac.update(message);
return hmac.digest('base64');
}
sendRequest
函数负责发送实际的 API 请求。它接受 HTTP 方法、API 端点、查询参数和请求体作为输入。 它构造完整的 URL,计算签名,设置必要的 HTTP 头部,并使用
axios
发送请求。如果请求成功,它将返回响应数据;如果请求失败,它将在控制台中记录错误信息并返回
null
。 为了更健壮的错误处理,建议抛出异常,或者返回包含错误信息的对象。
async function sendRequest(method, endpoint, params, data) {
const timestamp = String(Math.floor(Date.now() / 1000));
let requestPath = endpoint;
if (params) {
requestPath += '?' + Object.entries(params).map(([key, value]) => `${key}=${value}`).join('&');
}
const url = BASE_URL + endpoint;
const body = data ? JSON.stringify(data) : null;
const signature = generateSignature(timestamp, method, requestPath, body);
headers
对象包含了所有必须的头部信息。
OK-ACCESS-KEY
是你的 API 密钥,
OK-ACCESS-SIGN
是你生成的签名,
OK-ACCESS-TIMESTAMP
是请求的时间戳,
OK-ACCESS-PASSPHRASE
是你的密码。
Content-Type
被设置为
application/
,表明请求体是 JSON 格式的。
const headers = {
'OK-ACCESS-KEY': API_KEY,
'OK-ACCESS-SIGN': signature,
'OK-ACCESS-TIMESTAMP': timestamp,
'OK-ACCESS-PASSPHRASE': PASSPHRASE,
'Content-Type': 'application/'
};
try {
const response = await axios({
method: method,
url: url,
headers: headers,
params: params,
data: body
});
return response.data;
} catch (error) {
console.error('Request failed:', error.response ? error.response.data : error.message);
return null;
}
}
可以使用此函数与 OKX API 交互。 例如,你可以使用它来获取市场数据、下订单或管理你的账户。 请务必仔细阅读 OKX API 文档,了解可用的端点、参数和数据格式。 另外,也应该考虑使用更高级的库来处理身份验证、速率限制和错误处理。
5. 错误处理与API限制
在使用欧易OKX API接口进行加密货币交易或数据获取时,务必高度重视错误处理机制以及API的调用限制。欧易OKX API为了保障服务器稳定性和公平性,对API的调用频率设置了严格的限制,一旦超过这些限制,API服务器将返回特定的错误代码,指示请求已被拒绝。
开发者需要仔细阅读欧易OKX官方文档,了解不同API接口的频率限制规则,例如每分钟、每秒钟允许的最大请求次数。通常,更频繁使用的接口,例如实时行情查询,其频率限制会相对严格。未充分考虑频率限制可能导致程序频繁出错,无法稳定运行。
在代码层面,必须实现完善的错误处理逻辑。当API返回错误代码时,程序不应直接崩溃或停止运行,而是应该能够识别错误类型,并采取相应的应对措施。常见的处理方式包括:
-
延迟请求(Retry with Backoff):
如果遇到频率限制错误(
429
),最佳做法是暂停一段时间后重试。为了避免进一步加剧服务器压力,建议采用指数退避算法(Exponential Backoff),即每次重试的等待时间逐渐增加。例如,第一次延迟1秒,第二次延迟2秒,第三次延迟4秒,依此类推。 -
参数校验与错误报告:
对于参数错误(
400
),务必在发送请求之前进行充分的参数校验,确保参数类型、取值范围符合API的要求。如果校验发现错误,应该记录详细的错误日志,方便调试和排查问题。 -
身份验证检查:
当收到身份验证失败错误(
401
)时,需要检查API Key和Secret Key是否正确配置,是否已启用API交易权限,以及是否存在IP地址限制。 -
权限控制与授权:
遇到权限不足错误(
403
)时,需要确认API Key是否具备执行所需操作的权限。欧易OKX API提供多种权限级别,需要根据实际需求进行配置。 - 错误日志记录: 无论遇到何种错误,都应将详细的错误信息(包括错误代码、错误消息、请求参数等)记录到日志文件中,便于后续分析和优化。
常见的错误代码包括:
-
429
: 请求过于频繁,超过了API的频率限制。请实施延迟重试机制。 -
400
: 请求参数错误。例如,缺少必需的参数,参数格式不正确,参数值超出范围等。仔细检查请求的参数。 -
401
: 身份验证失败,API Key或Secret Key错误,或者API Key未激活。确保API Key和Secret Key正确无误,并且已经启用API交易权限。 -
403
: 权限不足。该API Key没有执行此操作的权限。检查API Key的权限设置。 -
418
: IP地址不在白名单中,或者未设置IP地址白名单。 -
500
: 服务器内部错误。通常是欧易OKX服务器端的问题,可以稍后重试。 -
503
: 服务不可用。服务器维护或升级中。稍后重试。
除了处理上述错误代码,还应该注意处理网络连接错误、超时错误等异常情况,确保程序的健壮性和可靠性。
6. 安全注意事项
- 妥善保管Secret Key和Passphrase: 切勿将Secret Key和Passphrase泄露给任何人。这两者是访问您账户的最高权限凭证,一旦泄露,您的资金将面临极大风险。请务必将其存储在安全的地方,例如离线硬件钱包或加密的密码管理器中。避免在任何不信任的网站或应用程序中输入您的Secret Key和Passphrase。请牢记,任何自称是欧意官方支持人员并索要您Secret Key和Passphrase的行为都是诈骗。
- 定期更换API Key: 为了提高安全性,强烈建议您定期更换API Key。API Key泄露会导致您的账户被恶意利用。建议至少每三个月更换一次API Key,并且在发现任何异常活动后立即更换。更换API Key的操作可以在欧意官方网站的API管理页面进行。
- 使用IP限制: 为了进一步提高安全性,强烈建议您限制允许访问API的IP地址。只允许您信任的服务器或IP地址访问您的API,可以有效防止未经授权的访问。在欧意API管理页面,您可以配置允许访问API的IP地址白名单。任何不在白名单中的IP地址都将被拒绝访问。
- 监控API使用情况: 密切监控API的使用情况,包括交易量、订单类型、访问频率等。及时发现异常行为,例如未经授权的交易或频繁的访问请求,可能表明您的API Key已被泄露或您的账户正在遭受攻击。欧意平台提供API使用情况的监控工具,您可以利用这些工具来监控您的API使用情况。如果发现任何异常,请立即禁用API Key并联系欧意官方支持。
- 了解欧意API的最新安全公告: 务必关注欧意官方的安全公告,及时了解最新的安全威胁和防范措施。欧意会定期发布安全公告,告知用户最新的安全漏洞和攻击手法。及时采取相应的安全措施,例如更新API客户端或修改API权限,可以有效降低您的账户风险。您可以通过欧意官方网站、社交媒体或邮件订阅来获取最新的安全公告。
7. 常用API接口示例
以下是一些常用的欧易(OKX)API接口示例,这些接口允许开发者访问交易数据、管理账户和执行交易操作。在使用这些接口之前,请确保已阅读并理解欧易的API文档,并已获得有效的API密钥。
-
获取账户余额:
/api/v5/account/balance
。 此接口用于查询账户中各种加密货币和法币的余额信息,包括可用余额、冻结余额和总余额。可以通过不同的参数筛选特定币种的余额。 -
下单:
/api/v5/trade/order
。 此接口允许用户提交买入或卖出订单,支持限价单、市价单等多种订单类型。需要指定交易对、订单方向、数量和价格等参数。 -
撤单:
/api/v5/trade/cancel-order
。 用于取消尚未成交的订单。需要提供订单ID才能取消特定订单。批量撤单功能可以提高撤单效率。 -
获取K线数据:
/api/v5/market/candles
。 获取指定交易对的历史K线数据,可以自定义K线周期,例如1分钟、5分钟、1小时、1天等。K线数据通常包含开盘价、最高价、最低价、收盘价和成交量。 -
获取ticker信息:
/api/v5/market/ticker
。 获取指定交易对的实时ticker信息,包括最新成交价、最高价、最低价、成交量、买一价和卖一价等。它是了解市场动态的重要接口。
请参考欧易(OKX)官方API文档( https://www.okx.com/docs-v5/en/ ) 获取完整的API列表、详细的参数说明、请求示例、响应格式和错误代码等信息。同时,请关注API更新日志,以便及时了解API的最新变化。