TsubuyakiSoup.as 認証できない不具合&API 1.1 対応化。長いので一部のみ。
TsubuyakiSoup.as 認証できない不具合&API 1.1 対応化。長いので一部のみ。
// 一部のみ#deffunc RESTAPI var p1, var p2, int p3, str p4, array p5// 引数チェック&初期化sdim p1sdim p2API = p4if vartype(p5) != 2 : return 0hConnect = 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// - 0x00800000VersionStr = "1.1/"TokenStr = TS_AccessTokenSigKey = TS_Consumer_Secret+" "+TS_AccessTokenSecretif (strmid(API,0,5) = "oauth") {VersionStr = ""if (API = "oauth/access_token") {//OAuth認証だったら、repeat length(p5)if (p5(cnt) = "x_auth_mode=client_auth") : breakif cnt = length(p5)-1 : TokenStr = TS_RequestToken : SigKey = TS_Consumer_Secret+" "+TS_RequestTokenSecretloop}}// シグネチャ生成SigArrayMax = 6 + length(p5)sdim SigArray, 500, SigArrayMaxSigNonce = RandomString(8,32)_time SigTimeSigArray(0) = "oauth_consumer_key=" + TS_Consumer_KeySigArray(1) = "oauth_nonce=" + SigNonceSigArray(2) = "oauth_signature_method=HMAC-SHA1"SigArray(3) = "oauth_timestamp=" + SigTimeSigArray(4) = "oauth_token="+ TokenStrSigArray(5) = "oauth_version=1.0"repeat SigArrayMax - 6SigArray(6+cnt) = p5(cnt)loop//ソートSortString SigArray//"&"で連結TransStr = ""+ Method +" https://api.twitter.com/"+ VersionStr + API +" "repeat SigArrayMaxif SigArray(cnt) = "" : continueTransStr += SigArray(cnt) +"&"loopTransStr = strmid(TransStr, 0, strlen(TransStr)-1)Signature = SignatureEncode(TransStr, SigKey)// データ整形if (p3 = 1) {//POSTsdim PostStr, 1024; = ""repeat SigArrayMaxPostStr += SigArray(cnt) +"&"loopPostStr += "oauth_signature="+ SignaturePostStrLen = strlen(PostStr)AddUrl = ""} else {//GETPostStr = 0PostStrLen = 0AddUrl = "?"repeat SigArrayMaxAddUrl += SigArray(cnt) +"&"loopAddUrl += "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 = 3000sdim p2, p2Size//ヘッダの取得if ( _HttpQueryInfo(hRequest, 22, p2, p2Size, 0) ) {//ヘッダの解析notesel p2logmes p2repeat notemaxnoteget API_BufStr, cntAPI_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)))loopnoteunsel//入手可能なデータ量を取得_InternetQueryDataAvailable hRequest, API_rsize, 0, 0//バッファの初期化sdim API_bufStr, API_rsize+1sdim p1, API_p1Length+1repeat_InternetReadFile hRequest, API_bufStr, API_rsize, API_hsizeif (API_hsize = 0) : breakp1 += strmid(API_bufStr, 0, API_hsize)await 0looplogmes 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