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