none
Microsoft Translator API RRS feed

  • 質問

  • Microsoft Translator API でのアクセストークンについて

    下記のプログラムの char* lpszReturnの中に入っているサーバーからの受信データからTraceIDとCorrelationIDのデータの抜き出しに困ってます

    データの抜き出し方はこの考え方で合っているでしょうか また、if文でエラーが発生しているので考え方があっていたら教えていただけないでしょうか。

    #include"stdafx.h"
    #pragma comment(lib, "wininet")
    #undef UNICODE
    #include <stdio.h>
    #include <windows.h>
    #include <wininet.h>
    void UrlEncode(const char* lpszSrc, char* lpszDst)
    {
     const char* p = lpszSrc;
     lpszDst[0] = 0;
     while (*p) {
      char buf[8];
      if (isalnum(*p) || *p == '_' || *p == '.' || *p == '-')
       sprintf(buf, "%c", *p);
      else
       sprintf(buf, "%%%02X", (int)*p);
      strcat(lpszDst, buf);
      ++p;
     }
    }
    PSTR Post(LPCWSTR lpszServer, LPCWSTR lpszPath, LPCWSTR lpszHeader, LPBYTE lpbyData, int nSize)//post 定義
    {
     
     char* lpszReturn = 0;//LPSTR
     const HINTERNET hInternet = InternetOpenW(L"WinInet Test Program", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
     if (!hInternet) return lpszReturn;
     const HINTERNET hHttpSession = InternetConnectW(hInternet, lpszServer, INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
     if (!hHttpSession) InternetCloseHandle(hInternet);
     const HINTERNET hHttpRequest = HttpOpenRequestW(hHttpSession, L"POST", lpszPath, NULL, 0, NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_RELOAD, 0);
     if (!hHttpRequest) InternetCloseHandle(hHttpSession);
     if (HttpSendRequestW(hHttpRequest, lpszHeader, lstrlenW(lpszHeader), lpbyData, nSize) == FALSE) InternetCloseHandle(hHttpRequest);
     { //サーバーデータを読み込み
      LPBYTE lpszByte = (LPBYTE)GlobalAlloc(GPTR, 1);
      DWORD dwRead, dwSize = 0;
      static BYTE szBuffer[1024 * 4];
      for (;;) {
       if (!InternetReadFile(hHttpRequest, szBuffer, (DWORD)sizeof(szBuffer), &dwRead) || !dwRead) break;
      // if (!InternetReadFile(stt, szBuffer, (DWORD)sizeof(szBuffer), &dwRead) || !dwRead) break;
       LPBYTE lpTemp = (LPBYTE)GlobalReAlloc(lpszByte, (SIZE_T)(dwSize + dwRead + 1), GMEM_MOVEABLE);
       if (lpTemp == NULL) break;
       lpszByte = lpTemp;
       CopyMemory(lpszByte + dwSize, szBuffer, dwRead);
       dwSize += dwRead;
      }
      lpszByte[dwSize] = 0;
      lpszReturn = (LPSTR)lpszByte;
      
     }
    }
    int main()
    {
     int a, b, c;
     char TraceID[1024];
     char CorrelationID[1024];
     char szGrantType[] = "client_credentials";
     char szClientID[] = "  VVVVVVV"; // アプリの Client ID に置き換えてください
     char szClientSecret[] =”XXXXXXXXXXXXXXXX"; // アプリの Client Secret に置き換えてください
     char szScope[] = "http://api.microsofttranslator.com";
     char szData[1024] = { 0 };
     strcat(szData, "grant_type=");
     UrlEncode(szGrantType, szData + strlen(szData));
     strcat(szData, "&client_id=");
     UrlEncode(szClientID, szData + strlen(szData));
     strcat(szData, "&client_secret=");
     UrlEncode(szClientSecret, szData + strlen(szData));
     strcat(szData, "&scope=");
     UrlEncode(szScope, szData + strlen(szData));
     char *lpszReturn = Post(
      L"datamarket.accesscontrol.windows.net",
      L"/v2/OAuth2-13",
      L"Content-Type: application/x-www-form-urlencoded",
      (LPBYTE)szData, strlen(szData));
     puts(lpszReturn); printf("\n");
     a = 0;   //ここから文字取り出し
     for(;;)
      if ("T"== *(lpszReturn + a))break;//Tの場所を検索
      else a++;
      b = 0;
      c = 0;
     for (;;) {
      if ("\r" == *(lpszReturn + b)) {//TraceIDの一番後ろの制御文字まで
       if (c == 2) break;
       else c++;
      }
      else b++;
     }
     c = 0;
     for (a; a <= b - 1;) {
      TraceID[c] = *(lpszReturn + a);
      c++;
     }
     TraceID[c + 1] = "NULL";
     a = b;
     b = 0;
     c = 0;
     for (;;) {
      if ("\r" == *(lpszReturn + b)) {
       if (c == 3) break;
       else c++;
      }
      else b++;
     }
     c = 0;
     for (a; a <= b - 1;) {
      CorrelationID[c] = *(lpszReturn + a);
      c++;
     }
     CorrelationID[c + 1] = "NULL";
     GlobalFree(lpszReturn);

     return 0;
    }

    エラーが発生を隠したときのコマンドプロンプト

    {"error":"invalid_client","error_description":"ACS50012: Authentication failed.\r\nTrace ID: 4cf89729-226f-4802-92de-a72f79d78c5f\r\nCorrelation ID: d6d1b111-160f-4bfa-aae4-6d200192fd40\r\nTimestamp: 2017-05-16 11:19:59Z"}
    続行するには何かキーを押してください . . .

    2017年5月16日 11:36

すべての返信

  • ざっくりとですが、気になった2か所について

    if ("T"== *(lpszReturn + a))


    の部分は、左辺は文字列、右辺は文字との比較になってしまっているので、"T" は 'T'と修正します。

    TraceID[c + 1] = "NULL";

    の部分も、左辺が文字で、右辺が文字列となっていますので、右辺の "NULL" を NULL 終端文字の '\0' に修正します。

    上記のように、データ型の問題さえ解消されれば、ビルドは通ると思います。プログラムの実行が出来れば、ブレークポイントなどを使い、目的の動作になるまでデバッグすることができると思います。

    参考サイト:

    https://msdn.microsoft.com/ja-jp/library/tdb6bs3y.aspx

    2017年5月16日 13:02
  • Microsoft Translator API のhttp post 通信スレッドでも感じたことなのですが、Translator APIをどうこうする前に、C言語に対する理解が不足しているように見受けられます。

    コーディング・完成品の開発依頼であればこのフォーラムは不適切に思います。質問者さんはどうお考えなのでしょうか?

    2017年5月16日 22:00
  • ご参考
    https://m.chiebukuro.yahoo.co.jp/detail/q13174060198

    Jitta@わんくま同盟

    2017年5月17日 0:16