精品題庫:有道智云精品題庫服務基于文字識別技術,結合組段和渲染技術,滿足用戶的需求。
Hi,您好,歡迎使用有道智云精品題庫服務。
如果您想快速體驗服務,建議您前往 精品題庫體驗中心 或者在體驗中心右下側找到小程序二維碼,掃描進行體驗。
本文檔主要針對需要集成精品題庫服務HTTP API的開發工程師,詳細描述有道智云精品題庫能力及如何集成的技術內容。
如果您有與我們商務合作的需求,可以通過以下方式聯系我們:
商務郵箱: AIcloud_Business@corp.youdao.com
如果您對文檔內容有任何疑問,可以通過以下幾種方式聯系我們:
客服QQ:1906538062
智云精品題庫交流QQ群:685832941
聯系郵箱: zhiyun@corp.youdao.com
溫馨提示:
應用ID和應用密鑰;如果您還沒有,請按照 新手指南 獲取。接口地址
https 接口:
https://openapi.youdao.com/ocrquestionapi
調用方在集成精品題庫API時,請遵循以下規則。
| 規則 | 描述 |
|---|---|
| 傳輸方式 | HTTPS |
| 請求方式 | POST |
| 字符編碼 | 統一使用UTF-8編碼 |
| 請求格式 | 表單 |
| 響應格式 | JSON |
| 圖片格式 | jpg/png/bmp |
| 圖片大小 | 1MB以下 |
| 文字長度 | 50個字符以下 |
調用API需要想接口發送以下字段來訪問服務。
| 字段名 | 類型 | 含義 | 必填 | 備注 |
|---|---|---|---|---|
| q | text | 要識別的圖片,需要Base64編碼 | True | 必須是Base64編碼(baes64前邊不要加上data:image/png;base64) |
| appKey | text | 應用ID | True | 可在應用管理查看 |
| salt | text | UUID | True | uuid,唯一通用識別碼 |
| curtime | text | 當前UTC時間戳(秒) | true | TimeStamp |
| sign | text | 簽名 sha256(應用ID+input+salt+curtime+應用密鑰);input的生成規則見表下的備注 | True | sha256(應用ID+input+salt+curtime+應用密鑰) |
| signType | text | 簽名類型 | true | v2 |
| type | text | 上傳類型, 僅支持base64上傳,請填寫固定值1 | True | 1 |
| searchType | text | 搜索類型,img為圖片搜題,text為文本搜題 | false | 默認為img類型 |
簽名
sign生成方法如下: signType=v2; sign=sha256(應用ID+input+salt+curtime+應用密鑰)。 其中,input的計算方式為:input=q前10個字符+q長度+q后10個字符(當q長度大于20)或input=q字符串(當q長度小于等于20)。 具體示例如下: a.比如:q="Welcome to youdao AICloud.",字符串長度為26,大于20,其input="Welcome to"(前10個字符) + 26(字符串長度) + "o AICloud."(q字符串后10個字符)。 b.比如:q = "sdT4bWrjS",字符串長度為9,小于20,input = "sdT4bWrjS".
響應結果是以json形式輸出,包含字段如下表所示:
| 字段 | 含義 |
|---|---|
| errorCode | 識別結果錯誤碼,一定存在。 詳細信息可參見 錯誤代碼列表 |
| data | 數據 |
| -text | 圖片題目OCR結果 |
| -questions | 相關題目 |
| --id | 答案 |
| --content | 題目內容 |
| --answer | 答案 |
| --analysis | 解析 |
| --knowledge | 知識點 |
##輸出結果示例
{
"data": {
"questions": [{
"answer": "<p>CM=DM </p><p><br/></p>",
"id": "894fd7be65ce7b0288188bd871eebd08",
"analysis": "<p>因為OP平分∠AOB, PC⊥OA于點C, PD⊥OB于點D,所以PD=PC,∠DPM=∠CPM.又因為PM=<br/>PM,所以△MPD≌△MPC,所以CM=DM. </p>",
"content": "<p>如圖,OP平分∠AOB, PC⊥OA于點C, PD⊥OB于點D,M為OP上任意一點,連接CM, DM,則CM和DM的大小關系是______.<br/></p><p><img src=\"http://nos.netease.com/yd-searchq/17eb37cb-1990-4453-aea8-ca151ae066fe.png\" title=\"1533365392716.png\" alt=\"blob.png\"/></p>",
"knowledge": ""
}, {
"answer": "相等",
"id": "fe9ee50505cdbd32244be8ba4cd20e2c",
"analysis": "∵OP平分∠AOB,PC⊥OA,PD⊥OB, <br />∴PC=PD,∠OPC=∠OPD, <br />在△CPM和△DPM中,<img src=\"http://nos.netease.com/yd-searchq/c502f498-05e3-4828-8286-feb1a3d21abc.gif\" />, <br />∴△CPM≌△DPM(SAS), <br />∴CM=DM. <br />故答案為:相等. <br />根據角平分線上的點到角的兩邊距離相等可得PC=PD,再求出∠OPC=∠OPD,然后利用“邊角邊”證明△CPM和△DPM全等,根據全等三角形對應邊相等可得CM=DM. <br />本題考查了角平分線上的點到角的兩邊距離相等的性質,全等三角形的判定與性質,熟記性質并確定出全等三角形是解題的關鍵.",
"content": "<img src=\"http://nos.netease.com/yd-searchq/a102f7ea-9c15-4a1d-afde-64f9d226ba57.gif\" />如圖,OP平分∠AOB,PC⊥OA于C,PD⊥OB于D.M為OP上任意一點,連結CM、DM,則CM和DM的大小關系是 ______ .",
"knowledge": "圖形的性質>>圖形認識初步>>角平分線的性質"
}, {
"answer": "解:∵OP平分∠AOB,PC⊥OA,PD⊥OB,<br />∴PC=PD,∠OPC=∠OPD,<br />在△CPM和△DPM中, \\( \\left\\{\\begin{array}{c}CP=DP\\\\∠OPC=∠OPD\\\\PM=PM\\end{array}\\right. \\) ,<br />∴△CPM≌△DPM(SAS),<br />∴CM=DM.<br />故答案為:相等.",
"id": "d2db5fecc55c78092298f0889482dd44",
"analysis": "本題考查了角平分線上的點到角的兩邊距離相等的性質,全等三角形的判定與性質,熟記性質并確定出全等三角形是解題的關鍵.",
"content": "<img src=\"http://nos.netease.com/yd-searchq/8b8c0270-8fa5-4791-be64-fcf4652033e7.jpg\" /> <br />如圖,OP平分∠AOB,PC⊥OA于C,PD⊥OB于D.M為OP上任意一點,連結CM、DM,則CM和DM的大小關系是__.",
"knowledge": "角平分線的性質,全等三角形的判定與性質"
}],
"text": "如-3-11,0 , 平分∠AOB,PC OA于C.PDLO1S于D,M為OP上H 意一點,連接CM,DM,則CM和DM的大小關系是 ,"
},
"errorCode": "0"
}
| 支持圖片格式 | 文件大小上限 | 支持語言 |
|---|---|---|
| jpg\png\bmp | 1M | 中文 |
| 錯誤碼 | 含義 |
|---|---|
| 101 | 缺少必填的參數 |
| 102 | 不支持的語言類型 |
| 103 | 翻譯文本過長 |
| 104 | 不支持的API類型 |
| 105 | 不支持的簽名類型 |
| 106 | 不支持的響應類型 |
| 107 | 不支持的傳輸加密類型 |
| 108 | 應用ID無效,注冊賬號,登錄后臺創建應用,可獲得應用ID和應用密鑰等信息 |
| 109 | batchLog格式不正確 |
| 110 | 無相關服務的有效實例 |
| 111 | 開發者賬號無效 |
| 112 | 請求服務無效 |
| 113 | q不能為空 |
| 114 | 不支持的圖片傳輸方式 |
| 201 | 解密失敗,可能為DES,BASE64,URLDecode的錯誤 |
| 202 | 簽名檢驗失敗 |
| 203 | 訪問IP地址不在可訪問IP列表 |
| 205 | 請求的接口與應用的平臺類型不一致,如有疑問請參考入門指南 |
| 206 | 因為時間戳無效導致簽名校驗失敗 |
| 207 | 重放請求 |
| 301 | 辭典查詢失敗 |
| 302 | 翻譯查詢失敗 |
| 303 | 服務端的其它異常 |
| 304 | 會話閑置太久超時 |
| 401 | 賬戶已經欠費停 |
| 402 | offlinesdk不可用 |
| 411 | 訪問頻率受限,請稍后訪問 |
| 412 | 長請求過于頻繁,請稍后訪問 |
| 1001 | 無效的OCR類型 |
| 1002 | 不支持的OCR image類型 |
| 1003 | 不支持的OCR Language類型 |
| 1004 | 識別圖片過大 |
| 1201 | 圖片base64解密失敗 |
| 1301 | OCR段落識別失敗 |
| 1411 | 訪問頻率受限 |
| 1412 | 超過最大識別字節數 |
| 2003 | 不支持的語言識別Language類型 |
| 2004 | 合成字符過長 |
| 2005 | 不支持的音頻文件類型 |
| 2006 | 不支持的發音類型 |
| 2201 | 解密失敗 |
| 2301 | 服務的異常 |
| 2411 | 訪問頻率受限,請稍后訪問 |
| 2412 | 超過最大請求字符數 |
| 3001 | 不支持的語音格式 |
| 3002 | 不支持的語音采樣率 |
| 3003 | 不支持的語音聲道 |
| 3004 | 不支持的語音上傳類型 |
| 3005 | 不支持的語言類型 |
| 3006 | 不支持的識別類型 |
| 3007 | 識別音頻文件過大 |
| 3008 | 識別音頻時長過長 |
| 3009 | 不支持的音頻文件類型 |
| 3010 | 不支持的發音類型 |
| 3201 | 解密失敗 |
| 3301 | 語音識別失敗 |
| 3302 | 語音翻譯失敗 |
| 3303 | 服務的異常 |
| 3411 | 訪問頻率受限,請稍后訪問 |
| 3412 | 超過最大請求字符數 |
| 4001 | 不支持的語音識別格式 |
| 4002 | 不支持的語音識別采樣率 |
| 4003 | 不支持的語音識別聲道 |
| 4004 | 不支持的語音上傳類型 |
| 4005 | 不支持的語言類型 |
| 4006 | 識別音頻文件過大 |
| 4007 | 識別音頻時長過長 |
| 4201 | 解密失敗 |
| 4301 | 語音識別失敗 |
| 4303 | 服務的異常 |
| 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 | 服務器內部錯誤 |
| 9411 | 訪問頻率受限(超過最大調用次數) |
| 9412 | 超過最大處理語音長度 |
| 10001 | 無效的OCR類型 |
| 10002 | 不支持的OCR image類型 |
| 10004 | 識別圖片過大 |
| 10201 | 圖片base64解密失敗 |
| 10301 | OCR段落識別失敗 |
| 10411 | 訪問頻率受限 |
| 10412 | 超過最大識別流量 |
| 11001 | 不支持的語音識別格式 |
| 11002 | 不支持的語音識別采樣率 |
| 11003 | 不支持的語音識別聲道 |
| 11004 | 不支持的語音上傳類型 |
| 11005 | 不支持的語言類型 |
| 11006 | 識別音頻文件過大 |
| 11007 | 識別音頻時長過長,最大支持30s |
| 11201 | 解密失敗 |
| 11301 | 語音識別失敗 |
| 11303 | 服務的異常 |
| 11411 | 訪問頻率受限,請稍后訪問 |
| 11412 | 超過最大請求時長 |
| 12001 | 圖片尺寸過大 |
| 12002 | 圖片base64解密失敗 |
| 12003 | 引擎服務器返回錯誤 |
| 12004 | 圖片為空 |
| 12005 | 不支持的識別圖片類型 |
| 12006 | 圖片無匹配結果 |
| 13001 | 不支持的角度類型 |
| 13002 | 不支持的文件類型 |
| 13003 | 表格識別圖片過大 |
| 13004 | 文件為空 |
| 13301 | 表格識別失敗 |
| 15001 | 需要圖片 |
| 15002 | 圖片過大(1M) |
| 15003 | 服務調用失敗 |
| 17001 | 需要圖片 |
| 17002 | 圖片過大(1M) |
| 17003 | 識別類型未找到 |
| 17004 | 不支持的識別類型 |
| 17005 | 服務調用失敗 |
package com.youdao.ai;
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 OcrquestionV2Demo {
private static Logger logger = LoggerFactory.getLogger(OcrquestionV2Demo.class);
private static final String YOUDAO_URL = "https://openapi.youdao.com/ocrquestionapi";
private static final String APP_KEY = "您的應用ID";
private static final String APP_SECRET = "您的應用密鑰";
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("signType", "v2");
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);
/** 處理結果 */
System.out.println(result);
}
public static String requestForHttp(String url,Map<String,String> params) throws IOException {
String result = "";
/** 創建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)
{//將圖片文件轉化為字節數組字符串,并對其進行Base64編碼處理
File file = new File(imgFile);
if(!file.exists()){
logger.error("文件不存在");
return null;
}
InputStream in = null;
byte[] data = null;
//讀取圖片字節數組
try
{
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
//對字節數組Base64編碼
return Base64.getEncoder().encodeToString(data);//返回Base64編碼過的字節數組字符串
}
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));
}
}
# -*- 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/ocrquestionapi'
APP_KEY = '您的應用ID'
APP_SECRET = '您的應用密鑰'
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()) # 讀取文件內容,轉換為base64編碼
f.close()
data = {}
data['q'] = q
data['signType'] = 'v2'
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()
# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import base64
import hashlib
from imp import reload
import time
reload(sys)
YOUDAO_URL = 'https://openapi.youdao.com/ocrquestionapi'
APP_KEY = '您的應用ID'
APP_SECRET = '您的應用密鑰'
def truncate(q):
if q is None:
return None
size = len(q)
return q if size <= 20 else q[0:10] + str(size) + q[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()).decode('utf-8') # 讀取文件內容,轉換為base64編碼
f.close()
data = {}
data['q'] = q
data['signType'] = 'v2'
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()
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Collections.Generic;
using System.Security.Cryptography;
namespace zhiyun_csharp_demo
{
class OcrquestionV1Demo
{
public static void Main()
{
Dictionary<String, String> dic = new Dictionary<String, String>();
string url = "https://openapi.youdao.com/ocrquestionapi";
string q = LoadAsBase64("圖片的路徑");
string appKey = "您的應用ID";
string appSecret = "您的應用密鑰";
string salt = DateTime.Now.Millisecond.ToString();
dic.Add("q", System.Web.HttpUtility.UrlEncode(q));
dic.Add("signType", "v2");
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<String, String> 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
define("CURL_TIMEOUT", 2000);
define("URL", "https://openapi.youdao.com/ocrquestionapi");
define("APP_KEY", "您的應用ID"); // 替換為您的應用ID
define("SEC_KEY", "您的應用密鑰"); // 替換為您的密鑰
function do_request($q)
{
$salt = create_guid();
$args = array(
'appKey' => APP_KEY,
'salt' => $salt,
);
$args['q'] = $q;
$args['signType'] = 'v2';
$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;
}
// 發起網絡請求
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);
?>