ホームページ >バックエンド開発 >Python チュートリアル >PythonでのAPI呼び出しの詳細な説明と例

PythonでのAPI呼び出しの詳細な説明と例

WBOY
WBOY転載
2022-06-16 12:03:195157ブラウズ

この記事では、python に関する関連知識を提供します。主に、API 呼び出しとデータ インターフェイス呼び出し、リクエスト メソッド、およびいくつかの API 呼び出しに関連する問題を紹介します。一般的な API 呼び出しの例といくつかを見てみましょう。もっと見る. 皆様のお役に立てれば幸いです。

PythonでのAPI呼び出しの詳細な説明と例

推奨学習: Python ビデオ チュートリアル

日々の業務では、インターネット上の現在の API のいくつかを組み合わせる必要がある場合があります。または、対応するデータを取得したり、対応する機能を実装したりするために会社のデータ インターフェイスによって提供されるもの。
したがって、API の呼び出しとデータ インターフェイスへのアクセスは、データ分析の一般的な操作です。API およびデータ インターフェイスへの呼び出しを迅速に実装するにはどうすればよいですか? 多くの言語バージョンは一般にオンラインで入手できますが、ソースを追跡する方法は HTTP リクエストを使用することです。それを達成するための方法。

API

API: 簡単に言えば、これは、異なるアプリケーション間の通信方法を定義する一連のプロトコル、ツール、または一連のルールであり、特定の実装プロセスを隠し、それのみを公開します。呼び出す必要がある部分は開発者が使用します。

上記の定義は比較的正式なものです。説明するための簡単な例を示します。たとえば、屋外のマクドナルドなどのファストフード レストランでは、現在携帯電話を使用してオンラインで注文し、フロント デスクで食事を受け取ることができます。このプロセスでは、消費者は通常、携帯電話で対応する食事を選択し、クリックして注文し、支払いを行った後、フロントデスクからその番号に電話して食事を受け取るのを待ちます。このプロセスがどのように実装されているかは正確にはわかっていませんが、プロセス全体には、キッチンのデータと通信する対応するアプリまたは小さなプログラムがあり、シェフが食事を準備します。このAPPとアプレットは、対応するAPI関数として機能します。

簡単な例を挙げると、ソーシャル プラットフォームには毎日さまざまな言語のコメントが寄せられますが、対応するアナリストとしては、複雑な言語データを扱うのは大きな問題です。翻訳統合機能を実現するということは、実現可能に思えますが、コストがかかるということと、一つの問題を解決するためには、より難しい問題を開発しなければならないということです。当初の目標からはどんどん遠ざかっていますが、現時点では比較的成熟した国内翻訳プラットフォームのAPIを利用して、既存のデータを直接処理することができます。これは比較的安価で便利で、既存の目標をすぐに達成できます。ここでの API の役割については疑いの余地がありません。

データ インターフェイス

データ インターフェイス: 簡単に言うと、カプセル化されたデータ セット パスワードのセットです。これは、対応するルールに従って対応するパラメーターを送信し、対応する関連データ情報を返すことを意味します。 API 呼び出しとデータ インターフェイスは日常的な呼び出しでは非常によく似ており、比較的言えば、API の範囲が広く、より多くの機能が実装されているのに対し、データ インターフェイスはデータ取得ツールとして機能します。

たとえば、大規模な電子商取引企業は、通常、統一された SKU を使用して製品を管理します。たとえば、この会社はブランド所有者として、さまざまなプラットフォームで販売することになりますが、これらのプラットフォームでは、マップされた製品 ID ID は、会社のSKU。同社の SKU は製品だけでなく、さまざまな地域の倉庫や製品のさまざまなモデルも考慮されており、このマッピングは比較的複雑であるためです。
異なるプラットフォーム上のデータを扱う人にとって、粒度が細かすぎて分析が複雑で難しいため、一般的に自社のデータベースを直接利用して製品を分析することはできないが、現時点では要件に応じた開発が可能である一部のシステムは、複雑なデータベースプロセスなどの対応する情報を直接要求することを避けるために、対応する企業に提供するために別のデータインターフェースを開発します。ただし、リアルタイム データベースと比較して、データ インターフェイスにはある程度の遅延があります。

API 呼び出しとデータ インターフェイス呼び出し

API とデータ インターフェイスについては、これまでの例で説明しましたが、大まかに理解するのは比較的簡単で、API 呼び出しとデータ インターフェイス呼び出しの実装方法はここで説明します。簡単な紹介。
API 呼び出しとインターフェイス呼び出しは、簡単に言うと HTTP リクエストに似ており、主に呼び出すのは、リクエスト メソッド、リクエスト ヘッダー、URL、リクエストボディを対応するルールに従ってカプセル化し、リクエストを送信することです。これは、それに応じて呼び出して達成できます。

ただし、一般的なデータ インターフェイスは、データ インターフェイスや API の呼び出しに比べて比較的シンプルです。多くの場合、データ インターフェイスは企業のイントラネット上のデータ アクセスに使用されるため、情報の要求は比較的簡単です。 API はほとんどが最初のものですが、サードパーティ企業によって開発された外部サービスは商用サービスであり、相対的に言えば、リクエストの安全性を確保するために、より包括的な考慮が行われ、AK、SK、署名、タイムスタンプが追加されます。その他の情報はさらに複雑です。
ソースをトレースする 2 つの呼び出しは HTTP リクエストに似ており、具体的な呼び出しもほぼ同じですが、主な理由は、API 呼び出しに含まれるリクエスト パラメーターの情報が多いためです。以下に具体的な実装方法を簡単に紹介します。

呼び出しの基礎 - リクエスト メソッド

一般的に、HTTP リクエストの呼び出しメソッドは多数あります。この分野に関するリソースは多数あります。オンラインで確認できます。ここでは簡単に説明します。一般的なものについて 2 つのリクエスト方法。

GET リクエスト

GET リクエストはサーバーからリソースを取得するだけで、ブラウザのキャッシュにロードできます。

POST リクエスト

POST リクエストは通常​​、フォームの形式でサーバーにリクエストを送信します。リクエスト本文に含まれるリクエスト パラメータにより、リソースの作成や変更が行われる場合があります。 。 POST リクエストからの情報はブラウザにキャッシュできません。
これら 2 つのリクエスト メソッドは言うのが非常に簡単ですが、最も重要な点は、インターフェイスの設計と API の使用法に慣れるために、これら 2 つのリクエストの違いを理解することです。

GET リクエストと POST リクエストの違い

1. GET リクエストの最大リクエスト長は 1024kb で、POST にはリクエスト データに制限がありません。その理由は、GET リクエストでは対応する情報が URL に組み込まれることが多く、URL の長さが制限されているため、GET リクエストの長さに一定の制限が生じるためです。 POST リクエストの対応するパラメータ情報はリクエスト本文に配置されるため、通常は長さの制限を受けません。
2. POST リクエストは GET よりも安全です。GET リクエストの URL には対応する情報が含まれており、ページはブラウザによってキャッシュされ、他の人は対応する情報を見ることができるからです。
3.GET は 1 つの TCP データ パケットを生成し、POST は 2 つの TCP データ パケットを生成します。
GET リクエストを行うと、ヘッダーとデータが一緒に送信され、サーバーは 200 で応答します。 POST は最初にヘッダーを送信し、サーバーが 100 で応答するのを待ち、次にデータを送信し、最後にサーバーが 200 で応答します。ただし、ここで注意してほしいのは、POST リクエストは 2 回に分かれていますが、リクエストボディはヘッダーの直後に送信されます。 、つまり、この間の時間は無視できるほどです。
4. GET リクエストは URL エンコードのみをサポートしますが、POST にはさまざまなエンコード方法があります。
5.GET リクエストのパラメータは URL 経由で渡され、複数のパラメータは & で接続され、POST リクエストはリクエストボディに配置されます。
6.GET リクエストは ASCII 文字のみをサポートしますが、POST には制限がありません。
一般的に、GET リクエストにはブラウザに URL を入力することで直接アクセスできます。

Python は GET リクエストと POST リクエストを実装します

上記では、いくつかのデータ インターフェイス、API 関連の知識、およびリクエスト メソッドを大量のスペースで紹介しました。使い方は簡単で、次のように要約できます。対応するリクエスト メソッドについてよく理解してください。通常、Python のリクエスト ライブラリを直接使用できます。

GET request
import request
# GET请求发送的参数一定要是字典的形式,可以发送多个参数。
# 发送格式:{'key1':value1', 'key2':'value2', 'key3', 'value3'}
# 样例不能运行
url ='http://www.xxxxx.com'
params = {'user':'lixue','password':111112333}
requests.get(url,data = parms)
POST request

POST リクエストには通常、application/x-www-form の 3 つの送信フォームがあります。 -urlencoded、multipart/form-data、application/json.
3 つのリクエスト メソッドのどれであるかを具体的に確認します: Google Chrome Check → Network → ファイルのロードを選択 → Headers → Reuqest Headers → Content-Type
具体的なエンコード方法は以下の3つで、具体的なリクエスト実装を理解することができますが、一般的に企業内部のデータインターフェースはローカルエリアネットワークで構築されているため、ヘッダーを追加する必要がないものもあります。

POST リクエストの 3 つの送信フォーム

1. 最も一般的な投稿送信データは、主にフォーム フォームです: application/x-www-form-urlencoded

import request
data={'k1':'v1','k2':'v2'}
headers= {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
requests.post(url,headers = headers,data=data)

2. json 形式でデータを送信します: application/json

data = {'user':'lixue','password':12233}
data_json = json.dumps(params)
requests.post(url,headers = headers,data = data_json)

3. 通常、ファイルの転送に使用されます (クローラーによってまれに使用されます): multipart/form-data

files = {'files':open('c://xxx.txt','rb')}
requests.post(url = url,headers = headers,files = files)

単純な API リクエストの例

上記の簡単な紹介を通じて、特定のリクエストについて一般的に理解することができます。ここでは、多くの便利な機能を提供する単純な API アグリゲーション センターを示します。以下では、この単純な API を単純なデモンストレーション API アドレスとして使用します。
この小さな例では、天気 API インターフェイスを使用して、過去 15 日間の天気を取得します。この API を使用する前に、必ず対応する apiKey を取得し、特定の使用法ドキュメントを確認してください。この API Web サイトは通常、学習に使用できる対応する API に一定の無料時間を提供し、GET リクエストと POST リクエストをサポートします。練習するのにちょうどいい。

GET request
params = {
    "apiKey":'换成你的apikey',
    "area":'武汉市',
}
url = 'https://api.apishop.net/common/weather/get15DaysWeatherByArea'
response = requests.get(url,params)
print(response.text)
POST request

ここでの POST リクエストは、主に次の形式のフォームで、上記の最も一般的な投稿送信データに対応します: application/x-www-form -urlencoded

url = 'https://api.apishop.net/common/weather/get15DaysWeatherByArea'
params = {
    "apiKey":'换成你的apikey',
    "area":'武汉市武昌区',
}
response = requests.post(url,params)
print(response.text)

この API インターフェースを呼び出す場合、通常、リクエストが正常であるかどうかを確認するためにステータス コードやその他の戻り情報のテストを実行する必要があります。

params = {
    "apiKey":'换成你的apikey,
    "area":'武汉市',
}
url = 'https://api.apishop.net/common/weather/get15DaysWeatherByArea'
response = requests.post(url,params)
print(response.text)
if response.status_code != 200:
    raise ConnectionError(f'{url} status code is {response.status_code}.')
response = json.loads(response.content)
if 'desc' not in response.keys():
    raise ValueError(f'{url} miss key msg.')
if response['desc'] != '请求成功':
    print(11)
データ抽出

実際、API 呼び出しは非常に単純ですが、実際にはその中心となるのは、返された情報からデータを抽出することです。一般に、返された情報は json 形式です。フォームから使用する必要があります。データは辞書のキーと値のペアを使用して抽出されます。次のブロックは、要求されたデータに基づいて対応する情報を返し、それを抽出します。取得された情報は後で示します。

import requestsimport pandas as pd 
import numpy as npimport jsondef get_url(area):
    url = 'https://api.apishop.net/common/weather/get15DaysWeatherByArea'
    params = {
        "apiKey":'换成你的apikey',
        "area":area,
    }
    response = requests.get(url,params)
    if response.status_code != 200:
        raise ConnectionError(f'{url} status code is {response.status_code}.')
    response = json.loads(response.content)
    if 'desc' not in response.keys():
        raise ValueError(f'{url} miss key msg.')
    if response['desc'] != '请求成功':
        print(11)
    return responsedef  extract_data(web_data):
    data= web_data['result']['dayList']
    weather_data = pd.DataFrame(columns = ['city','daytime','day_weather','day_air_temperature','day_wind_direction','day_wind_power',                                           'night_weather','night_air_temperature','night_wind_direction','night_wind_power'])
    for i in range(len(data)):
        city = data[i]["area"]
        daytime = data[i]["daytime"]
        daytime = daytime[:4]+'-'+daytime[4:6]+'-'+daytime[-2:]
        day_weather = data[i]["day_weather"]
        day_air_temperature = data[i]['day_air_temperature']
        day_wind_direction = data[i]["day_wind_direction"]
        day_wind_power = data[i]['day_wind_power']
        night_weather = data[i]['night_weather']
        night_air_temperature = data[i]["night_air_temperature"]
        night_wind_direction = data[i]['night_wind_direction']
        night_wind_power = data[i]["night_wind_power"]
        c = {"city": city,"daytime": daytime,"day_weather":day_weather,"day_air_temperature":day_air_temperature,
             "day_wind_direction":day_wind_direction,"day_wind_power":day_wind_power,"night_weather":night_weather,
             "night_air_temperature":night_air_temperature,"night_wind_direction":night_wind_direction,
             "night_wind_power":night_wind_power}
        weather_data = weather_data.append(c,ignore_index = True)
    weather_data.to_excel(r"C:\Users\zhangfeng\Desktop\最近十五天天气.xlsx",index = None)
    return weather_dataif __name__ == '__main__':
    print("请输入对应的城市")
    web_data = get_url(input())
    weather_data = extract_data(web_data)

結果の一部は次のとおりです。
PythonでのAPI呼び出しの詳細な説明と例

データ インターフェイスの例

日常の学習において、データ インターフェイスを使用することは比較的まれかもしれません。ほとんどの場合、このシナリオは社内のデータを取得するために使用されるため、あまり見られません。ここでは、仕事で遭遇する 2 つのデータ インターフェイスの使用方法を示します。作業上の考慮事項により、示されているコードはサンプルです。と呼ばれた。呼び出し元の実装や仕様を参照できます。

POST请求调用数据接口
# 销售状态查询def id_status(id_dir):
    id_data = pd.read_excel(id_dir,sheet_name="Sheet1") 
    id_data.columns = ['shop', 'Campaign Name','Ad Group Name','Item Id']  # 方便后期处理更改列名
    id_data["Item Id"] = id_data["Item Id"].astype(str)
    id_list = list(id_data['Item Id'])
    print(len(id_list))
    id_list = ','.join(id_list)
    if isinstance(id_list, int):
        id_list = str(id_list)
    id1 = id_list.strip().replace(',', ',').replace(' ', '')
    request_url = "http://xxx.com"
    # 通过item_id查询id状态
    params = {
        "item_id":id1,
    }
    data_json = json.dumps(params) # 属于POST第二种请求方式
    response = requests.post(request_url, data = data_json)
    print(response.text)
    if response.status_code != 200:
        raise ConnectionError(f'{request_url} status code is {response.status_code}.')
    response = json.loads(response.content)
    if 'message' not in response.keys():
        raise ValueError(f'{request_url} miss key msg.')
    if response['message'] != 'ok':
        print(11)
    data= response['result']
    ad_data = pd.DataFrame(columns = ['Item Id','saleStatusName'])
    for j in range(len(data)):
        item_id =data[j]["item_id"]
        saleStatusName = data[j]['saleStatusName']
        c = {"Item Id": item_id,
         "saleStatusName": saleStatusName,
         }
        ad_data = ad_data.append(c,ignore_index = True)
    total_data = pd.merge(ad_data,id_data,on ='Item Id', how ='left')
    df_column =  ['shop', 'Campaign Name','Ad Group Name','Item Id','saleStatusName']
    total_data = total_data.reindex(columns=df_column)
    return total_data
GET请求调用数据接口
### 库存数据查询def Smart_investment_treasure(investment_dir):
    product_data = pd.read_excel(investment_dir,sheet_name="product")
    if len(product_data)>0:
        product_data['商品ID']=product_data['商品ID'].astype(str)
        product_list=list(product_data['商品ID'])
        product_id = ','.join(product_list)
    else:
        product_id='没有数据' 
    return product_id    
def stock_query(investment_dir):
        product_data = pd.read_excel(investment_dir,sheet_name="product")
    if len(product_data)>0:
        product_data['商品ID']=product_data['商品ID'].astype(str)
        product_list=list(product_data['商品ID'])
        product_id = ','.join(product_list)
    else:
        product_id='没有数据' 
    if isinstance(product_id, int):
        product_id = str(id)
    product_id = product_id.strip().replace(',', ',').replace(' ', '')
    request_url = "http://xxx.com"
    # 通过ali_sku查询erpsku
    params = {
        "product_id":product_id,
    }
    
    response = requests.get(request_url, params) #属于GET请求
    if response.status_code != 200:
        raise ConnectionError(f'{request_url} status code is {response.status_code}.')
    response = json.loads(response.content)
    if 'msg' not in response.keys():
        raise ValueError(f'{request_url} miss key msg.')
    if response['msg'] != 'success':
        print(11)
    data= response['data']['data']
    # requestProductId = id.split(',')
    id_state=[]
    overseas_stock=[]
    china_stock=[]
    id_list=[]
    for j in range(len(data)):
        inventory_data= data[j]['list']
        overseas_inventory=0
        ep_sku_list=[]
        sea_test=0
        china_inventory=0
        test="paused"
        id_test=""
        id_test=data[j]['product_id']
        for i in range(len(inventory_data)):
            if inventory_data[i]["simple_code"] in ["FR","DE","PL","CZ","RU"] and inventory_data[i]["erp_sku"] not in ep_sku_list:
                overseas_inventory+=inventory_data[i]["ipm_sku_stock"]
                ep_sku_list.append(inventory_data[i]["erp_sku"])
                sea_test=1
            elif inventory_data[i]["simple_code"] == 'CN':
                china_inventory+=int(inventory_data[i]["ipm_sku_stock"])
        if overseas_inventory>30:
            test="open"
        elif overseas_inventory==0 and china_inventory>100:
            test="open"
        id_list.append(id_test)
        overseas_stock.append(overseas_inventory)
        china_stock.append(china_inventory)           
        id_state.append(test)
    c={"id":id_list,
       "id_state":id_state,
       "海外仓库存":overseas_stock,
       "国内大仓":china_stock       }
    ad_data=pd.DataFrame(c)
    return ad_data

几种常见API调用实例

百度AI相关API

百度API是市面上面比较成熟的API服务,在大二期间由于需要使用一些文本打标签和图像标注工作了解了百度API,避免了重复造轮子,当时百度API的使用比较复杂,参考文档很多不规范,之前也写过类似的百度API调用极其不稳定,但最近查阅了百度API参考文档,发现目前的调用非常简单。
通过安装百度开发的API第三方包,直接利用Python调包传参即可使用非常简单。这里展示一个具体使用,相应安装第三方库官方文档查阅。

'''
第三方包名称:baidu-aip 
百度API 
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
参考文档:https://ai.baidu.com/ai-doc/NLP/tk6z52b9z
'''
from aip import AipNlp
APP_ID = 'xxxxxx'
API_KEY = '换成你的apikey'
SECRET_KEY = '换成你的SECRET_KEY'
client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
text = "我还没饭吃"
# 调用文本纠错 
client.ecnet(text)

PythonでのAPI呼び出しの詳細な説明と例

百度地图API

这个API当时为了设计一个推荐体系引入经纬度换算地址,这样为数据计算带来极大的方便,而且对于一般人来说文本地址相比经纬度信息更加直观,然后结合Python一个第三方包实现两个地址之间经纬度计算得出相对的距离。

# https://lbsyun.baidu.com/
# 计算校验SN(百度API文档说明需要此步骤)
import pandas as pd
import numpy as np
import warnings
import requests
import urllib
import hashlib
import json
from geopy.distance import geodesic
location = input("输入所在的位置\n")  # "广州市天河区"
ak = "ak1111" # 参照自己的应用
sk = "sk111111" # 参照自己的应用
url = "http://api.map.baidu.com"
query = "/geocoding/v3/?address={0}&output=json&ak={1}&callback=showLocation".format(location, ak)
encodedStr = urllib.parse.quote(query, safe="/:=&?#+!$,;'@()*[]")
sn = hashlib.md5(urllib.parse.quote_plus(encodedStr + sk).encode()).hexdigest()
# 使用requests获取返回的json
response = requests.get("{0}{1}&sn={2}".format(url, query, sn))
data1=response.text.replace("showLocation&&showLocation(","").replace(")","")
data = json.loads(data1)
print(data)
lat = data["result"]["location"]["lat"]
lon = data["result"]["location"]["lng"]
print("纬度: ", lat, " 经度: ", lon)
distance=geodesic((lat,lon), (39.98028,116.30495))
print("距离{0}这个位置大概{1}".format(location, distance))

PythonでのAPI呼び出しの詳細な説明と例

有道API

在网上查阅了很多API,前面介绍的几种API,他们携带的请求参数信息相对比较简单,调用实现和基础请求没啥区别,这里找了一个相对而言比较多的请求参数的API,相对而言这种API数据付费API,它的安全性以及具体的实现都相对复杂,但是更适合商用。下面可以简单看看。

import requests
import time
import hashlib
import uuid
youdao_url = 'https://openapi.youdao.com/api'   # 有道api地址
translate_text = "how are you!"
input_text = ""
# 当文本长度小于等于20时,取文本
if(len(translate_text)  20):
    input_text = translate_text[:10] + str(len(translate_text)) + translate_text[-10:]

uu_id = uuid.uuid1()
now_time = int(time.time())
app_id = '1111111'
app_key = '11111111111'
sign = hashlib.sha256((app_id + input_text + str(uu_id) + str(now_time) + app_key).encode('utf-8')).hexdigest()   # sign生成
data = {
    'q':translate_text,   # 翻译文本
    'from':"en",   # 源语言
    'to':"zh-CHS",   # 翻译语言
    'appKey':app_id,   # 应用id
    'salt':uu_id,   # 随机生产的uuid码
    'sign':sign,   # 签名
    'signType':"v3",   # 签名类型,固定值
    'curtime':now_time,   # 秒级时间戳
}
r = requests.get(youdao_url, params = data).json()   # 获取返回的json()内容
print("翻译后的结果:" + r["translation"][0])   # 获取翻译内容

翻译后的结果:你好!
这个API调用中引用了几个真正商用中的一些为了安全性等设置的验证信息,比如uuid、sign、timestamp,这几个在API调用中也是老生常谈的几个概念,是比较全面的。下面简单介绍一下。

uuid

uuid码:UUID是一个128比特的数值,这个数值可以通过一定的算法计算出来。为了提高效率,常用的UUID可缩短至16位。UUID用来识别属性类型,在所有空间和时间上被视为唯一的标识。一般来说,可以保证这个值是真正唯一的任何地方产生的任意一个UUID都不会有相同的值。使用UUID的一个好处是可以为新的服务创建新的标识符。是一种独特的唯一标识符,python 第三方库uuid 提供对应的uuid生成方式,有以下的几种 uuid1(),uuid3(),uuid4(),uuid5()上面采用的是uuid1()生成,还可以使用uuid4()生成。

sign

sign:一般为了防止被恶意抓包,通过数字签名等保证API接口的安全性。为了防止发送的信息被串改,发送方通过将一些字段要素按一定的规则排序后,在转化成密钥,通过加密机制发送,当接收方接受到请求后需要验证该信息是否被篡改过,也需要将对应的字段按照同样的规则生成验签sign,然后在于后台接收到的进行比对,可以发现信息是否被串改过。在上面的例子利用hashlib.sha256()来进行随机产生一段密钥,最后使用.hexdigest()返回最终的密钥。
curtime:引入一个时间戳参数,保证接口仅在一分钟内有效,需要和客户端时间保持一致。避免重复访问。

推荐学习:python视频教程

以上がPythonでのAPI呼び出しの詳細な説明と例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。