日韩高清免费不卡一区,蜜桃精品人妻一区二区三区,三级黄色老熟妇视频网,台湾无码av一区二区三区

幫助與文檔 > 產(chǎn)品文檔 > 視覺智能服務 > API文檔 > 表格識別
表格識別

表格OCR API 簡介

概念解釋

表格識別:基于深度學習技術,自動定位并識別圖片中表格的位置、結(jié)構(gòu)及文字內(nèi)容,結(jié)構(gòu)化返回可編輯的表格結(jié)果。支持用戶上傳報表、帶有表格的圖片等。

說明

Hi,您好,歡迎使用有道智云表格識別API接口服務。

本文檔主要針對需要集成API的技術開發(fā)工程師,詳細描述表格識別能力相關的技術內(nèi)容。

如果您想快速體驗服務,建議您前往 體驗中心 或者在體驗中心右下側(cè)找到小程序二維碼,掃描進行體驗。

如果您有與我們商務合作的需求,可以通過以下方式聯(lián)系我們:

商務郵箱: AIcloud_Business@corp.youdao.com

如果您對文檔內(nèi)容有任何疑問,可以通過以下幾種方式聯(lián)系我們:

客服QQ:1906538062

智云OCR技術交流QQ 1群: 654064748

智云OCR技術交流QQ 2群: 471638046

聯(lián)系郵箱: zhiyun@corp.youdao.com

溫馨提示:

  • 本文檔主要針對開發(fā)人員,接入測試前需要獲取應用ID應用密鑰;如果您還沒有,請按照 新手指南 操作。
  • 平臺向每個賬戶贈送50元的體驗金,供用戶集成前測試所用,具體資費規(guī)則詳見 表格識別服務報價 。

接口說明

表格OCR API HTTPS地址:

https://openapi.youdao.com/ocr_table

協(xié)議須知

調(diào)用方在集成表格識別OCR API時,請遵循以下規(guī)則。

規(guī)則描述
傳輸方式HTTPS
請求方式POST
字符編碼統(tǒng)一使用UTF-8編碼
請求格式表單
響應格式JSON

接口調(diào)用參數(shù)

調(diào)用API需要向接口發(fā)送以下字段來訪問服務。

字段名類型含義必填備注
qtext要識別的圖片,需要Base64編碼TrueUTF-8編碼
typetext圖片類型,Base64編碼True1
appKeytext應用IDTrue可在 應用管理 查看
salttextUUID,和curtime一起防請求重放Trueuuid,唯一通用識別碼
signtext簽名Truesha256(應用ID+input+salt+curtime+密鑰)
docTypetext服務器響應類型,目前支持json和ExcelTruejson
signTypetext簽名類型truev3
curtimetext當前UTC時間戳(秒)trueTimeStamp
angletext是否進行360角度識別false0:不識別,1:識別,默認不識別(0)

簽名生成方法如下:
signType=v3;
sign=sha256(應用ID+input+salt+curtime+應用密鑰)。
其中,input的計算方式為:input=q前10個字符 + q長度 + q后10個字符(當q長度大于20)或 input=q字符串(當q長度小于等于20)。

不同語言獲取時間戳,請參看 此鏈接

如果對簽名有疑問,可以參看文檔末尾各語言demo。

如果圖片有傾斜,需要調(diào)用時增加角度檢測參數(shù),以獲得更好的效果。

docType為excel時,返回json的字段中是excel的base64

輸出結(jié)果

  • excel

返回的結(jié)果是json格式,具體說明如下:

字段含義
errorCode識別結(jié)果錯誤碼,一定存在
Result識別結(jié)果,如果docType是excel則返回excel的base64字符串
-orientation圖片方向
-tables表格excel,使用base64編碼后的結(jié)果
  • json

返回的結(jié)果是json格式,具體說明如下:

字段含義
errorCode識別結(jié)果錯誤碼,一定存在
Result識別結(jié)果,如果docType是excel則返回excel的base64字符串
-orientation圖片方向
-tables返回的表格,如果一張圖像中有多個表格,返回多個
--cells表格中的單元格
--rowRange單元格行號的范圍,如果當前行存在單元格合并情況,兩個值不同
--colRange單元格列號的范圍,如果當前列存在單元格合并情況,兩個值不同
--boundingBox單元格文字的坐標
--dir單元格方向。h:水平 v:豎直
--lang文字種類 zh為中文
--lines單元格中的每一行
---boundingBox行的坐標
---text識別的行文字
---words字級別組
----word識別的文字
----boundingBox字的坐標

即識別結(jié)果主要在Result中,輸出結(jié)構(gòu)為:regions->lines->words。一個文檔可能有多個region,代表段落,一個段落有多行,一行有多個字。

每個段落、每行、每個字都有boundingBox,代表能夠框住段落、行、字的最大box的位置信息。

boundingBox共八個值:分別是左上角坐標(x,y),右上角坐標(x,y),右下角坐標(x,y),左下角(x,y)

參考示例

  • docType為excel時
{  
       "errorCode":"0",   #返回狀態(tài) 如果成功, 返回0
       "Result":"{
            "orientation":"UP",#圖片方向
                        "tables":["UEsDBBQ ... ... AsAxQIAAOQ1AAA=="]# 表格excel,使用base64編碼后的結(jié)果
                 }"
}
  • docType為json時
{  
       "errorCode":"0",   #返回狀態(tài) 如果成功, 返回0
       "Result":"   {        #如果沒有錯誤,返回識別的內(nèi)容
          "orientation":"UP",#圖片方向
          "tables":[         #返回的表格,如果一張圖像中有多個表格,返回多個
                {"cells":[      #表格中的單元格
                   {  
                      "rowRange":"0,0", #單元格行號的范圍,如果當前行存在單元格合并情況,兩個值不同
                      "colRange":"0,0", #單元格列號的范圍,如果當前列存在單元格合并情況,兩個值不同
                      "boundingBox":"225,209,379,209,379,240,225,240", #單元格文字的bounding box
                      "dir":"h",   #方向 h水平 v豎直
                      "lang":"zh", #文字種類 zh為中文
                      "lines":[    #單元格中的每一行
                         {  
                            "boundingBox":"225,212,379,209,379,237,225,240", #行的坐標
                            "text":"工程項目合同名稱", #行文字
                            "words":[               #每個文字
                               {  
                                  "word":"工",
                                  "boundingBox":"231,212,238,212,238,240,231,240" #每個字的包圍框
                               },
                               {  
                                  "word":"程",
                                  "boundingBox":"245,212,258,211,258,239,245,240"
                               },
                               ......
                            ]
                         }
                      ]
                   },
                   {  
                      "rowRange":"0,0",#單元格行號的范圍,如果當前行存在單元格合并情況,兩個值不同
                      "colRange":"1,1",#單元格列號的范圍,如果當前列存在單元格合并情況,兩個值不同
                      "boundingBox":"441,206,536,206,536,234,441,234",
                      "dir":"h",
                      "lang":"zh",
                      "lines":[  
                         {  
                            "boundingBox":"441,206,536,206,536,234,441,234",
                            "text":"金額",
                            "words":[  
                               {  
                                  "word":"金",
                                  "boundingBox":"454,206,461,206,..."
                                        ......
                                        }
                                    ]
                                }]
                            }
                        }
                        .....

服務配置

支持圖片格式每小時最大請求次數(shù)
jpg\png\bmp3600

錯誤代碼列表

錯誤碼含義
101缺少必填的參數(shù),首先確保必填參數(shù)齊全,然后,確認參數(shù)書寫是否正確。
102不支持的語言類型
103翻譯文本過長
104不支持的API類型
105不支持的簽名類型
106不支持的響應類型
107不支持的傳輸加密類型
108應用ID無效,注冊賬號,登錄后臺創(chuàng)建應用和實例并完成綁定,可獲得應用ID和應用密鑰等信息
109batchLog格式不正確
110無相關服務的有效實例,應用沒有綁定服務實例,可以新建服務實例,綁定服務實例。注:某些服務的結(jié)果發(fā)音需要tts實例,需要在控制臺創(chuàng)建語音合成實例綁定應用后方能使用。
111開發(fā)者賬號無效
112請求服務無效
113q不能為空
114不支持的圖片傳輸方式
201解密失敗,可能為DES,BASE64,URLDecode的錯誤
202簽名檢驗失敗,如果確認應用ID和應用密鑰的正確性,仍返回202,一般是編碼問題。請確保 img 為UTF-8編碼.
203訪問IP地址不在可訪問IP列表
205請求的接口與應用的平臺類型不一致,確保接入方式(Android SDK、IOS SDK、API)與創(chuàng)建的應用平臺類型一致。如有疑問請參考入門指南
206因為時間戳無效導致簽名校驗失敗
207重放請求
301辭典查詢失敗
302翻譯查詢失敗
303服務端的其它異常
304會話閑置太久超時
401賬戶已經(jīng)欠費停
402offlinesdk不可用
411訪問頻率受限,請稍后訪問
412長請求過于頻繁,請稍后訪問
1001無效的OCR類型
1002不支持的OCR image類型
1003不支持的OCR Language類型
1004識別圖片過大
1201圖片base64解密失敗
1301OCR段落識別失敗
1411訪問頻率受限
1412超過最大識別字節(jié)數(shù)
2003不支持的語言識別Language類型
2004合成字符過長
2005不支持的音頻文件類型
2006不支持的發(fā)音類型
2201解密失敗
2301服務的異常
2411訪問頻率受限,請稍后訪問
2412超過最大請求字符數(shù)
3001不支持的語音格式
3002不支持的語音采樣率
3003不支持的語音聲道
3004不支持的語音上傳類型
3005不支持的語言類型
3006不支持的識別類型
3007識別音頻文件過大
3008識別音頻時長過長
3009不支持的音頻文件類型
3010不支持的發(fā)音類型
3201解密失敗
3301語音識別失敗
3302語音翻譯失敗
3303服務的異常
3411訪問頻率受限,請稍后訪問
3412超過最大請求字符數(shù)
4001不支持的語音識別格式
4002不支持的語音識別采樣率
4003不支持的語音識別聲道
4004不支持的語音上傳類型
4005不支持的語言類型
4006識別音頻文件過大
4007識別音頻時長過長
4201解密失敗
4301語音識別失敗
4303服務的異常
4411訪問頻率受限,請稍后訪問
4412超過最大請求時長
5001無效的OCR類型
5002不支持的OCR image類型
5003不支持的語言類型
5004識別圖片過大
5005不支持的圖片類型
5006文件為空
5201解密錯誤,圖片base64解密失敗
5301OCR段落識別失敗
5411訪問頻率受限
5412超過最大識別流量
9001不支持的語音格式
9002不支持的語音采樣率
9003不支持的語音聲道
9004不支持的語音上傳類型
9005不支持的語音識別 Language類型
9301ASR識別失敗
9303服務器內(nèi)部錯誤
9411訪問頻率受限(超過最大調(diào)用次數(shù))
9412超過最大處理語音長度
10001無效的OCR類型
10002不支持的OCR image類型
10004識別圖片過大
10201圖片base64解密失敗
10301OCR段落識別失敗
10411訪問頻率受限
10412超過最大識別流量
11001不支持的語音識別格式
11002不支持的語音識別采樣率
11003不支持的語音識別聲道
11004不支持的語音上傳類型
11005不支持的語言類型
11006識別音頻文件過大
11007識別音頻時長過長,最大支持30s
11201解密失敗
11301語音識別失敗
11303服務的異常
11411訪問頻率受限,請稍后訪問
11412超過最大請求時長
12001圖片尺寸過大
12002圖片base64解密失敗
12003引擎服務器返回錯誤
12004圖片為空
12005不支持的識別圖片類型
12006圖片無匹配結(jié)果
13001不支持的角度類型
13002不支持的文件類型
13003表格識別圖片過大
13004文件為空
13301表格識別失敗
15001需要圖片
15002圖片過大(1M)
15003服務調(diào)用失敗
17001需要圖片
17002圖片過大(1M)
17003識別類型未找到
17004不支持的識別類型
17005服務調(diào)用失敗

版本更新記錄

上線日期版本號更新內(nèi)容
2019.04.15v1.0.0表格識別API上線,支持自動識別表格位置、結(jié)構(gòu)及內(nèi)容,結(jié)構(gòu)化輸出可編輯的識別結(jié)果。

常用語言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 OcrV3Demo {

    private static Logger logger = LoggerFactory.getLogger(OcrV3Demo.class);

    private static final String YOUDAO_URL = "https://openapi.youdao.com/ocr_table";

    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());
        String type = "1";
        params.put("type", type);
        params.put("q", q);
        params.put("docType", "json");
        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/ocr_table'
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())  # 讀取文件內(nèi)容,轉(zhuǎn)換為base64編碼
    f.close()

    data = {}
    data['type'] = '1'
    data['q'] = q
    data['docType'] = 'json'
    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/ocr_table";
            string q = LoadAsBase64("圖片的路徑");
            string appKey = "您的應用ID";
            string appSecret = "您的應用密鑰";
            string salt = DateTime.Now.Millisecond.ToString();
            string type = "1";
            dic.Add("type", type);
            dic.Add("docType", "json");
            dic.Add("signType", "v3");
            dic.Add("img", 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/ocr_table");
define("APP_KEY",        "您的應用ID"); // 替換為您的應用ID
define("SEC_KEY",        "您的應用密鑰"); // 替換為您的密鑰

function do_request($q)
{
     $salt = create_guid();
     $args = array(
        'appKey' => APP_KEY,
        'salt' => $salt,
     );
     $type = '1';
     $args['type'] = $type;
     $args['q'] = $q;
     $args['docType'] = 'json';
     $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)絡請求
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);
?>
丰满少妇人妻久久久久久| 在线国产精品一区二区三区| 中文亚洲欧美日韩国产| 亚洲精品在线观看日本国产| 国产精品一区二区三区三级天堂| 国产精品久久久久久妇女| 久久99精品免费免费| 亚洲人妻最新中文AV| 国产在线观看污污污网站| 亚洲午夜久久久久噜噜噜| 人与嘼一区二区三区| 国产精品欧美激情青草| 99国产精品视频在线| 蜜臀av国产精品久久久久| 93国产精品久久久久久| 国内精品久久久久久久久久久| 欧美黄片一区二区免费| 韩国午夜理伦三级理论电影| 经典国产乱子伦精品| 国产精品va在线观看老妇女| 人妻少妇精品视频无码专区| 91久久久久久久国产| 久久久久久久久久久极品| 国产精品综合色国产亚洲欧| 2018在线不卡爱视频| 女人和男人三级黄片子| 91蜜臀综合99国产区| 亚洲国产精品无码久久久高潮| 日韩插久久一区二区三区综合| 国产精品国产三级在线| 97在线视频播放免费观看不卡| 欧美亚洲综合中文字幕蜜桃成熟| 中文国产成人AⅤ久久| 亚洲人妻最新中文AV| 久久久久人妻精品明星换脸| 精品人妻一区二区三区20| 日韩一区二区合集影院在线观看| 欧美肉大捧一进一出| 欧美大片免费看片入口| 尤物亚洲综合色区另类aⅴ| 国产日韩欧美老人啪啪|