TsubuyakiSoup.as 認証できない不具合修正&API 1.1 対応化

TsubuyakiSoup.as 認証できない不具合&API 1.1 対応化。長いので一部のみ。

TsubuyakiSoup.as 認証できない不具合&API 1.1 対応化。長いので一部のみ。

  • hk1v
  • 2013/4/16 23:12
  • タグ:
  • タグはありません
// 一部のみ
#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