自定義模板文字識別服務(wù)簡介
說明
Hi,您好,歡迎使用有道智云自定義模版文字識別 API 接口服務(wù)。
本文檔主要針對需要集成 API 的技術(shù)開發(fā)工程師,詳細描述自定義模版文字識別能力相關(guān)的技術(shù)內(nèi)容。
如果您有與我們商務(wù)合作的需求,可以通過以下方式聯(lián)系我們:
商務(wù)郵箱: AIcloud_Business@corp.youdao.com
如果您對文檔內(nèi)容有任何疑問,可以通過以下幾種方式聯(lián)系我們:
客服 QQ:1906538062
智云 OCR 技術(shù)交流 QQ 1 群: 654064748
智云 OCR 技術(shù)交流 QQ 2 群: 471638046
聯(lián)系郵箱: zhiyun@corp.youdao.com
溫馨提示:
本文檔主要針對開發(fā)人員,接入測試前需要獲取應(yīng)用ID
和應(yīng)用密鑰
;如果您還沒有,請按照 新手指南 操作。
平臺向每個賬戶贈送 50 元的體驗金,供用戶集成前測試所用,具體資費規(guī)則詳見 自定義模版文字服務(wù)報價 。
接口說明
自定義模板文字識別 API HTTPS 地址:
https://openapi.youdao.com/iocr
協(xié)議須知
調(diào)用方在集成自定義模板文字識別 API 時,請遵循以下規(guī)則。
規(guī)則 |
描述 |
傳輸方式 |
HTTPS |
請求方式 |
POST |
字符編碼 |
統(tǒng)一使用 UTF-8 編碼 |
請求格式 |
表單 |
響應(yīng)格式 |
JSON |
接口調(diào)用參數(shù)
調(diào)用 API 需要向接口發(fā)送以下字段來訪問服務(wù)。
字段名 |
類型 |
含義 |
必填 |
備注 |
q |
text |
待識別圖像 Base64 |
True |
必須是 Base64 編碼 |
templateId |
text |
模版 Id |
false |
模版 Id。當generalOcr為true時,該字段可以為空 |
format |
text |
圖片類型填寫'img',pdf填寫'pdf' |
False |
默認img |
appKey |
text |
應(yīng)用 ID |
True |
可在 應(yīng)用管理 查看 |
salt |
text |
UUID,和 curtime 一起防請求重放 |
True |
uuid,唯一通用識別碼 |
signType |
text |
簽名類型 |
True |
v3 |
curtime |
text |
當前 UTC 時間戳(秒) |
True |
TimeStamp |
sign |
text |
簽名 |
True |
sha256(應(yīng)用 ID+input+salt+curtime+應(yīng)用密鑰) |
generalOcr |
text |
是否包含通用OCR結(jié)果 |
false |
默認false。如果為true,結(jié)果中會包含通用OCR結(jié)果 |
簽名生成方法如下:
signType=v3;
sign=sha256(應(yīng)用ID
+input
+salt
+curtime
+應(yīng)用密鑰
)。
其中,input 的計算方式為:input
=q前10個字符
+ q長度
+ q后10個字符
(當 q 長度大于 20)或 input
=q字符串
(當 q 長度小于等于 20)。
如果對簽名有疑問,可以參看文檔末尾各語言 demo。
輸出結(jié)果
返回的結(jié)果是 json 格式,具體說明如下
字段名 |
類型 |
字段說明 |
errorCode |
text |
錯誤碼,一定存在 |
Result |
text |
識別結(jié)果,查詢成功一定存在 |
+template_id |
text |
模版Id |
+items |
JSONObject |
字段名稱及識別結(jié)果 |
++識別區(qū)域信息 |
text |
識別內(nèi)容,識別成功一定存在 |
示例
識別的返回結(jié)果:
{
"errorCode": "0",
"Result": {
"template_id": "模版Id",
"items": [
{
"key": "字段名稱",
"value": "字段值",
"locations": ["坐標信息"] // 如果有多區(qū)域同名,坐標會有多行,對應(yīng)多個區(qū)域的坐標
},
]
"ocrResult": {
// 通用OCR結(jié)果
}
}
}
支持語言
語言代碼 |
語言 |
sq |
阿爾巴尼亞語 |
az |
阿塞拜疆語 |
eu |
巴斯克語 |
be |
白俄羅斯語 |
bs |
波斯尼亞文(拉丁文) |
bg |
保加利亞文 |
ca |
加泰羅尼亞文(加泰隆語) |
ceb |
宿務(wù)語 |
ny |
齊切瓦語 |
zh-CHS |
中文 |
zh-CHT |
中文(繁體) |
co |
科西嘉語 |
hr |
克羅地亞文 |
cs |
捷克文 |
da |
丹麥文 |
nl |
荷蘭文 |
en |
英文 |
eo |
世界語 |
et |
愛沙尼亞文 |
fi |
芬蘭文 |
fr |
法文 |
gd |
蘇格蘭蓋爾語 |
gl |
加利西亞語 |
de |
德文 |
ht |
海地文 |
ha |
豪薩語 |
haw |
夏威夷語 |
hi |
印地文 |
hu |
匈牙利文 |
is |
冰島語 |
ig |
伊博語 |
id |
印度尼西亞文 |
ga |
愛爾蘭語 |
it |
意大利文 |
ja |
日文 |
jw |
印尼爪哇語 |
ko |
韓文 |
ku |
庫爾德語 |
la |
拉丁語 |
lv |
拉脫維亞文 |
lt |
立陶宛文 |
lb |
盧森堡語 |
mk |
馬其頓語 |
mg |
馬爾加什語 |
ms |
馬來文 |
mt |
馬耳他文 |
mi |
毛利語 |
mr |
馬拉地語 |
mn |
蒙古語 |
ne |
尼泊爾語 |
no |
挪威文 |
pl |
波蘭文 |
pt |
葡萄牙文 |
ro |
羅馬尼亞文 |
ru |
俄文 |
sm |
薩摩亞語 |
sr-Latn |
塞爾維亞文(拉丁文) |
sn |
修納語 |
sk |
斯洛伐克文 |
sl |
斯洛文尼亞文 |
so |
索馬里語 |
st |
塞索托語 |
es |
西班牙文 |
su |
印尼巽他語 |
sw |
斯瓦希里文 |
sv |
瑞典文 |
tl |
菲律賓語 |
tg |
塔吉克語 |
tr |
土耳其文 |
uk |
烏克蘭文 |
uz |
烏茲別克語 |
vi |
越南文 |
cy |
威爾士文 |
fy |
弗里斯蘭語 |
yo |
約魯巴語 |
zu |
南非祖魯語 |
hmn |
苗族語 |
xh |
班圖 |
af |
南非荷蘭 |
服務(wù)配置
支持圖片格式 |
圖片大小 |
每小時最大查詢次數(shù) |
jpg\png\bmp |
4M內(nèi)(編碼后) |
3600 |
錯誤代碼列表
錯誤碼 |
含義 |
101 |
缺少必填的參數(shù),首先確保必填參數(shù)齊全,然后,確認參數(shù)書寫是否正確。 |
102 |
不支持的語言類型 |
103 |
翻譯文本過長 |
104 |
不支持的 API 類型 |
105 |
不支持的簽名類型 |
106 |
不支持的響應(yīng)類型 |
107 |
不支持的傳輸加密類型 |
108 |
應(yīng)用 ID 無效,注冊賬號,登錄后臺創(chuàng)建應(yīng)用和實例并完成綁定,可獲得應(yīng)用 ID 和應(yīng)用密鑰等信息 |
109 |
batchLog 格式不正確 |
110 |
無相關(guān)服務(wù)的有效實例,應(yīng)用沒有綁定服務(wù)實例,可以新建服務(wù)實例,綁定服務(wù)實例。注:某些服務(wù)的結(jié)果發(fā)音需要 tts 實例,需要在控制臺創(chuàng)建語音合成實例綁定應(yīng)用后方能使用。 |
111 |
開發(fā)者賬號無效 |
112 |
請求服務(wù)無效 |
113 |
img 不能為空 |
114 |
不支持的圖片傳輸方式 |
201 |
解密失敗,可能為 DES,BASE64,URLDecode 的錯誤 |
202 |
簽名檢驗失敗,如果確認應(yīng)用 ID 和應(yīng)用密鑰的正確性,仍返回 202,一般是編碼問題。請確保翻譯文本 q 為 UTF-8 編碼. |
203 |
訪問 IP 地址不在可訪問 IP 列表 |
205 |
請求的接口與應(yīng)用的平臺類型不一致,,確保接入方式(Android SDK、IOS SDK、API)與創(chuàng)建的應(yīng)用平臺類型一致。如有疑問請參考入門指南 |
206 |
因為時間戳無效導(dǎo)致簽名校驗失敗 |
207 |
重放請求 |
301 |
辭典查詢失敗 |
302 |
翻譯查詢失敗 |
303 |
服務(wù)端的其它異常 |
304 |
會話閑置太久超時 |
401 |
賬戶已經(jīng)欠費停 |
402 |
offlinesdk 不可用 |
411 |
訪問頻率受限,請稍后訪問 |
412 |
長請求過于頻繁,請稍后訪問 |
1001 |
無效的 OCR 類型 |
1002 |
不支持的 OCR image 類型 |
1003 |
不支持的 OCR Language 類型 |
1004 |
識別圖片過大 |
1201 |
圖片 base64 解密失敗 |
1301 |
OCR 段落識別失敗 |
1411 |
訪問頻率受限 |
1412 |
超過最大識別字節(jié)數(shù) |
2003 |
不支持的語言識別 Language 類型 |
2004 |
合成字符過長 |
2005 |
不支持的音頻文件類型 |
2006 |
不支持的發(fā)音類型 |
2201 |
解密失敗 |
2301 |
服務(wù)的異常 |
2411 |
訪問頻率受限,請稍后訪問 |
2412 |
超過最大請求字符數(shù) |
3001 |
不支持的語音格式 |
3002 |
不支持的語音采樣率 |
3003 |
不支持的語音聲道 |
3004 |
不支持的語音上傳類型 |
3005 |
不支持的語言類型 |
3006 |
不支持的識別類型 |
3007 |
識別音頻文件過大 |
3008 |
識別音頻時長過長 |
3009 |
不支持的音頻文件類型 |
3010 |
不支持的發(fā)音類型 |
3201 |
解密失敗 |
3301 |
語音識別失敗 |
3302 |
語音翻譯失敗 |
3303 |
服務(wù)的異常 |
3411 |
訪問頻率受限,請稍后訪問 |
3412 |
超過最大請求字符數(shù) |
4001 |
不支持的語音識別格式 |
4002 |
不支持的語音識別采樣率 |
4003 |
不支持的語音識別聲道 |
4004 |
不支持的語音上傳類型 |
4005 |
不支持的語言類型 |
4006 |
識別音頻文件過大 |
4007 |
識別音頻時長過長 |
4201 |
解密失敗 |
4301 |
語音識別失敗 |
4303 |
服務(wù)的異常 |
4411 |
訪問頻率受限,請稍后訪問 |
4412 |
超過最大請求時長 |
5001 |
無效的 OCR 類型 |
5002 |
不支持的 OCR image 類型 |
5003 |
不支持的語言類型 |
5004 |
識別圖片過大 |
5005 |
不支持的圖片類型 |
5006 |
文件為空 |
5201 |
解密錯誤,圖片 base64 解密失敗 |
5301 |
OCR 段落識別失敗 |
5411 |
訪問頻率受限 |
5412 |
超過最大識別流量 |
9001 |
不支持的語音格式 |
9002 |
不支持的語音采樣率 |
9003 |
不支持的語音聲道 |
9004 |
不支持的語音上傳類型 |
9005 |
不支持的語音識別 Language 類型 |
9301 |
ASR 識別失敗 |
9303 |
服務(wù)器內(nèi)部錯誤 |
9411 |
訪問頻率受限(超過最大調(diào)用次數(shù)) |
9412 |
超過最大處理語音長度 |
10001 |
無效的 OCR 類型 |
10002 |
不支持的 OCR image 類型 |
10004 |
識別圖片過大 |
10201 |
圖片 base64 解密失敗 |
10301 |
OCR 段落識別失敗 |
10411 |
訪問頻率受限 |
10412 |
超過最大識別流量 |
11001 |
不支持的語音識別格式 |
11002 |
不支持的語音識別采樣率 |
11003 |
不支持的語音識別聲道 |
11004 |
不支持的語音上傳類型 |
11005 |
不支持的語言類型 |
11006 |
識別音頻文件過大 |
11007 |
識別音頻時長過長,最大支持 30s |
11201 |
解密失敗 |
11301 |
語音識別失敗 |
11303 |
服務(wù)的異常 |
11411 |
訪問頻率受限,請稍后訪問 |
11412 |
超過最大請求時長 |
12001 |
圖片尺寸過大 |
12002 |
圖片 base64 解密失敗 |
12003 |
引擎服務(wù)器返回錯誤 |
12004 |
圖片為空 |
12005 |
不支持的識別圖片類型 |
12006 |
圖片無匹配結(jié)果 |
13001 |
不支持的角度類型 |
13002 |
不支持的文件類型 |
13003 |
表格識別圖片過大 |
13004 |
文件為空 |
13301 |
表格識別失敗 |
15001 |
需要圖片 |
15002 |
圖片過大(1M) |
15003 |
服務(wù)調(diào)用失敗 |
17001 |
需要圖片 |
17002 |
圖片過大(3M) |
17003 |
識別類型未找到 |
17004 |
不支持的識別類型 |
17005 |
服務(wù)調(diào)用失敗 |
28102 |
不支持的 image 類型 |
28104 |
識別圖片過大, 圖片大小上限 4M |
28200 |
模版不存在, 請檢查模版 Id 是否正確 |
28201 |
模版未發(fā)布, 請在模版詳情頁面發(fā)布模版 |
28202 |
模版已失效 |
28203 |
模版用戶不匹配 |
28204 |
不支持的模板使用方式 |
28205 |
模版創(chuàng)建失敗 |
28206 |
文字識別失敗 |
28207 |
不支持的generalOcr參數(shù) |
28208 |
模版Id不可為空 |
28301 |
請求失敗 |
28302 |
文件過大 |
28303 |
無此流水號 |
28304 |
不支持的后綴名 |
28400 |
字段格式名稱已存在 |
28401 |
字段格式操作失敗 |
28402 |
無此字段格式編號 |
28403 |
字段格式編號重復(fù) |
28404 |
字段用戶不匹配 |
常用語言 Demo
Java 示例
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class IOcrV3Demo {
private static Logger logger = LoggerFactory.getLogger(OcrV3Demo.class);
private static final String YOUDAO_URL = "https://openapi.youdao.com/iocr";
private static final String APP_KEY = "您的應(yīng)用ID";
private static final String APP_SECRET = "您的應(yīng)用密鑰";
public static void main(String[] args) throws IOException {
Map<String,String> params = new HashMap<String,String>();
String q = loadAsBase64("圖片的路徑");
String salt = String.valueOf(System.currentTimeMillis());
params.put("q", q);
params.put("templateId", 模版Id);
params.put("signType", "v3");
String curtime = String.valueOf(System.currentTimeMillis() / 1000);
params.put("curtime", curtime);
String signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET;
String sign = getDigest(signStr);
params.put("appKey", APP_KEY);
params.put("salt", salt);
params.put("sign", sign);
String result = requestForHttp(YOUDAO_URL,params);
/** 處理結(jié)果 */
System.out.println(result);
}
public static String requestForHttp(String url,Map<String,String> params) throws IOException {
String result = "";
/** 創(chuàng)建HttpClient */
CloseableHttpClient httpClient = HttpClients.createDefault();
/** httpPost */
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> paramsList = new ArrayList<NameValuePair>();
Iterator<Map.Entry<String,String>> it = params.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String,String> en = it.next();
String key = en.getKey();
String value = en.getValue();
paramsList.add(new BasicNameValuePair(key,value));
}
httpPost.setEntity(new UrlEncodedFormEntity(paramsList,"UTF-8"));
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
try{
HttpEntity httpEntity = httpResponse.getEntity();
result = EntityUtils.toString(httpEntity,"UTF-8");
EntityUtils.consume(httpEntity);
}finally {
try{
if(httpResponse!=null){
httpResponse.close();
}
}catch(IOException e){
logger.info("## release resouce error ##" + e);
}
}
return result;
}
/**
* 生成加密字段
*/
public static String getDigest(String string) {
if (string == null) {
return null;
}
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
byte[] btInput = string.getBytes(StandardCharsets.UTF_8);
try {
MessageDigest mdInst = MessageDigest.getInstance("SHA-256");
mdInst.update(btInput);
byte[] md = mdInst.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (byte byte0 : md) {
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (NoSuchAlgorithmException e) {
return null;
}
}
public static String loadAsBase64(String imgFile)
{//將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對其進行Base64編碼處理
File file = new File(imgFile);
if(!file.exists()){
logger.error("文件不存在");
return null;
}
InputStream in = null;
byte[] data = null;
//讀取圖片字節(jié)數(shù)組
try
{
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
//對字節(jié)數(shù)組Base64編碼
return Base64.getEncoder().encodeToString(data);//返回Base64編碼過的字節(jié)數(shù)組字符串
}
public static String truncate(String q) {
if (q == null) {
return null;
}
int len = q.length();
String result;
return len <= 20 ? q : (q.substring(0, 10) + len + q.substring(len - 10, len));
}
}
Python 示例
# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import base64
import hashlib
import time
reload(sys)
sys.setdefaultencoding('utf-8')
YOUDAO_URL = 'https://openapi.youdao.com/iocr'
APP_KEY = '您的應(yīng)用ID'
APP_SECRET = '您的應(yīng)用密鑰'
def truncate(q):
if q is None:
return None
q_utf8 = q.decode("utf-8")
size = len(q_utf8)
return q_utf8 if size <= 20 else q_utf8[0:10] + str(size) + q_utf8[size - 10:size]
def encrypt(signStr):
hash_algorithm = hashlib.sha256()
hash_algorithm.update(signStr.encode('utf-8'))
return hash_algorithm.hexdigest()
def do_request(data):
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
return requests.post(YOUDAO_URL, data=data, headers=headers)
def connect():
f = open(r'圖片的路徑', 'rb') # 二進制方式打開圖文件
q = base64.b64encode(f.read()) # 讀取文件內(nèi)容,轉(zhuǎn)換為base64編碼
f.close()
data = {}
data['q'] = q
data['templateId'] = 模版id
data['signType'] = 'v3'
curtime = str(int(time.time()))
data['curtime'] = curtime
salt = str(uuid.uuid1())
signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
sign = encrypt(signStr)
data['appKey'] = APP_KEY
data['salt'] = salt
data['sign'] = sign
response = do_request(data)
print response.content
if __name__ == '__main__':
connect()
C# 示例
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Collections.Generic;
using System.Security.Cryptography;
namespace zhiyun_csharp_demo
{
class OcrV3Demo
{
public static void Main()
{
Dictionary dic = new Dictionary();
string url = "https://openapi.youdao.com/iocr";
string q = LoadAsBase64("圖片的路徑");
string appKey = "您的應(yīng)用ID";
string appSecret = "您的應(yīng)用密鑰";
string salt = DateTime.Now.Millisecond.ToString();
dic.Add("templateId", 模版Id);
dic.Add("signType", "v3");
dic.Add("q", System.Web.HttpUtility.UrlEncode(q));
TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
long millis = (long) ts.TotalMilliseconds;
string curtime = Convert.ToString(millis / 1000);
dic.Add("curtime", curtime);
string signStr = appKey + Truncate(q) + salt + curtime + appSecret;;
string sign = ComputeHash(signStr, new SHA256CryptoServiceProvider());
dic.Add("appKey", appKey);
dic.Add("salt", salt);
dic.Add("sign", sign);
string result = Post(url, dic);
Console.WriteLine(result);
}
protected static string ComputeHash(string input, HashAlgorithm algorithm)
{
Byte[] inputBytes = Encoding.UTF8.GetBytes(input);
Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
return BitConverter.ToString(hashedBytes).Replace("-", "");
}
protected static string Truncate(string q)
{
if (q == null)
{
return null;
}
int len = q.Length;
return len <= 20 ? q : (q.Substring(0, 10) + len + q.Substring(len - 10, 10));
}
protected static string LoadAsBase64(string filename)
{
try
{
FileStream filestream = new FileStream(filename, FileMode.Open);
byte[] arr = new byte[filestream.Length];
filestream.Position = 0;
filestream.Read(arr, 0, (int)filestream.Length);
filestream.Close();
return Convert.ToBase64String(arr);
}
catch (Exception ex)
{
return null;
}
}
protected static string Post(string url, Dictionary dic)
{
string result = "";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
StringBuilder builder = new StringBuilder();
int i = 0;
foreach (var item in dic)
{
if (i > 0)
builder.Append("&");
builder.AppendFormat("{0}={1}", item.Key, item.Value);
i++;
}
byte[] data = Encoding.UTF8.GetBytes(builder.ToString());
req.ContentLength = data.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
return result;
}
}
}
PHP 示例
<?php
define("CURL_TIMEOUT", 2000);
define("URL", "https://openapi.youdao.com/iocr");
define("APP_KEY", "您的應(yīng)用ID"); // 替換為您的應(yīng)用ID
define("SEC_KEY", "您的應(yīng)用密鑰"); // 替換為您的密鑰
function do_request($q)
{
$salt = create_guid();
$args = array(
'appKey' => APP_KEY,
'salt' => $salt,
);
$args['q'] = $q;
$args['templateId'] = 模版Id;
$args['signType'] = 'v3';
$curtime = strtotime("now");
$args['curtime'] = $curtime;
$signStr = APP_KEY . truncate($q) . $salt . $curtime . SEC_KEY;
$args['sign'] = hash("sha256", $signStr);
$ret = call(URL, $args);
print_r($ret);
$ret = json_decode($ret, true);
return $ret;
}
// 發(fā)起網(wǎng)絡(luò)請求
function call($url, $args=null, $method="post", $testflag = 0, $timeout = CURL_TIMEOUT, $headers=array())
{
$ret = false;
$i = 0;
while($ret === false)
{
if($i > 1)
break;
if($i > 0)
{
sleep(1);
}
$ret = callOnce($url, $args, $method, false, $timeout, $headers);
$i++;
}
return $ret;
}
function callOnce($url, $args=null, $method="post", $withCookie = false, $timeout = CURL_TIMEOUT, $headers=array())
{
$ch = curl_init();
if($method == "post")
{
$data = convert($args);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_POST, 1);
}
else
{
$data = convert($args);
if($data)
{
if(stripos($url, "?") > 0)
{
$url .= "&$data";
}
else
{
$url .= "?$data";
}
}
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(!empty($headers))
{
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
if($withCookie)
{
curl_setopt($ch, CURLOPT_COOKIEJAR, $_COOKIE);
}
$r = curl_exec($ch);
curl_close($ch);
return $r;
}
function convert(&$args)
{
$data = '';
if (is_array($args))
{
foreach ($args as $key=>$val)
{
if (is_array($val))
{
foreach ($val as $k=>$v)
{
$data .= $key.'['.$k.']='.rawurlencode($v).'&';
}
}
else
{
$data .="$key=".rawurlencode($val)."&";
}
}
return trim($data, "&");
}
return $args;
}
// uuid generator
function create_guid(){
$microTime = microtime();
list($a_dec, $a_sec) = explode(" ", $microTime);
$dec_hex = dechex($a_dec* 1000000);
$sec_hex = dechex($a_sec);
ensure_length($dec_hex, 5);
ensure_length($sec_hex, 6);
$guid = "";
$guid .= $dec_hex;
$guid .= create_guid_section(3);
$guid .= '-';
$guid .= create_guid_section(4);
$guid .= '-';
$guid .= create_guid_section(4);
$guid .= '-';
$guid .= create_guid_section(4);
$guid .= '-';
$guid .= $sec_hex;
$guid .= create_guid_section(6);
return $guid;
}
function truncate($q) {
$len = abslength($q);
return $len <= 20 ? $q : (mb_substr($q, 0, 10) . $len . mb_substr($q, $len - 10, $len));
}
function abslength($str)
{
if(empty($str)){
return 0;
}
if(function_exists('mb_strlen')){
return mb_strlen($str,'utf-8');
}
else {
preg_match_all("/./u", $str, $ar);
return count($ar[0]);
}
}
function ensure_length(&$string, $length){
$strlen = strlen($string);
if($strlen < $length)
{
$string = str_pad($string, $length, "0");
}
else if($strlen > $length)
{
$string = substr($string, 0, $length);
}
}
function create_guid_section($characters){
$return = "";
for($i = 0; $i < $characters; $i++)
{
$return .= dechex(mt_rand(0,15));
}
return $return;
}
// 輸入
$file = "圖片的路徑";
$fp = fopen($file, "r") or die("Can't open file");
// base64編碼
$q = base64_encode(fread($fp, filesize($file)));
fclose($fp);
do_request($q);
?>
更新記錄
日期 |
更新內(nèi)容 |
2020.04.10 |
更新接口返回值,測試接口地址 |