TsubuyakiSoup.as 認証できない不具合&API 1.1 対応化。長いので一部のみ。
TsubuyakiSoup.as 認証できない不具合&API 1.1 対応化。長いので一部のみ。
// 一部のみ #deffunc RESTAPI var p1, var p2, int p3, str p4, array p5 // 引数チェック&初期化 sdim p1 sdim p2 API = p4 if vartype(p5) != 2 : return 0 hConnect = 0 //InternetConnectのハンドル hRequest = 0 //HttpOpenRequestのハンドル API_statcode = 0 //リクエストの結果コード API_p1Length = 0 //データ長 API_rsize = 1024 //バッファ初期値 API_hsize = 0 //取得したバイト数が代入される変数 // メソッドの設定 if (p3 = 1) { Method = "POST" } else { Method = "GET" } // ポート&フラグの設定 UsePort = 443/*80*/ : RequestFlag = -2139082752// - 0x00800000 VersionStr = "1.1/" TokenStr = TS_AccessToken SigKey = TS_Consumer_Secret+" "+TS_AccessTokenSecret if (strmid(API,0,5) = "oauth") { VersionStr = "" if (API = "oauth/access_token") { //OAuth認証だったら、 repeat length(p5) if (p5(cnt) = "x_auth_mode=client_auth") : break if cnt = length(p5)-1 : TokenStr = TS_RequestToken : SigKey = TS_Consumer_Secret+" "+TS_RequestTokenSecret loop } } // シグネチャ生成 SigArrayMax = 6 + length(p5) sdim SigArray, 500, SigArrayMax SigNonce = RandomString(8,32) _time SigTime SigArray(0) = "oauth_consumer_key=" + TS_Consumer_Key SigArray(1) = "oauth_nonce=" + SigNonce SigArray(2) = "oauth_signature_method=HMAC-SHA1" SigArray(3) = "oauth_timestamp=" + SigTime SigArray(4) = "oauth_token="+ TokenStr SigArray(5) = "oauth_version=1.0" repeat SigArrayMax - 6 SigArray(6+cnt) = p5(cnt) loop //ソート SortString SigArray //"&"で連結 TransStr = ""+ Method +" https://api.twitter.com/"+ VersionStr + API +" " repeat SigArrayMax if SigArray(cnt) = "" : continue TransStr += SigArray(cnt) +"&" loop TransStr = strmid(TransStr, 0, strlen(TransStr)-1) Signature = SignatureEncode(TransStr, SigKey) // データ整形 if (p3 = 1) { //POST sdim PostStr, 1024; = "" repeat SigArrayMax PostStr += SigArray(cnt) +"&" loop PostStr += "oauth_signature="+ Signature PostStrLen = strlen(PostStr) AddUrl = "" } else { //GET PostStr = 0 PostStrLen = 0 AddUrl = "?" repeat SigArrayMax AddUrl += SigArray(cnt) +"&" loop AddUrl += "oauth_signature="+ Signature } //サーバへ接続 hConnect = _InternetConnect(TS_hInet, "api.twitter.com", UsePort, 0, 0, 3, 0, 0) if (hConnect) { //リクエストの初期化 hRequest = _HttpOpenRequest(hConnect, Method, VersionStr+API+AddUrl, "HTTP/1.1", 0, 0, RequestFlag, 0) if (hRequest) { //サーバへリクエスト送信 if ( _HttpSendRequest(hRequest, "Accept-Encoding: gzip, deflate;\nContent-Type: application/x-www-form-urlencoded", -1, PostStr, PostStrLen)) { //ヘッダを取得する変数の初期化 p2Size = 3000 sdim p2, p2Size //ヘッダの取得 if ( _HttpQueryInfo(hRequest, 22, p2, p2Size, 0) ) { //ヘッダの解析 notesel p2 logmes p2 repeat notemax noteget API_BufStr, cnt API_BufStr = getpath(API_BufStr, 16) API_buf = instr(API_BufStr, 0, getpath("Status: ", 16)) //ステータスコード if (API_Buf != -1) : API_statcode = int(strmid(API_BufStr, API_buf+8, 3)) API_buf = instr(API_BufStr, 0, getpath("Content-Length: ", 16)) //長さ if (API_Buf != -1) : API_p1Length = int(strmid(API_BufStr, -1, strlen(API_BufStr)-API_buf+16)) API_buf = instr(API_BufStr, 0, getpath("X-RateLimit-Limit: ", 16)) //60分間にAPIを実行できる回数 if (API_Buf != -1) : TS_RateLimit(0) = int(strmid(API_BufStr, -1, strlen(API_BufStr)-(API_buf+19))) API_buf = instr(API_BufStr, 0, getpath("X-RateLimit-Remaining: ", 16)) //APIを実行できる残り回数 if (API_Buf != -1) : TS_RateLimit(1) = int(strmid(API_BufStr, -1, strlen(API_BufStr)-(API_buf+23))) API_buf = instr(API_BufStr, 0, getpath("X-RateLimit-Reset: ", 16)) //リセットする時間 if (API_Buf != -1) : TS_RateLimit(2) = int(strmid(API_BufStr, -1, strlen(API_BufStr)-(API_buf+19))) loop noteunsel //入手可能なデータ量を取得 _InternetQueryDataAvailable hRequest, API_rsize, 0, 0 //バッファの初期化 sdim API_bufStr, API_rsize+1 sdim p1, API_p1Length+1 repeat _InternetReadFile hRequest, API_bufStr, API_rsize, API_hsize if (API_hsize = 0) : break p1 += strmid(API_bufStr, 0, API_hsize) await 0 loop logmes p1 } else { //ヘッダの取得ができなかった場合 API_statcode = -1 } } else { //サーバへリクエスト送信できなかった場合 API_statcode = -2 } //Requestハンドルの破棄 _InternetCloseHandle hRequest } else { //Requestハンドルを取得できなかった場合 API_statcode = -3 } //Connectハンドルの破棄 _InternetCloseHandle hConnect } else { //Connectハンドルを取得できなかった場合 API_statcode = -4 } return API_statcode