色々なコードを混ぜて作ったTwitter apiブラウザ

未完成故バグも多いです
色々な所からコードを引っ張ってきてるので不都合あれば削除します

未完成故バグも多いです
色々な所からコードを引っ張ってきてるので不都合あれば削除します

  • タグ:
  • タグはありません
//------------------------------------------------------------------------------
// デコード用のデータ作成 by 科学太郎
//==============================================================================
// @URL(https://msdn.microsoft.com/ja-jp/library/cc448053.aspx)→「MultiByteToWideChar」
// @URL(https://msdn.microsoft.com/ja-jp/library/cc448089.aspx)→「WideCharToMultiByte」
//------------------------------------------------------------------------------
#include "Kernel32.as"

//--------------------------------------
// 記号定数(API定数)
//--------------------------------------
#const global CP_ACP                    $00000000

//--------------------------------------
// メイン部
//--------------------------------------

    dim UnicodeTable1,($04FF-$0000+1)   ; 1280個×4バイト=  5Kバイト┐
    dim UnicodeTable2,($9FFF-$2000+1)   ;32768個×4バイト=128Kバイト├165Kバイト
    dim UnicodeTable3,($FFFF-$E000+1)   ; 8192個×4バイト= 32Kバイト┘

    ;作成
    MakeSJisToUnicode
    ;保存
    SaveBinFile "meta.bin"
    ;完了
    goto *koko
//--------------------------------------
// 全SJISコードのUnicode変換
//--------------------------------------
#deffunc MakeSJisToUnicode\
    local szUnicode,\
    local strBuff,\
    local posBuff
    ;初期化
    sdim strBuff,1024*100   ;100KB
    ;0x8140-0x9FFC
    repeat($9F-$81+1),$81:c=cnt
    repeat($FC-$40+1),$40:d=cnt
        if(d==$7F):continue
        poke strBuff,posBuff,c:posBuff++
        poke strBuff,posBuff,d:posBuff++
    loop
    loop
    ;0xE040-0xFCFC
    repeat($FC-$E0+1),$E0:c=cnt
    repeat($FC-$40+1),$40:d=cnt
        if(d==$7F):continue
        poke strBuff,posBuff,c:posBuff++
        poke strBuff,posBuff,d:posBuff++
    loop
    loop
    poke strBuff,posBuff,$00
    ;SJIS⇒Unicode
    sdim szUnicode,posBuff+2
    MultiByteToWideChar CP_ACP,0,varptr(strBuff),-1,varptr(szUnicode),(posBuff+2)/2
    ;テーブル作成
    repeat(stat-1)
        c=peek(szUnicode,cnt*2+0)
        d=peek(szUnicode,cnt*2+1)
        k=(d<<8)|c
        c=peek(strBuff,cnt*2+0)
        d=peek(strBuff,cnt*2+1)
        if($0000<=k)and(k<=$04FF):UnicodeTable1(k-$0000)=(c<<8)|d:continue
        if($2000<=k)and(k<=$9FFF):UnicodeTable2(k-$2000)=(c<<8)|d:continue
        if($E000<=k)and(k<=$FFFF):UnicodeTable3(k-$E000)=(c<<8)|d:continue
    loop
    return
//--------------------------------------
// バイナリ・ファイルに書き込む
//--------------------------------------
#deffunc SaveBinFile str _fname_
    bsave(_fname_),UnicodeTable1,-1
    bsave(_fname_),UnicodeTable2,-1,length(UnicodeTable1)*4
    bsave(_fname_),UnicodeTable3,-1,length(UnicodeTable1)*4+length(UnicodeTable2)*4
    return
//--------------------------------------
// バイナリ・ファイルを読み込む
//--------------------------------------
#deffunc LoadBinFile str _fname_
    bload(_fname_),UnicodeTable1,-1
    bload(_fname_),UnicodeTable2,-1,length(UnicodeTable1)*4
    bload(_fname_),UnicodeTable3,-1,length(UnicodeTable1)*4+length(UnicodeTable2)*4
    return
//------------------------------------------------------------------------------
// End of sample215a(デコード用のデータ作成).hsp
//------------------------------------------------------------------------------
*koko
#define CONSUMER_KEY 	""
#define CONSUMER_SECRET	""
//CONSUMER_KEYは https://apps.twitter.com/ から取得できます
//======================================================================
//    TsubuyakiSoup_mod
//----------------------------------------------------------------------
//    HSPからTwitterを操作するモジュール。
//    OAuthに対応。API1.1へ対応。画像付きツイート対応。
//----------------------------------------------------------------------
//  Version : 2.2
//  Author : Takaya
//	Modification : kanahiron
//  CreateDate : 10/07/29
//  LastUpdate : 17/06/07
//======================================================================
/*  [HDL module infomation]

%dll
TsubuyakiSoup

%ver
2.2

%date
2017/06/07

%note
TsubuyakiSoup_mod.asをインクルードすること。

%port
Win

%*/

#include "encode.as"
#undef                  sjis2utf8n(%1, %2)
#define global          sjis2utf8n(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_UTF_8
#undef                  utf8n2sjis(%1)
#define global ctype    utf8n2sjis(%1)     _ToSJIS@mod_encode(%1, CODEPAGE_UTF_8,  CODEPAGE_S_JIS)

#module tCup

#uselib "advapi32.dll"
#cfunc _CryptAcquireContext "CryptAcquireContextA" var, sptr, sptr, int, int
#cfunc _CryptCreateHash "CryptCreateHash" sptr, int, int, int, var
#cfunc _CryptHashData "CryptHashData" sptr, sptr, int, int
#cfunc _CryptSetHashParam "CryptSetHashParam" sptr, int, var, int
#cfunc _CryptGetHashParam "CryptGetHashParam" sptr, int, sptr, var, int
#cfunc _CryptImportKey "CryptImportKey" sptr, var, int, int, int, var
#func _CryptDestroyKey "CryptDestroyKey" int
#func _CryptDestroyHash "CryptDestroyHash" int
#func _CryptReleaseContext "CryptReleaseContext" int, int
#cfunc _CryptDeriveKey "CryptDeriveKey" int, int, int, int, var
#cfunc _CryptEncrypt "CryptEncrypt" int, int, int, int, int, var, int
#cfunc _CryptDecrypt "CryptDecrypt" int, int, int, int, var, var
//---------------
//  wininet.dll
//---------------
#uselib "wininet.dll"
#cfunc _InternetOpen "InternetOpenA" sptr, int, sptr, sptr, int
#cfunc _InternetOpenUrl "InternetOpenUrlA" int, str, sptr, int, int, int
#func _InternetReadFile "InternetReadFile" int, var, int, var
#func _InternetCloseHandle "InternetCloseHandle" int
#cfunc _InternetConnect "InternetConnectA" int, str, int, sptr, sptr, int, int, int
#cfunc _HttpOpenRequest "HttpOpenRequestA" int, sptr, str, sptr, sptr, sptr, int, int
#cfunc _HttpSendRequest "HttpSendRequestA" int, sptr, int, sptr, int
#cfunc _HttpQueryInfo "HttpQueryInfoA" int, int, var, var, int
#func _InternetQueryDataAvailable "InternetQueryDataAvailable" int, var, int, int
#func _InternetSetOption "InternetSetOptionA" int, int, int, int
//---------------
//  crtdll.dll
//---------------
#uselib "crtdll.dll"
#func _time "time" var

#define HP_HMAC_INFO                            0x0005
#define PLAINTEXTKEYBLOB                        0x8
#define CUR_BLOB_VERSION                        2
#define PROV_RSA_FULL                           1
#define CRYPT_IPSEC_HMAC_KEY                    0x00000100
#define HP_HASHVAL                              0x0002
#define ALG_CLASS_HASH                          (4 << 13)
#define ALG_TYPE_ANY                            (0)
#define ALG_SID_SHA1                            4
#define ALG_SID_HMAC                            9
#define ALG_CLASS_DATA_ENCRYPT                  (3 << 13) // 0x6000
#define ALG_TYPE_BLOCK                          (3 << 9)  // 0x0600
#define ALG_SID_RC2                             2         // 0x0002
#define CALG_SHA1                               (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
#define CALG_HMAC                               (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC)
#define CALG_RC2                                (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_RC2)

#define CRYPT_NEWKEYSET			$00000008
#define CRYPT_VERIFYCONTEXT     $F0000000
#define CRYPT_DELETEKEYSET		$00000010
#define CRYPT_MACHINE_KEYSET	$00000020
//
#define INTERNET_OPEN_TYPE_DIRECT               1
#define INTERNET_OPTION_CONNECT_TIMEOUT         2
#define INTERNET_OPTION_HTTP_DECODING           65
#define INTERNET_DEFAULT_HTTPS_PORT             443
#define INTERNET_SERVICE_HTTP                   3
#define INTERNET_FLAG_RELOAD                    0x80000000
#define INTERNET_FLAG_SECURE                    0x00800000
#define INTERNET_FLAG_NO_CACHE_WRITE            0x04000000
#define INTERNET_FLAG_DONT_CACHE                INTERNET_FLAG_NO_CACHE_WRITE
#define INTERNET_FLAG_IGNORE_CERT_DATE_INVALID  0x00002000
#define INTERNET_FLAG_IGNORE_CERT_CN_INVALID    0x00001000

#define HTTP_QUERY_MIME_VERSION 0
#define HTTP_QUERY_CONTENT_TYPE 1
#define HTTP_QUERY_CONTENT_TRANSFER_ENCODING 2
#define HTTP_QUERY_CONTENT_ID 3
#define HTTP_QUERY_CONTENT_DESCRIPTION 4
#define HTTP_QUERY_CONTENT_LENGTH 5
#define HTTP_QUERY_CONTENT_LANGUAGE 6
#define HTTP_QUERY_ALLOW 7
#define HTTP_QUERY_PUBLIC 8
#define HTTP_QUERY_DATE 9
#define HTTP_QUERY_EXPIRES 10
#define HTTP_QUERY_LAST_MODIFIED 11
#define HTTP_QUERY_MESSAGE_ID 12
#define HTTP_QUERY_URI 13
#define HTTP_QUERY_DERIVED_FROM 14
#define HTTP_QUERY_COST 15
#define HTTP_QUERY_LINK 16
#define HTTP_QUERY_PRAGMA 17
#define HTTP_QUERY_VERSION 18
#define HTTP_QUERY_STATUS_CODE 19
#define HTTP_QUERY_STATUS_TEXT 20
#define HTTP_QUERY_RAW_HEADERS 21
#define HTTP_QUERY_RAW_HEADERS_CRLF 22
#define HTTP_QUERY_CONNECTION 23
#define HTTP_QUERY_ACCEPT 24
#define HTTP_QUERY_ACCEPT_CHARSET 25
#define HTTP_QUERY_ACCEPT_ENCODING 26
#define HTTP_QUERY_ACCEPT_LANGUAGE 27
#define HTTP_QUERY_AUTHORIZATION 28
#define HTTP_QUERY_CONTENT_ENCODING 29
#define HTTP_QUERY_FORWARDED 30
#define HTTP_QUERY_FROM 31
#define HTTP_QUERY_IF_MODIFIED_SINCE 32
#define HTTP_QUERY_LOCATION 33
#define HTTP_QUERY_ORIG_URI 34
#define HTTP_QUERY_REFERER 35
#define HTTP_QUERY_RETRY_AFTER 36
#define HTTP_QUERY_SERVER 37
#define HTTP_QUERY_TITLE 38
#define HTTP_QUERY_USER_AGENT 39
#define HTTP_QUERY_WWW_AUTHENTICATE 40
#define HTTP_QUERY_PROXY_AUTHENTICATE 41
#define HTTP_QUERY_ACCEPT_RANGES 42
#define HTTP_QUERY_SET_COOKIE 43
#define HTTP_QUERY_COOKIE 44
#define HTTP_QUERY_REQUEST_METHOD 45
#define HTTP_QUERY_MAX 45
#define HTTP_QUERY_CUSTOM 65535
#define HTTP_QUERY_FLAG_REQUEST_HEADERS 0x80000000
#define HTTP_QUERY_FLAG_SYSTEMTIME 0x40000000
#define HTTP_QUERY_FLAG_NUMBER 0x20000000
#define HTTP_QUERY_FLAG_COALESCE 0x10000000
#define HTTP_QUERY_MODIFIER_FLAGS_MASK (HTTP_QUERY_FLAG_REQUEST_HEADERS|HTTP_QUERY_FLAG_SYSTEMTIME|HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_FLAG_COALESCE)
#define HTTP_QUERY_HEADER_MASK (~HTTP_QUERY_MODIFIER_FLAGS_MASK)


//------------------------------
//  定数
//------------------------------
//HTTPメソッド
#define global METHOD_GET    0
#define global METHOD_POST   1
#define global METHOD_DELETE 2
#define global METHOD_PUT    3
#define global FORMAT_JSON   0
#define global FORMAT_XML    1




//============================================================
/*  [HDL symbol infomation]

%index
tCupInit
TsubuyakiSoupの初期化

%prm
p1, p2, p3
p1 = 文字列      : ユーザエージェント
p2 = 文字列      : Consumer Key
p3 = 文字列      : Consumer Secret
p4 = 0~(30)     : タイムアウトの時間(秒)

%inst
TsubyakiSoupモジュールの初期化をします。Twitter操作命令の使用前に呼び出す必要があります。

p1にユーザエージェントを指定します。ユーザエージェントを指定していないとSearchAPIなどで厳しいAPI制限を受けることがあります。

p2にConsumer Keyを、p3にConsumer Secretを指定してください。Consumer KeyとConsumer Secretは、Twitterから取得する必要があります。詳しくは、リファレンスをご覧ください。

p4にはTwitterと通信する際のタイムアウトの時間を秒単位で指定してください。

%href
TS_End

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#deffunc _tCupInit str p1, str p2, str p3, int p4
	//各種変数の初期化
;	rateLimit(0) = -1		// 15分間にAPIを実行できる回数
;	rateLimit(1) = -1		// APIを実行できる残り回数
;	rateLimit(2) = -1		// リセットする時間
	accessToken = ""		// AccessToken
	accessSecret = ""		// AccessTokenSecret
	requestToken = ""		// RequestToken
	requestSecret = ""		// RequestTokenSecret
	consumerKey = p2		// ConsumerKey
	consumerSecret = p3		// ConsumerSecret
	screenName = ""
	userId = ""
	formatType = "json"
	responseHeader = ""
	responseBody = ""
	timeOutTime = p4*1000
	gzipFlag = 1 // true /-------------------
	//インターネットオープン
	hInet = _InternetOpen( p1, INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0)
	if hInet = 0:return -1
	_InternetSetOption hInet, INTERNET_OPTION_CONNECT_TIMEOUT, varptr(timeOutTime), 4
	_InternetSetOption hInet, INTERNET_OPTION_HTTP_DECODING, varptr(gzipFlag), 4
return 0
#define global tCupInit(%1,%2,%3,%4=30) _tCupInit %1, %2, %3, %4
//============================================================




//============================================================
/*  [HDL symbol infomation]

%index
tCupWash
TsubuyakiSoupの終了処理

%inst
TsubyakiSoupモジュールの終了処理を行ないます。
プログラム終了時に自動的に呼び出されるので明示的に呼び出す必要はありません。

%href
TS_Init

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#deffunc tCupWash onexit
	//ハンドルの破棄
	if (hRequest) : _InternetCloseHandle hRequest
	if (hConnect) : _InternetCloseHandle hConnect
	if (hInet) : _InternetCloseHandle hInet
return
//============================================================



//============================================================
/*  [HDL symbol infomation]

%index
getHmacSha1
HMAC-SHA1で署名を生成

%prm
(p1, p2)
p1 = 文字列    : 署名化する文字列
p2 = 文字列    : 鍵とする文字列

%inst
SHA-1ハッシュ関数を使用したハッシュメッセージ認証コード(HMAC)を返します。

p1に署名化する文字列を指定します。

署名化するための鍵(キー)は、p2で文字列で指定します。

%href
sigEncode

%group
TsubuyakiSoup補助関数

%*/
//------------------------------------------------------------
#deffunc getHmacSha1 str _p1, str _p2, var ghc_dest

	ghc_p1 = _p1
	ghc_p2 = _p2

	hProv = 0
	hKey  = 0
	hHash = 0

	ghc_dataLength = 0
	sdim hmacInfo,14
	lpoke hmacInfo, 0, CALG_SHA1
	
	ghc_p2Length = strlen(ghc_p2)
	dim keyBlob, 3+(ghc_p2Length/4)+1
	
	poke keyBlob, 0, PLAINTEXTKEYBLOB
	poke keyBlob, 1, CUR_BLOB_VERSION
	wpoke keyBlob, 2, 0
	lpoke keyBlob, 4, CALG_RC2
	lpoke keyBlob, 8, ghc_p2Length
	memcpy keyBlob, ghc_p2, ghc_p2Length, 12, 0

	sdim ghc_dest, 20
	ghc_dest = "Error"

	//コンテキストの取得
	if ( _CryptAcquireContext(hProv, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) ) {
		//キーのインポート
		if ( _CryptImportKey(hProv, keyBlob, (12+ghc_p2Length), 0, CRYPT_IPSEC_HMAC_KEY, hKey) ) {
			if ( _CryptCreateHash(hProv, CALG_HMAC, hKey, 0, hHash) ) {
				if ( _CryptSetHashParam(hHash, HP_HMAC_INFO, hmacInfo, 0) ) {
					if ( _CryptHashData(hHash, ghc_p1, strlen(ghc_p1), 0) ) {
						if ( _CryptGetHashParam(hHash, HP_HASHVAL, 0, ghc_dataLength, 0) ) {
							ghc_dest = ""
							if ( _CryptGetHashParam(hHash, HP_HASHVAL, varptr(ghc_dest), ghc_dataLength, 0) ) {
							}
						}
					}
				}
				//ハッシュハンドルの破棄
				_CryptDestroyHash hHash
			}
			//キーハンドルの破棄
			_CryptDestroyKey hKey
		}
		//ハンドルの破棄
		_CryptReleaseContext hProv, 0
	}

return 
//============================================================




//============================================================
/*  [HDL symbol infomation]

%index
sigEncode
OAuth/xAuth用シグネチャを生成

%prm
(p1, p2)
p1 = 文字列    : 署名化する文字列
p2 = 文字列    : 鍵とする文字列

%inst
OAuth/xAuth用の署名を返します。

p1に署名化する文字列を指定します。

署名化するための鍵(キー)は、p2で文字列で指定します。

Twitterのシグネチャ生成の仕様より、
文字コードUTF-8でURLエンコードした文字列(p1)を、同じくURLエンコードした文字列(p2)をキーとしてHAMAC-SHA1方式で生成した署名を、BASE64エンコードしたうえURLエンコードしています。

%href
HMAC_SHA1

%group
TsubuyakiSoup補助関数

%*/
//------------------------------------------------------------
#defcfunc sigEncode str se_p1, str se_p2
	//utf-8へ変換
	sjis2utf8n SigTmp, se_p1
	sjis2utf8n SecretTmp, se_p2
	//URLエンコード
	SigEnc = form_encode(SigTmp, 0)
	SecretEnc = form_encode(SecretTmp, 0)
	getHmacSha1 SigEnc, SecretEnc, HmacSha1
	if (HmacSha1 == "Error"):return "Error"
	sdim base64HmacSha1,40
	Base64Encode HmacSha1,20,base64HmacSha1
return form_encode(str(base64HmacSha1), 0)
//============================================================


// str   p1 API
// array p2 argument
// int   p3 http method
#deffunc execRestApi str era_p1, array era_p2, int era_p3

	api = era_p1
	
	if (api != "media/upload.json") {
		arrayCopy era_p2, arguments
		argumentLength = length(arguments)
	} else {
		exist era_p2
		picsize = strsize
		sdim picdata,picsize+1
		bload era_p2,picdata
		sdim base64data,int(1.5*picsize)
		Base64Encode picdata,picsize,base64data
	}
	
	methodType = era_p3
	
	switch methodType
		case METHOD_GET
			method = "GET"
			swbreak
		case METHOD_POST
			method = "POST"
			swbreak
		case METHOD_PUT
			method = "PUT"
			swbreak
		case METHOD_DELETE
			method = "DELETE"
			swbreak
		default
			return 0
			swbreak
	swend
	
	sigArrayLength = 6+argumentLength
	sdim sigArray, 500, sigArrayLength

	hConnect = 0	// InternetConnectのハンドル
	hRequest = 0	// HttpOpenRequestのハンドル
	statcode = 0	// リクエストの結果コード
	dataLength = 0	// データ長
	rsize = 1024	// バッファ初期値
	hsize = 0		// 取得したバイト数が代入される変数

	apiVersion = "1.1"	// TwitterAPIのバージョン
	
	RequestURL = "api.twitter.com"
	if (api = "media/upload.json") {
		RequestURL = "upload.twitter.com"
	}

	apiUrl = apiVersion +"/"+ api
	transStr = method +" https://"+RequestURL+"/"+ apiVersion +"/"+ api +" "
	if (strmid(api,0,5) = "oauth") {
		apiUrl = api
		transStr = method +" https://api.twitter.com/"+ api +" "
	}
	
	usePort = 443
	requestFlag  = INTERNET_FLAG_RELOAD
	requestFlag |= INTERNET_FLAG_SECURE
	requestFlag |= INTERNET_FLAG_DONT_CACHE
	requestFlag |= INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
	requestFlag |= INTERNET_FLAG_IGNORE_CERT_CN_INVALID

	tokenStr = accessToken
	sigKey = consumerSecret+" "+accessSecret
	logmes "sigkey="+sigKey
	if (api = "oauth/access_token") {
		tokenStr = requestToken
		sigKey = consumerSecret+" "+requestSecret
	}

//  シグネチャ生成
	
	sigNonce = getRandomString(8, 32)
	_time sigTime
	sigArray(0) = "oauth_consumer_key=" + consumerKey
	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"
	
	if (api != "media/upload.json") {
		repeat argumentLength
			sigArray(6+cnt) = arguments(cnt)
		loop
	}
	
	_sortStrArray sigArray, 0, sigArrayLength-1

	repeat sigArrayLength
		logmes sigArray(cnt)
		if sigArray(cnt) = "" : continue
		transStr += sigArray(cnt) +"&"
	loop
	
	transStr = strmid(transStr, 0, strlen(transStr)-1)
	signature = sigEncode(transStr, sigKey)
	
	
	
	if (methodType = METHOD_POST) {
	
		sdim boundary,128
		boundary = "-------------"+getRandomString(24, 32)
			
		sdim RequestHeader,1024*2
		RequestHeader = "Authorization: OAuth "
		
		repeat sigArrayLength
			RequestHeader += sigArray(cnt)+"," 
		loop
		
		RequestHeader += "oauth_signature=" +signature
		RequestHeader += "\r\nAccept-Encoding: gzip, deflate;"
		if (api = "media/upload.json") {
			RequestHeader += "\r\nContent-Type: multipart/form-data; boundary= "+boundary
		} else {
			RequestHeader += "\r\nContent-Type: application/x-www-form-urlencoded"
		}
		RequestHeader += "\r\n"
		RequestHeaderLength = strlen(RequestHeader)
	
		
		if (api = "media/upload.json") {
			sdim PostData,1024*4+strlen(base64data)
			PostData += "--"+boundary+"\n"
			PostData += "Content-Disposition: form-data; name=\"media_data\";\n\n"
			PostData += base64data
			PostData += "\n"
			PostData += "--"+boundary+"--\n"
		} else {
			sdim PostData,1024*4
			repeat argumentLength
				PostData += arguments(cnt)+"&"
			loop
			PostData = strmid(PostData, 0, strlen(PostData)-1) //後ろの&を除去
		}
		PostDataLength = strlen(PostData)
	}
	
	if (methodType = METHOD_GET) {
		apiUrl += "?"
		repeat sigArrayLength
			apiUrl += sigArray(cnt) +"&"
		loop
		apiUrl += "oauth_signature=" +signature
	
		RequestHeader = "Accept-Encoding: gzip, deflate;\nContent-Type: application/x-www-form-urlencoded"
		RequestHeaderLength = strlen(RequestHeader)
		PostData = 0
		PostDataLength = 0
	}
	
	
	//サーバへ接続
	hConnect = _InternetConnect(hInet, RequestURL, INTERNET_DEFAULT_HTTPS_PORT, 0, 0, INTERNET_SERVICE_HTTP, 0, 0)
	if (hConnect = 0) {
		//Connectハンドルを取得できなかった場合
		return -4
	}
	
	//リクエストの初期化
	hRequest = _HttpOpenRequest(hConnect, method, apiUrl, "HTTP/1.1", 0, 0, requestFlag, 0)
	if (hRequest = 0) {
		//Requestハンドルを取得できなかった場合
		_InternetCloseHandle hConnect
		return -3
	}
	
	//サーバへリクエスト送信
	if ( _HttpSendRequest(hRequest, RequestHeader, RequestHeaderLength, PostData, PostDataLength)) {
		//ヘッダを取得する変数の初期化
		responseHeaderSize = 3000
		sdim responseHeader, responseHeaderSize
		//ヘッダの取得
		if ( _HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, responseHeader, responseHeaderSize, 0) ) {
			//ヘッダの解析
			notesel responseHeader
			repeat notemax
				noteget headerLine, cnt
				headerTokenPos = instr(headerLine, 0, "status: ")				//ステータスコード
				if (headerTokenPos != -1) : statcode = int(strmid(headerLine, headerTokenPos+8, 3))
				headerTokenPos = instr(headerLine, 0, "content-length: ")		//長さ
				if (headerTokenPos != -1) : responseBodyLength = int(strmid(headerLine, -1, strlen(headerLine)-headerTokenPos+16))
;				API_buf = instr(API_BufStr, 0, "X-RateLimit-Limit: ")		//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, "X-RateLimit-Remaining: ")	//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, "X-RateLimit-Reset: ")		//リセットする時間
;				if (API_Buf != -1) : TS_RateLimit(2) = int(strmid(API_BufStr, -1, strlen(API_BufStr)-(API_buf+19)))
			loop
			noteunsel
			logmes ""+responseBodyLength
			//入手可能なデータ量を取得
			_InternetQueryDataAvailable hRequest, rsize, 0, 0
			//バッファの初期化
			logmes "srize : "+ rsize
			sdim responseBuffer, rsize+1
			sdim responseBody, 10240
			repeat 
				_InternetReadFile hRequest, responseBuffer, rsize, hsize
				if (hsize = 0) : break 
				responseBody += strmid(responseBuffer, 0, hsize)
				await 0
			loop
		} else {
			//ヘッダの取得ができなかった場合
			return -1
		}
		//Requestハンドルの破棄
		_InternetCloseHandle hRequest
	} else {
		//サーバへリクエスト送信できなかった場合
		return -2
	}
	
	sdim picdata
	sdim base64data
	sdim RequestHeader
	sdim PostData

return statcode

//===========================================================

#defcfunc getResponseHeader
return responseHeader

#defcfunc getResponseBody
return responseBody


//============================================================
/*  [HDL symbol infomation]

%index
SetAccessToken
AccessTokenとSecretを設定

%prm
p1, p2
p1 = 文字列      : Access Token
p2 = 文字列      : Access Secret

%inst
TsubuyakiSoupにAccess TokenとAccess Secretを設定します。

p1にAccess Tokenを、p2にAccess Secretを指定します。

このAccess TokenとAccess Secretは、GetAccessToken命令かGetxAuthToken命令で取得することができます。詳しくは、リファレンスをご覧ください。

%href
GetAccessToken
GetxAuthToken

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#deffunc setAccessToken str sat_p1, str sat_p2
	accessToken = sat_p1
	accessSecret = sat_p2
return
//============================================================




//============================================================
/*  [HDL symbol infomation]

%index
setRequestToken
RequestTokenとSecretを設定

%prm
p1, p2
p1 = 文字列      : Request Token
p2 = 文字列      : Request Secret

%inst
TsubuyakiSoupにRequest TokenとRequest Secretを設定します。

p1にRequest Tokenを、p2にRequest Secretを指定します。


%href
setAccessToken

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#deffunc setRequestToken str srt_p1, str srt_p2
	requestToken = srt_p1
	requestSecret = srt_p2
return
//============================================================



//============================================================
/*  [HDL symbol infomation]

%index
getRequestToken
RequestTokenとSecretを設定

%prm
()

%inst



%href
setAccessToken

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#defcfunc getRequestToken
return requestToken
//============================================================




//============================================================
/*  [HDL symbol infomation]

%index
getRequestSecret
RequestTokenとSecretを設定

%prm
()

%inst



%href
setAccessToken

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#defcfunc getRequestSecret
return requestSecret
//============================================================




//============================================================
/*  [HDL symbol infomation]

%index
setConsumerToken
AccessTokenとSecretを設定

%prm
p1, p2
p1 = 文字列      : Consumer Token
p2 = 文字列      : Consumer Secret

%inst
TsubuyakiSoupにConsumer TokenとConsumer Secretを設定します。

p1にConsumer Tokenを、p2にConsumer Secretを指定します。

%href
tCupInit

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#deffunc setConsumerToken str sct_p1, str sct_p2
	consumerToken = sct_p1
	consumerSecret = sct_p2
return
//============================================================




//============================================================
/*  [HDL symbol infomation]

%index
setUserInfo
ユーザ情報を設定

%prm
p1, p2
p1 = 文字列      : ユーザ名(スクリーン名)
p2 = 文字列      : ユーザID

%inst
TsubuyakiSoupにユーザ名(スクリーン名)とユーザIDを設定します。

p1にユーザ名(スクリーン名)を、p2にユーザIDを指定します。

TsubuyakiSoup2からユーザIDも文字列で処理しています。

%href
GetAccessToken
GetxAuthToken

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#deffunc setUserInfo str sui_p1, str sui_p2
	screenName = sui_p1
	userId = sui_p2
return
//============================================================



#global



#module

#uselib "kernel32.dll"
#cfunc _MultiByteToWideChar "MultiByteToWideChar" int, int, sptr, int, int, int

/*------------------------------------------------------------*/
//1バイト・2バイト判定
//
//	isByte(p1)
//		p1...判別文字コード
//		[0:1byte/1:2byte]
//
#defcfunc isByte int p1
return (p1>=129 and p1<=159) or (p1>=224 and p1<=252)
/*------------------------------------------------------------*/




// quick sort
// http://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88
#deffunc _sortStrArray array p1, int p2, int p3
	p = p1((p2+p3)/2)
	i = p2
	j = p3

	repeat
		// i
		repeat
			if strcmp(p1(i), p) >= 0 : break
			i++
		loop
		// j
		repeat
			if strcmp(p1(j), p) <= 0 : break
			j--
		loop

		// 入れ替え

		if (i < j) {
			tmp = p1(i)
			p1(i) = p1(j)
			p1(j) = tmp
		} else {
			break
		}
		i++
		j--
	loop
	
	if ( i-p2 > 1 ) : _sortStrArray p1, p2, i-1
	if ( p3-j > 1 ) : _sortStrArray p1, j+1, p3
return



#defcfunc strcmp str _p1, str _p2

	p1n = _p1
	p2n = _p2
	
	p1v = peek(p1n, 0)
	p2v = peek(p2n, 0)
	n = 0
	while (p1v = p2v)
		if (p1v = 0 or p2v = 0) : _break
	
		n++
		p1v = peek(p1n, n)
		p2v = peek(p2n, n)
	wend
return p1v - p2v



#deffunc arrayCopy array ary1, array ary2
	dimtype ary2, vartype(ary1), length(ary1)
	foreach ary1
		ary2(cnt) = ary1(cnt)
	loop
return



/*------------------------------------------------------------*/
//半角・全角含めた文字数を取り出す
//
//	mb_strmid(p1, p2, p3)
//		p1...取り出すもとの文字列が格納されている変数名
//		p2...取り出し始めのインデックス
//		p3...取り出す文字数
//
#defcfunc mb_strmid var p1, int p2, int p3
	if vartype != 2 : return ""
	s_size = strlen(p1)
	trim_start = 0
	trim_num = 0
	repeat p2
		if (Is_Byte(peek(p1,trim_start))) : trim_start++
		trim_start++
	loop
	repeat p3
		if (Is_Byte(peek(p1,trim_start+trim_num))) : trim_num++
		trim_num++
	loop
return strmid(p1,trim_start,trim_num)




//p2 半角スペースの処理  0 : '&'  1 : '%20'
#defcfunc form_encode str p1, int p2
/*
09 az AZ - . _ ~
はそのまま出力
*/
fe_str = p1
fe_p1Long = strlen(p1)
sdim fe_val, fe_p1Long*3
repeat fe_p1Long
	fe_flag = 0
	fe_tmp = peek(fe_str, cnt)
	if (('0' <= fe_tmp)&('9' >= fe_tmp)) | (('A' <= fe_tmp)&('Z' >= fe_tmp)) | (('a' <= fe_tmp)&('z' >= fe_tmp)) | (fe_tmp = '-') | (fe_tmp = '.') | (fe_tmp = '_') | (fe_tmp = '~') :{
		poke fe_val, strlen(fe_val), fe_tmp
	} else {
		if fe_tmp = ' ' {
			if p2 = 0 : fe_val += "&"
			if p2 = 1 : fe_val += "%20"	//空白処理
		} else {
			fe_val += "%" + strf("%02X",fe_tmp)
		}
	}
loop
return fe_val

//ランダムな文字列を発生させる
//p1からp2文字まで
#defcfunc getRandomString int p1, int p2
;randomize
RS_Strlen = rnd(p2-p1+1) + p1
sdim RS_val, RS_Strlen
repeat RS_Strlen
	RS_rnd = rnd(3)
	if RS_rnd = 0 : RS_s = 48 + rnd(10)
	if RS_rnd = 1 : RS_s = 65 + rnd(26)
	if RS_rnd = 2 : RS_s = 97 + rnd(26)
	poke RS_val, cnt, RS_s
loop
return RS_val

#global


//================================================================================
//【名    称】  mbase64 Version 1.00
//【制作者名】 イノビア 
//【動作環境】  Windows 2000 ,XP ,Vista ,7 (HSP3用のモジュールです)
//【公 開 日】  2010.01.26
//【更 新 日】 2010.01.26
//【開発言語】 HSP 3.2a + Microsoft Visual C++ 2008 Express Edition (マシン語のところのみ)
//================================================================================
//サポートURL : http://homepage2.nifty.com/MJHS/ ひねくれソフト工房 管理人 イノビア
//================================================================================
// マシン語で Base64!

#module "_machinebase64_"

#uselib "kernel32.dll"
#func VirtualProtect "VirtualProtect" var,int,int,var
#define xdim(%1,%2) dim %1,%2: VirtualProtect %1,%2*4,$40,AZSD

#deffunc Base64Encode var src, int size, var dest

	base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
	xdim base64enc,54
	base64enc.0 = 0x51EC8B55, 0x10558B51, 0xC9335653, 0x33F63357, 0x0C4D39FF, 0x89FC4D89
	base64enc.6 = 0x8E0FF84D, 0x000000AC, 0x8B08458B, 0xB60FF85D, 0xE3C10704, 0x89C30B08
	base64enc.12 = 0xF983F845, 0x6A377502, 0x458B5912, 0x145D8BF8, 0xE083F8D3, 0x18048A3F
	base64enc.18 = 0xFF420288, 0x8346FC45, 0x0E754CFE, 0x420D02C6, 0x420A02C6, 0x4583F633
	base64enc.24 = 0xE98302FC, 0x33D37906, 0xF84D89C9, 0x474101EB, 0x7C0C7D3B, 0x01F983AB
	base64enc.30 = 0x036A527C, 0x2BC78B5F, 0x0C4589C1, 0x097EC085, 0x65C1C88B, 0x754908F8
	base64enc.36 = 0x59126AF9, 0x7F0C7D39, 0xF8458B12, 0xD3145D8B, 0x3FE083F8, 0x8818048A
	base64enc.42 = 0xC603EB02, 0xFF423D02, 0x8346FC45, 0x0E754CFE, 0x420D02C6, 0x420A02C6
	base64enc.48 = 0x4583F633, 0x834F02FC, 0xC87906E9, 0x5FFC458B, 0x0002C65E, 0x10C2C95B
	prm.0 = varptr(src), size, varptr(dest), varptr(base64)
	return callfunc(prm, varptr(base64enc), 4)
	
#deffunc Base64Decode var src, int size, var dest//,var d1,var d2,var d3,var d4

	base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
	xdim base64dec,56
	base64dec.0 = 0x51EC8B55, 0x8B565351, 0xC0331075, 0x33D23357, 0x0C4539FF, 0x89F84589
	base64dec.6 = 0x8E0FFC45, 0x0000008A, 0x8A084D8B, 0xD98A0F0C, 0xC141EB80, 0xFB8006E2
	base64dec.12 = 0x0F087719, 0xE983C9BE, 0x8A22EB41, 0x61EB80D9, 0x7719FB80, 0xC9BE0F08
	base64dec.18 = 0xEB47E983, 0x80D98A10, 0xFB8030EB, 0x0F0A7709, 0xC183C9BE, 0xEBD10B04
	base64dec.24 = 0x2BF9801C, 0xCA830575, 0x8012EB3E, 0x05752FF9, 0xEB3FCA83, 0x3DF98008
	base64dec.30 = 0x45FF2375, 0x03F883F8, 0x45011875, 0x59106AFC, 0xF8D3C28B, 0x83460688
	base64dec.36 = 0xF47908E9, 0xC033D233, 0xEB4006EB, 0x06FAC103, 0x0C7D3B47, 0xFF768C0F
	base64dec.42 = 0x046AFFFF, 0x85C82B59, 0xC1067EC9, 0x754906E2, 0xFC458BFA, 0x8359106A
	base64dec.48 = 0xDA8B03C0, 0x1E88FBD3, 0x08E98346, 0x452BF479, 0x06C65FF8, 0xE8835E00
	base64dec.54 = 0xC2C95B03, 0x00000010
	prm.0 = varptr(src), size, varptr(dest), varptr(base64)
	//prm.4 = varptr(d1),varptr(d2),varptr(d3),varptr(d4) ;<- debug
	return callfunc(prm, varptr(base64dec), 4)

#global

// jsonパーサ
// 旧バージョンのTsubuyakiSoup.hspから移植
#module jsonParse

#deffunc json_sel str p1
	if vartype(mssc) != vartype("comobj") {
		newcom mssc, "MSScriptControl.ScriptControl"
		mssc("Language") = "JScript"
	}
	sdim tmp, strlen(p1)+1
	sdim jsontext, strlen(p1)+1
	tmp = p1
	jsontext = utf8n2sjis(tmp)
	sdim tmp, 0
	mssc -> "addCode" "obj = "+ jsontext +";"
return

#defcfunc json_val str p1
	comres result
	mssc -> "Eval" "obj"+ p1 +" === null"
	if (result == -1) : return ""
	mssc -> "Eval" "obj"+ p1
return result

#defcfunc json_length str p1
	comres result
	mssc -> "Eval" "obj"+ p1 +".length"
return result

#deffunc json_unsel
	sdim jsontext,0
return

#global

#module
//============================================================
/*  [HDL symbol infomation]

%index
getAuthorizeAddress
アクセス許可を求めるURLを生成

%prm
()

%inst
ユーザにアクセス許可を求めるアドレスを生成し、戻り値として返します。

内部でTwitterと通信し、リクエストトークンを取得しています。リクエストトークンの取得に失敗した場合は、"Error"という文字列を返します。

%group
TwitterAPI操作関数

%*/
//------------------------------------------------------------
#defcfunc getAuthorizeAddress
	// アクセストークン取得
	sdim arguments
	arguments(0) = "oauth_callback=oob"
	execRestApi "oauth/request_token", arguments, METHOD_GET
	if stat != 200 : return "Error"
	// トークンの取り出し
	gaa_body = getResponseBody()
	;request_token
	TokenStart = instr(gaa_body, 0, "oauth_token=") + 12
	TokenEnd = instr(gaa_body, TokenStart, "&")
	requestToken = strmid(gaa_body, TokenStart, TokenEnd)
	;request_token_secret
	SecretStart = instr(gaa_body, 0, "oauth_token_secret=") + 19
	SecretEnd = instr(gaa_body, SecretStart, "&")
	requestSecret = strmid(gaa_body, SecretStart, SecretEnd)
	setRequestToken requestToken, requestSecret
return "https://api.twitter.com/oauth/authorize?oauth_token="+ requestToken
//============================================================


//============================================================
/*  [HDL symbol infomation]

%index
GetAccessToken
OAuthでAccessTokenとSecret取得

%prm
p1, p2, p3, p4
p1 = 変数        : Access Tokenを代入する変数
p2 = 変数        : Access Secretを代入する変数
p3 = 変数        : ユーザ情報を代入する変数
p4 = 文字列      : PINコード

%inst
TwitterAPI「oauth/access_token」を実行し、OAuth方式でAccess TokenとAccess Secretを取得します。

p1, p2にそれぞれAccess Token, Access Secretを代入する変数を指定してください。

p3には、ユーザ情報を代入する変数を指定してください。「ユーザID,ユーザ名」とカンマ区切りでユーザ情報が代入されます。

p4には、PINコードを指定してください。PINコードは、GetAuthorizeAdressで取得したURLにアクセスし、ユーザが「許可」ボタンを押したときに表示されます。詳しくは、リファレンスをご覧ください。

Access TokenとSecretは、一度取得すると何度も使用することができます(現在のTwitterの仕様では)。そのため、一度Access TokenとSecretを取得したら保存しておくことをおすすめします。
また、Access TokenとSecretはユーザ名とパスワードのようなものなので、暗号化して保存するなど管理には気をつけてください。OAuth/xAuthの詳しいことは、リファレンスをご覧ください。

%href
GetAuthorizeAdress
GetxAuthToken
SetAccessToken

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#deffunc publishAccessToken var p1, var p2, var p3, str p4
	sdim p1
	sdim p2
	sdim p3
	sdim arguments
	arguments(0) = "oauth_verifier=" + p4
	execRestApi "oauth/access_token", arguments, METHOD_POST
	statcode = stat

	pat_body = getResponseBody()
	if statcode = 200  {
		//トークンの取り出し
		;request_token
		TokenStart = instr(pat_body, 0, "oauth_token=") + 12
		TokenEnd = instr(pat_body, TokenStart, "&")
		p1 = strmid(pat_body, TokenStart, TokenEnd)
		;request_token_secret
		TokenStart = instr(pat_body, 0, "oauth_token_secret=") + 19
		TokenEnd = instr(pat_body, TokenStart, "&")
		p2 = strmid(pat_body, TokenStart, TokenEnd)
		;User情報
		TokenStart = instr(pat_body, 0, "user_id=") + 8
		TokenEnd = instr(pat_body, TokenStart, "&")
		p3 = strmid(pat_body, TokenStart, TokenEnd) +","
		TokenStart = instr(pat_body, 0, "screen_name=") + 12
		TokenEnd = strlen(pat_body)
		p3 += strmid(pat_body, TokenStart, TokenEnd)
	}
return statcode
//============================================================




#deffunc getMentionsTimeline int count

	sdim arguments
	arguments(0) = "count="+ count
	execRestApi "statuses/mentions_timeline.json", arguments, METHOD_GET
return stat


#deffunc getUserTimeline str screen_name, int count

	sdim arguments
	arguments(0) = "screen_name="+ screen_name
	arguments(1) = "count="+ count
	execRestApi "statuses/user_timeline.json", arguments, METHOD_GET
return stat


#deffunc getHomeTimeline int count

	sdim arguments
	arguments(0) = "count="+ count
	execRestApi "statuses/home_timeline.json", arguments, METHOD_GET
return stat

#deffunc getRetweetsOfMe int count

	sdim arguments
	arguments(0) = "count="+ count
	execRestApi "statuses/retweets_of_me.json", arguments, METHOD_GET
return stat


#deffunc getRetweets str id

	sdim arguments
	execRestApi "statuses/retweets/"+id+".json", arguments, METHOD_GET
return stat


#deffunc showStatus str id

	sdim arguments
	execRestApi "statuses/show/"+id+".json", arguments, METHOD_GET
return stat



#deffunc destoryStatus str id

	sdim arguments
	execRestApi "statuses/destroy/"+id+".json", arguments, METHOD_POST
return stat



#deffunc retweetStatus str id

	sdim arguments
	execRestApi "statuses/retweet/"+id+".json", arguments, METHOD_POST
return stat

#deffunc postfavo str idc

	sdim arguments
	ida = "id="+ idc
	idb = ida + "&include_entities=true"
	execRestApi "favorites/create.json", idb, METHOD_POST
	id =0
return stat

//============================================================
/*  [HDL symbol infomation]

%index
Tweet
ツイートする

%prm
p1, p2
p1 = 文字列      : ツイートする文字列
p2 = 文字列      : 返信(reply)対象のステータスID

%inst
TwitterAPI「statuses/update」を実行し、Twitterへ投稿します。結果はSetFormatType命令で指定したフォーマットで取得します。

p1にツイートする140字以内の文字列を指定してください。140字以上の場合、140字に丸めてからツイートされます。

p2に返信(reply)対象のステータスIDを指定することでどのステータスに対する返信かを明示できます。p2に空文字を指定するか省略した場合は、明示されません。
TwitterAPIの仕様上、存在しない、あるいはアクセス制限のかかっているステータスIDを指定した場合と、p1で指定した文字列に「@ユーザ名」が含まれない、あるいは@ユーザ名」で指定したユーザが存在しない場合は、無視されます。

TwitterAPIを実行した際のステータスコードはシステム変数statに代入されます。

API制限適用対象外のAPIを使用していますが、1日に1000回までという実行回数上限が設定されています(API以外からの投稿もカウント対象)。

%href
DelTweet
ReTweet

%group
TwitterAPI操作命令

%*/
//------------------------------------------------------------
#deffunc _Tweet str p1, str p2, str p3, str p4, str p5, str p6
	tmpBuf = p1
	tmpStr = ""

	//utf-8へ変換。
	sjis2utf8n tmpStr, tmpBuf
	//POST
	sdim arguments,256
	arguments(0) = "status="+ form_encode(tmpStr, 1)
	if p2 != "" : arguments(1) = "in_reply_to_status_id="+ p2
	if p3 != "" : arguments(2) = "media_ids="+form_encode(p3, 1)
	if p4 != "" : arguments(3) = p4
	if p5 != "" : arguments(4) = p5
	if p6 != "" : arguments(5) = p6
	
	execRestApi "statuses/update.json", arguments, METHOD_POST
return stat
#define global Tweet(%1, %2="", %3="", %4="", %5="", %6="") _Tweet %1, %2, %3, %4, %5, %6
//============================================================


#deffunc media_upload array p1 ,int p3,var p2
	
	sdim rawtext,512
	sdim p2,512
	sdim picname,256
	status = 0
	repeat p3
		exist p1(cnt)
		if strsize <= 0:status = -2:break
	
		picname = p1(cnt)
		execRestApi "media/upload.json", picname, METHOD_POST
		if stat != 200 :status = -1:break
		
		rawtext = "["+getResponseBody()+"]"
		json_sel rawText
		p2 += json_val("[0].media_id_string") + ","
		json_unsel
		await 50
	loop
	p2 = strmid(p2, 0, strlen(p2)-1)

return status

#global



#module
    #uselib "user32.dll"
    #func DrawText "DrawTextA" int,sptr,int,sptr,int
    #deffunc GetStrRect int p1, str p2, array p3
        rc = 0,0,0,0
        DrawText p1, p2, -1, varptr(rc), $00000400
        p3.0 = rc.2
        p3.1 = rc.3
        return
 
;文字列の挿入関数
;	StrInsert pstr, pstrin, in
;	pstrのバッファのインデックスinバイトにpstrinを挿入します。
;	挿入位置が2バイト文字の途中だったら2バイト文字の手前に挿入します。
#defcfunc StrInsert var pstr, var pstrin, int in
    if in<0 : ina = 0 : else : ina = in
    ;挿入位置が2バイト文字の後続バイトだったときの処理
    if MbsbType(pstr,ina)>1 : ina--
    return strmid(pstr, 0, ina) + pstrin + strmid(pstr, ina, strlen(pstr)-ina)
 #global
 
*Init
	title "いりの遊び場"
    dim UnicodeTable1,($04FF-$0000+1)   ; 1280個×4バイト=  5Kバイト┐
    dim UnicodeTable2,($9FFF-$2000+1)   ;32768個×4バイト=128Kバイト├165Kバイト
    dim UnicodeTable3,($FFFF-$E000+1)   ; 8192個×4バイト= 32Kバイト┘
*Main



	
   screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
    ;読み込む
    LoadUnicodeFile "meta.bin"
    if(stat<0):dialog "Unicodeファイルが見つかりません。",1,"確認":end
    font "BIZ UD明朝",12
	
	sdim s1,1024
    sdim s2,1024
exist "meta.hsp"
	if (strsize < 0){
	
    tCupInit "testClient", CONSUMER_KEY, CONSUMER_SECRET, 10
	
	address = getAuthorizeAddress()
	
	response = "#####  HEADER  ######\n"+getResponseHeader()+"\n\n#####  BODY  #####\n"+getResponseBody()
	
	exec address,16
	PIN = ""
	pos 0,0
	mes "表示されたパスワードを入力してください"
	input PIN,100,20
	button "OK",*ok2
	stop
	
*ok2
	
	userdata = ""
	ACCESS_TOKEN = ""
	ACCESS_SECRET = ""
	
	publishAccessToken ACCESS_TOKEN,ACCESS_SECRET,userdata,PIN

	
	sdim savetext,1024
	savetext += userdata+"\n"
	savetext += ACCESS_TOKEN+"\n"
	savetext += ACCESS_SECRET

	exist "meta.hsp"
	if strsize > 0:delete "meta.hsp"
	bsave "meta.hsp",savetext,strlen(savetext)
		} 	
	sdim tokenTxt,strsize+1
	pos 0,0
	bload "meta.hsp",tokenTxt
	notesel tokenTxt
	noteget ACCESS_TOKEN,1
	noteget ACCESS_SECRET,2
	noteunsel
	

	
	tCupInit "test", CONSUMER_KEY, CONSUMER_SECRET, 10
	setAccessToken ACCESS_TOKEN, ACCESS_SECRET
	TweetText = ""

	getHomeTimeline 10
	s1 = getResponseBody()
	s2 = UnicodeToSJIS(s1)
	i = 0
	kai = 0
	
*hata
	
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	i = 0
	k = 0
	pos 0,0

	repeat
	font "BIZ UD明朝",12
	time2 = 0
	time3 = 0
	time = 0
	value = 0
	x = 0
	y = 0
	name = 0
	name2 = 0
	name3 = 0
	name4 = 0
	name5 = 0
	name6 = 0
	nameend = 0
	x2 = 0
	x3 = 0
	xz = 0
	xz2 = 0
	xz3 = 0
color rnd(230),rnd(230),rnd(230)


	time2 = instr(s2,i , "id") +i
	time3 = instr(s2, i,"created_at") +i
	time = strmid(s2,time3,time2-time3)
	mes time
	
	value = instr(s2, i, "RT")
	y = instr(s2, i, "truncated") - instr(s2, i,"text")
	x = strmid(s2,instr(s2, i, "text")+i,y)


	key = "\n"
	repeat
	a = instr(x, 0, "\\n") : if a == -1 : break
	wpoke x, a, wpeek(key) ; wpeek(key) ⇔ 2573
	loop


	xhp = instr(x, ,"http")
	if (xhp=-1){}else{
	xz3= strmid(x,0,xhp)
	x =xz3}

	y1=instr(x,,"\n")
	if(y1=-1){
		if(y>=90){
			xz= strmid(x,0,80)
			xz2=strmid(x,79,y)
			}
	}


	xcl=instr(x,,"text_color")
	if(xcl=-1){}else{
	goto *iplus}

	if value = -1{
	name = instr(s2,i,"name")
	name++
	name7 = name+i
	name2 = instr(s2, name7,"name")
	name3 = name + name2 //iからの距離
	name3++
	name5 = name3 + i//総合距離
	name4 = instr(s2,name5,"name")
	name6 = name4 +name5

	nameend = instr(s2,i,"description")//iからの距離
	nameend++
	nameend5 = nameend - name3//長さ
	nameend7 =nameend+i
	nameend2 = instr(s2,nameend7,"description")
	nameend4 = nameend + nemeend2//iからの距離
	nameend3 =  nameend4 +i
	nameend6 = nameend3 - name6
	 
		x2 = strmid(s2,name5,nameend5)
		x3 = strmid(s2,name6,nameend6)
		mes x2
		mes x3
}else{
	name = instr(s2,i,"name")
	name++
	name7 = name+i
	name2 = instr(s2, name7,"name")
	name3 = name + name2 //iからの距離
	name3++
	name5 = name3 + i//総合距離
	name4 = instr(s2,name5,"name")
	name6 = name4 +name5

	nameend = instr(s2,i,"description")//iからの距離
	nameend++
	nameend5 = nameend - name3//長さ
	nameend7 = nameend+i
	nameend2 = instr(s2,nameend,"description")
	nameend4 = nameend + nemeend2//iからの距離
	nameend3 =  nameend4 +i
	nameend6 = nameend3 - name6
	 
		x2 = strmid(s2,name5,nameend5)
		x3 = strmid(s2,name6,nameend6)
		mes x2
		mes x3
}

	font "BIZ UD明朝",16
	if(xz=0){
	mes x
}else{
	mes xz
	mes xz2
}
	font "BIZ UD明朝",12
	mes 
	time2 = time2+4
	id = strmid(s2,time2,19)
	objsize 100, 20

	k++
	if(k=1){
	id1=id
	z1=x
	button "いいね",*favo1
}if (k=2){
	id2=id
	z2=x
	button "いいね",*favo2
}if  (k=3){
	id3=id
	z3=x
	button "いいね",*favo3
}if (k=4){
	id4=id
	z4=x
	button "いいね",*favo4
}if (k=5){
	id5=id
	zo=x
	button "いいね",*favo5
}if (k=6){
	id6=id
	z6=x
	button "いいね",*favo6
}if (k=7){
	id7=id
	z7=x
	button "いいね",*favo7
}if (k=8){
	id8=id
	z8=x
	button "いいね",*favo8
}if (k=9){
	id9=id
	z9=x
	button "いいね",*favo9
}if (k=10){
	id10=id
	z10=x
	button "いいね",*favo10
}

*iplus
	i++
	f= instr(s2,i,"},{")
	i = f+i
	if f=-1: count = cnt : break
loop
	pos 0,680
	font "BIZ UD明朝",20
	objmode 2
	input TweetText,400,80,0
	font "BIZ UD明朝",12
	pos 400,680
	objsize 200, 40
	button "OK",*ok
	button "更新",*Init

	repeat 1000
	await 65
	loop

	goto *Init
	stop
	
*ok
	Tweet TweetText
	pos 0,0
	if kai < 1000 : goto *Init
	stop
//--------------------------------------
// ユニバーサル文字列のデコード
//--------------------------------------
#defcfunc UnicodeToSJIS str _s_,\
    local inBuff,\
    local outBuff,\
    local outPos
    ;初期化
    inBuff=(_s_)
    sdim outBuff,1024*1024      ;1MBまで対応
    ;変換
    repeat strlen(inBuff)
        c=peek(inBuff,cnt)
        ;「\」以外
        if(c!='\\'){
            poke outBuff,outPos,c:outPos++
            continue
        }
        ;「\u」以外
        d=peek(inBuff,cnt+1)
        if(d!='u'){
            poke outBuff,outPos,c:outPos++
            poke outBuff,outPos,d:outPos++
            continue(cnt+2)
        }
        ;「\uXXXX」の場合
        k=int("$"+strmid(inBuff,cnt+2,4))
        repeat 1
            if($0000<=k)and(k<=$04FF):k=UnicodeTable1(k-$0000):break
            if($2000<=k)and(k<=$9FFF):k=UnicodeTable2(k-$2000):break
            if($E000<=k)and(k<=$FFFF):k=UnicodeTable3(k-$E000):break
            ;無効文字
            k=$0000
        loop
        ;マップされてない文字
        if(k==$0000):k=$8145    ;「・」文字に変換
        ;出力
        poke outBuff,outPos,((k>>8)& $FF):outPos++
        poke outBuff,outPos,((k>>0)& $FF):outPos++
        continue(cnt+6)
    loop
    poke outBuff,outPos,$00     ;NULL文字
    return outBuff
//--------------------------------------
// Unicodeファイルを読み込む
//--------------------------------------
#deffunc LoadUnicodeFile str _fname_
    exist(_fname_)
    if(strsize<0):return -1
    ;読み込む
    bload(_fname_),UnicodeTable1,-1
    bload(_fname_),UnicodeTable2,-1,length(UnicodeTable1)*4
    bload(_fname_),UnicodeTable3,-1,length(UnicodeTable1)*4+length(UnicodeTable2)*4
    return 0
stop

*favo1
	id =id1
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0 
	mes z1
	mes "をいいねしました"

repeat 100
	await 10
loop
	goto *hata
	stop

*favo2
	id =id2
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0
	mes z2
	mes "をいいねしました"

repeat 100
	await 10
loop

	goto *hata
	stop

*favo3
	id =id3
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0	 
	mes z3
	mes "をいいねしました"
repeat 100
	await 10
loop
	goto *hata
	stop

*favo4
	id =id4
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0 
	mes z4
	mes "をいいねしました"

repeat 100
	await 10
loop

	goto *hata
	stop

*favo5
	id =id5
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0 
	mes zo
	mes "をいいねしました"

repeat 100
	await 10
loop

	goto *hata
	stop

*favo6
	id =id6
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0 
	mes z6
	mes "をいいねしました"

repeat 100
	await 10
loop
	goto *hata
	stop

*favo7
	id =id7
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,00 
	mes z7
	mes "をいいねしました"

repeat 100
	await 10
loop

	goto *hata
	stop

*favo8
	id =id8
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0 
	mes z8
	mes "をいいねしました"

repeat 100
	await 10
loop

	goto *hata
	stop

*favo9
	id =id9
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0	 
	mes z9
	mes "をいいねしました"

repeat 100
	await 10
loop

	goto *hata
	stop

*favo10
	id =id10
	postfavo id
	screen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	font "BIZ UD明朝",20
	pos 0,0
	mes z10
	mes	"をいいねしました"

repeat 100
	await 10
loop

	goto *hata
	stop