未完成故バグも多いです
色々な所からコードを引っ張ってきてるので不都合あれば削除します
未完成故バグも多いです
色々な所からコードを引っ張ってきてるので不都合あれば削除します
//------------------------------------------------------------------------------// デコード用のデータ作成 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-0x9FFCrepeat($9F-$81+1),$81:c=cntrepeat($FC-$40+1),$40:d=cntif(d==$7F):continuepoke strBuff,posBuff,c:posBuff++poke strBuff,posBuff,d:posBuff++looploop;0xE040-0xFCFCrepeat($FC-$E0+1),$E0:c=cntrepeat($FC-$40+1),$40:d=cntif(d==$7F):continuepoke strBuff,posBuff,c:posBuff++poke strBuff,posBuff,d:posBuff++looplooppoke strBuff,posBuff,$00;SJIS⇒Unicodesdim szUnicode,posBuff+2MultiByteToWideChar 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)|cc=peek(strBuff,cnt*2+0)d=peek(strBuff,cnt*2+1)if($0000<=k)and(k<=$04FF):UnicodeTable1(k-$0000)=(c<<8)|d:continueif($2000<=k)and(k<=$9FFF):UnicodeTable2(k-$2000)=(c<<8)|d:continueif($E000<=k)and(k<=$FFFF):UnicodeTable3(k-$E000)=(c<<8)|d:continueloopreturn//--------------------------------------// バイナリ・ファイルに書き込む//--------------------------------------#deffunc SaveBinFile str _fname_bsave(_fname_),UnicodeTable1,-1bsave(_fname_),UnicodeTable2,-1,length(UnicodeTable1)*4bsave(_fname_),UnicodeTable3,-1,length(UnicodeTable1)*4+length(UnicodeTable2)*4return//--------------------------------------// バイナリ・ファイルを読み込む//--------------------------------------#deffunc LoadBinFile str _fname_bload(_fname_),UnicodeTable1,-1bload(_fname_),UnicodeTable2,-1,length(UnicodeTable1)*4bload(_fname_),UnicodeTable3,-1,length(UnicodeTable1)*4+length(UnicodeTable2)*4return//------------------------------------------------------------------------------// 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]%dllTsubuyakiSoup%ver2.2%date2017/06/07%noteTsubuyakiSoup_mod.asをインクルードすること。%portWin%*/#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]%indextCupInitTsubuyakiSoupの初期化%prmp1, p2, p3p1 = 文字列 : ユーザエージェントp2 = 文字列 : Consumer Keyp3 = 文字列 : Consumer Secretp4 = 0~(30) : タイムアウトの時間(秒)%instTsubyakiSoupモジュールの初期化をします。Twitter操作命令の使用前に呼び出す必要があります。p1にユーザエージェントを指定します。ユーザエージェントを指定していないとSearchAPIなどで厳しいAPI制限を受けることがあります。p2にConsumer Keyを、p3にConsumer Secretを指定してください。Consumer KeyとConsumer Secretは、Twitterから取得する必要があります。詳しくは、リファレンスをご覧ください。p4にはTwitterと通信する際のタイムアウトの時間を秒単位で指定してください。%hrefTS_End%groupTwitterAPI操作命令%*///------------------------------------------------------------#deffunc _tCupInit str p1, str p2, str p3, int p4//各種変数の初期化; rateLimit(0) = -1 // 15分間にAPIを実行できる回数; rateLimit(1) = -1 // APIを実行できる残り回数; rateLimit(2) = -1 // リセットする時間accessToken = "" // AccessTokenaccessSecret = "" // AccessTokenSecretrequestToken = "" // RequestTokenrequestSecret = "" // RequestTokenSecretconsumerKey = p2 // ConsumerKeyconsumerSecret = p3 // ConsumerSecretscreenName = ""userId = ""formatType = "json"responseHeader = ""responseBody = ""timeOutTime = p4*1000gzipFlag = 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), 4return 0#define global tCupInit(%1,%2,%3,%4=30) _tCupInit %1, %2, %3, %4//============================================================//============================================================/* [HDL symbol infomation]%indextCupWashTsubuyakiSoupの終了処理%instTsubyakiSoupモジュールの終了処理を行ないます。プログラム終了時に自動的に呼び出されるので明示的に呼び出す必要はありません。%hrefTS_Init%groupTwitterAPI操作命令%*///------------------------------------------------------------#deffunc tCupWash onexit//ハンドルの破棄if (hRequest) : _InternetCloseHandle hRequestif (hConnect) : _InternetCloseHandle hConnectif (hInet) : _InternetCloseHandle hInetreturn//============================================================//============================================================/* [HDL symbol infomation]%indexgetHmacSha1HMAC-SHA1で署名を生成%prm(p1, p2)p1 = 文字列 : 署名化する文字列p2 = 文字列 : 鍵とする文字列%instSHA-1ハッシュ関数を使用したハッシュメッセージ認証コード(HMAC)を返します。p1に署名化する文字列を指定します。署名化するための鍵(キー)は、p2で文字列で指定します。%hrefsigEncode%groupTsubuyakiSoup補助関数%*///------------------------------------------------------------#deffunc getHmacSha1 str _p1, str _p2, var ghc_destghc_p1 = _p1ghc_p2 = _p2hProv = 0hKey = 0hHash = 0ghc_dataLength = 0sdim hmacInfo,14lpoke hmacInfo, 0, CALG_SHA1ghc_p2Length = strlen(ghc_p2)dim keyBlob, 3+(ghc_p2Length/4)+1poke keyBlob, 0, PLAINTEXTKEYBLOBpoke keyBlob, 1, CUR_BLOB_VERSIONwpoke keyBlob, 2, 0lpoke keyBlob, 4, CALG_RC2lpoke keyBlob, 8, ghc_p2Lengthmemcpy keyBlob, ghc_p2, ghc_p2Length, 12, 0sdim ghc_dest, 20ghc_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]%indexsigEncodeOAuth/xAuth用シグネチャを生成%prm(p1, p2)p1 = 文字列 : 署名化する文字列p2 = 文字列 : 鍵とする文字列%instOAuth/xAuth用の署名を返します。p1に署名化する文字列を指定します。署名化するための鍵(キー)は、p2で文字列で指定します。Twitterのシグネチャ生成の仕様より、文字コードUTF-8でURLエンコードした文字列(p1)を、同じくURLエンコードした文字列(p2)をキーとしてHAMAC-SHA1方式で生成した署名を、BASE64エンコードしたうえURLエンコードしています。%hrefHMAC_SHA1%groupTsubuyakiSoup補助関数%*///------------------------------------------------------------#defcfunc sigEncode str se_p1, str se_p2//utf-8へ変換sjis2utf8n SigTmp, se_p1sjis2utf8n SecretTmp, se_p2//URLエンコードSigEnc = form_encode(SigTmp, 0)SecretEnc = form_encode(SecretTmp, 0)getHmacSha1 SigEnc, SecretEnc, HmacSha1if (HmacSha1 == "Error"):return "Error"sdim base64HmacSha1,40Base64Encode HmacSha1,20,base64HmacSha1return 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_p3api = era_p1if (api != "media/upload.json") {arrayCopy era_p2, argumentsargumentLength = length(arguments)} else {exist era_p2picsize = strsizesdim picdata,picsize+1bload era_p2,picdatasdim base64data,int(1.5*picsize)Base64Encode picdata,picsize,base64data}methodType = era_p3switch methodTypecase METHOD_GETmethod = "GET"swbreakcase METHOD_POSTmethod = "POST"swbreakcase METHOD_PUTmethod = "PUT"swbreakcase METHOD_DELETEmethod = "DELETE"swbreakdefaultreturn 0swbreakswendsigArrayLength = 6+argumentLengthsdim sigArray, 500, sigArrayLengthhConnect = 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 +"/"+ apitransStr = method +" https://"+RequestURL+"/"+ apiVersion +"/"+ api +" "if (strmid(api,0,5) = "oauth") {apiUrl = apitransStr = method +" https://api.twitter.com/"+ api +" "}usePort = 443requestFlag = INTERNET_FLAG_RELOADrequestFlag |= INTERNET_FLAG_SECURErequestFlag |= INTERNET_FLAG_DONT_CACHErequestFlag |= INTERNET_FLAG_IGNORE_CERT_DATE_INVALIDrequestFlag |= INTERNET_FLAG_IGNORE_CERT_CN_INVALIDtokenStr = accessTokensigKey = consumerSecret+" "+accessSecretlogmes "sigkey="+sigKeyif (api = "oauth/access_token") {tokenStr = requestTokensigKey = consumerSecret+" "+requestSecret}// シグネチャ生成sigNonce = getRandomString(8, 32)_time sigTimesigArray(0) = "oauth_consumer_key=" + consumerKeysigArray(1) = "oauth_nonce=" + sigNoncesigArray(2) = "oauth_signature_method=HMAC-SHA1"sigArray(3) = "oauth_timestamp=" + sigTimesigArray(4) = "oauth_token="+ tokenStrsigArray(5) = "oauth_version=1.0"if (api != "media/upload.json") {repeat argumentLengthsigArray(6+cnt) = arguments(cnt)loop}_sortStrArray sigArray, 0, sigArrayLength-1repeat sigArrayLengthlogmes sigArray(cnt)if sigArray(cnt) = "" : continuetransStr += sigArray(cnt) +"&"looptransStr = strmid(transStr, 0, strlen(transStr)-1)signature = sigEncode(transStr, sigKey)if (methodType = METHOD_POST) {sdim boundary,128boundary = "-------------"+getRandomString(24, 32)sdim RequestHeader,1024*2RequestHeader = "Authorization: OAuth "repeat sigArrayLengthRequestHeader += sigArray(cnt)+","loopRequestHeader += "oauth_signature=" +signatureRequestHeader += "\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 += base64dataPostData += "\n"PostData += "--"+boundary+"--\n"} else {sdim PostData,1024*4repeat argumentLengthPostData += arguments(cnt)+"&"loopPostData = strmid(PostData, 0, strlen(PostData)-1) //後ろの&を除去}PostDataLength = strlen(PostData)}if (methodType = METHOD_GET) {apiUrl += "?"repeat sigArrayLengthapiUrl += sigArray(cnt) +"&"loopapiUrl += "oauth_signature=" +signatureRequestHeader = "Accept-Encoding: gzip, deflate;\nContent-Type: application/x-www-form-urlencoded"RequestHeaderLength = strlen(RequestHeader)PostData = 0PostDataLength = 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 hConnectreturn -3}//サーバへリクエスト送信if ( _HttpSendRequest(hRequest, RequestHeader, RequestHeaderLength, PostData, PostDataLength)) {//ヘッダを取得する変数の初期化responseHeaderSize = 3000sdim responseHeader, responseHeaderSize//ヘッダの取得if ( _HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, responseHeader, responseHeaderSize, 0) ) {//ヘッダの解析notesel responseHeaderrepeat notemaxnoteget headerLine, cntheaderTokenPos = 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)))loopnoteunsellogmes ""+responseBodyLength//入手可能なデータ量を取得_InternetQueryDataAvailable hRequest, rsize, 0, 0//バッファの初期化logmes "srize : "+ rsizesdim responseBuffer, rsize+1sdim responseBody, 10240repeat_InternetReadFile hRequest, responseBuffer, rsize, hsizeif (hsize = 0) : breakresponseBody += strmid(responseBuffer, 0, hsize)await 0loop} else {//ヘッダの取得ができなかった場合return -1}//Requestハンドルの破棄_InternetCloseHandle hRequest} else {//サーバへリクエスト送信できなかった場合return -2}sdim picdatasdim base64datasdim RequestHeadersdim PostDatareturn statcode//===========================================================#defcfunc getResponseHeaderreturn responseHeader#defcfunc getResponseBodyreturn responseBody//============================================================/* [HDL symbol infomation]%indexSetAccessTokenAccessTokenとSecretを設定%prmp1, p2p1 = 文字列 : Access Tokenp2 = 文字列 : Access Secret%instTsubuyakiSoupにAccess TokenとAccess Secretを設定します。p1にAccess Tokenを、p2にAccess Secretを指定します。このAccess TokenとAccess Secretは、GetAccessToken命令かGetxAuthToken命令で取得することができます。詳しくは、リファレンスをご覧ください。%hrefGetAccessTokenGetxAuthToken%groupTwitterAPI操作命令%*///------------------------------------------------------------#deffunc setAccessToken str sat_p1, str sat_p2accessToken = sat_p1accessSecret = sat_p2return//============================================================//============================================================/* [HDL symbol infomation]%indexsetRequestTokenRequestTokenとSecretを設定%prmp1, p2p1 = 文字列 : Request Tokenp2 = 文字列 : Request Secret%instTsubuyakiSoupにRequest TokenとRequest Secretを設定します。p1にRequest Tokenを、p2にRequest Secretを指定します。%hrefsetAccessToken%groupTwitterAPI操作命令%*///------------------------------------------------------------#deffunc setRequestToken str srt_p1, str srt_p2requestToken = srt_p1requestSecret = srt_p2return//============================================================//============================================================/* [HDL symbol infomation]%indexgetRequestTokenRequestTokenとSecretを設定%prm()%inst%hrefsetAccessToken%groupTwitterAPI操作命令%*///------------------------------------------------------------#defcfunc getRequestTokenreturn requestToken//============================================================//============================================================/* [HDL symbol infomation]%indexgetRequestSecretRequestTokenとSecretを設定%prm()%inst%hrefsetAccessToken%groupTwitterAPI操作命令%*///------------------------------------------------------------#defcfunc getRequestSecretreturn requestSecret//============================================================//============================================================/* [HDL symbol infomation]%indexsetConsumerTokenAccessTokenとSecretを設定%prmp1, p2p1 = 文字列 : Consumer Tokenp2 = 文字列 : Consumer Secret%instTsubuyakiSoupにConsumer TokenとConsumer Secretを設定します。p1にConsumer Tokenを、p2にConsumer Secretを指定します。%hreftCupInit%groupTwitterAPI操作命令%*///------------------------------------------------------------#deffunc setConsumerToken str sct_p1, str sct_p2consumerToken = sct_p1consumerSecret = sct_p2return//============================================================//============================================================/* [HDL symbol infomation]%indexsetUserInfoユーザ情報を設定%prmp1, p2p1 = 文字列 : ユーザ名(スクリーン名)p2 = 文字列 : ユーザID%instTsubuyakiSoupにユーザ名(スクリーン名)とユーザIDを設定します。p1にユーザ名(スクリーン名)を、p2にユーザIDを指定します。TsubuyakiSoup2からユーザIDも文字列で処理しています。%hrefGetAccessTokenGetxAuthToken%groupTwitterAPI操作命令%*///------------------------------------------------------------#deffunc setUserInfo str sui_p1, str sui_p2screenName = sui_p1userId = sui_p2return//============================================================#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 p1return (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 p3p = p1((p2+p3)/2)i = p2j = p3repeat// irepeatif strcmp(p1(i), p) >= 0 : breaki++loop// jrepeatif strcmp(p1(j), p) <= 0 : breakj--loop// 入れ替えif (i < j) {tmp = p1(i)p1(i) = p1(j)p1(j) = tmp} else {break}i++j--loopif ( i-p2 > 1 ) : _sortStrArray p1, p2, i-1if ( p3-j > 1 ) : _sortStrArray p1, j+1, p3return#defcfunc strcmp str _p1, str _p2p1n = _p1p2n = _p2p1v = peek(p1n, 0)p2v = peek(p2n, 0)n = 0while (p1v = p2v)if (p1v = 0 or p2v = 0) : _breakn++p1v = peek(p1n, n)p2v = peek(p2n, n)wendreturn p1v - p2v#deffunc arrayCopy array ary1, array ary2dimtype ary2, vartype(ary1), length(ary1)foreach ary1ary2(cnt) = ary1(cnt)loopreturn/*------------------------------------------------------------*///半角・全角含めた文字数を取り出す//// mb_strmid(p1, p2, p3)// p1...取り出すもとの文字列が格納されている変数名// p2...取り出し始めのインデックス// p3...取り出す文字数//#defcfunc mb_strmid var p1, int p2, int p3if vartype != 2 : return ""s_size = strlen(p1)trim_start = 0trim_num = 0repeat p2if (Is_Byte(peek(p1,trim_start))) : trim_start++trim_start++looprepeat p3if (Is_Byte(peek(p1,trim_start+trim_num))) : trim_num++trim_num++loopreturn strmid(p1,trim_start,trim_num)//p2 半角スペースの処理 0 : '&' 1 : '%20'#defcfunc form_encode str p1, int p2/*09 az AZ - . _ ~はそのまま出力*/fe_str = p1fe_p1Long = strlen(p1)sdim fe_val, fe_p1Long*3repeat fe_p1Longfe_flag = 0fe_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)}}loopreturn fe_val//ランダムな文字列を発生させる//p1からp2文字まで#defcfunc getRandomString int p1, int p2;randomizeRS_Strlen = rnd(p2-p1+1) + p1sdim RS_val, RS_Strlenrepeat RS_StrlenRS_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_sloopreturn 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 destbase64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"xdim base64enc,54base64enc.0 = 0x51EC8B55, 0x10558B51, 0xC9335653, 0x33F63357, 0x0C4D39FF, 0x89FC4D89base64enc.6 = 0x8E0FF84D, 0x000000AC, 0x8B08458B, 0xB60FF85D, 0xE3C10704, 0x89C30B08base64enc.12 = 0xF983F845, 0x6A377502, 0x458B5912, 0x145D8BF8, 0xE083F8D3, 0x18048A3Fbase64enc.18 = 0xFF420288, 0x8346FC45, 0x0E754CFE, 0x420D02C6, 0x420A02C6, 0x4583F633base64enc.24 = 0xE98302FC, 0x33D37906, 0xF84D89C9, 0x474101EB, 0x7C0C7D3B, 0x01F983ABbase64enc.30 = 0x036A527C, 0x2BC78B5F, 0x0C4589C1, 0x097EC085, 0x65C1C88B, 0x754908F8base64enc.36 = 0x59126AF9, 0x7F0C7D39, 0xF8458B12, 0xD3145D8B, 0x3FE083F8, 0x8818048Abase64enc.42 = 0xC603EB02, 0xFF423D02, 0x8346FC45, 0x0E754CFE, 0x420D02C6, 0x420A02C6base64enc.48 = 0x4583F633, 0x834F02FC, 0xC87906E9, 0x5FFC458B, 0x0002C65E, 0x10C2C95Bprm.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 d4base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"xdim base64dec,56base64dec.0 = 0x51EC8B55, 0x8B565351, 0xC0331075, 0x33D23357, 0x0C4539FF, 0x89F84589base64dec.6 = 0x8E0FFC45, 0x0000008A, 0x8A084D8B, 0xD98A0F0C, 0xC141EB80, 0xFB8006E2base64dec.12 = 0x0F087719, 0xE983C9BE, 0x8A22EB41, 0x61EB80D9, 0x7719FB80, 0xC9BE0F08base64dec.18 = 0xEB47E983, 0x80D98A10, 0xFB8030EB, 0x0F0A7709, 0xC183C9BE, 0xEBD10B04base64dec.24 = 0x2BF9801C, 0xCA830575, 0x8012EB3E, 0x05752FF9, 0xEB3FCA83, 0x3DF98008base64dec.30 = 0x45FF2375, 0x03F883F8, 0x45011875, 0x59106AFC, 0xF8D3C28B, 0x83460688base64dec.36 = 0xF47908E9, 0xC033D233, 0xEB4006EB, 0x06FAC103, 0x0C7D3B47, 0xFF768C0Fbase64dec.42 = 0x046AFFFF, 0x85C82B59, 0xC1067EC9, 0x754906E2, 0xFC458BFA, 0x8359106Abase64dec.48 = 0xDA8B03C0, 0x1E88FBD3, 0x08E98346, 0x452BF479, 0x06C65FF8, 0xE8835E00base64dec.54 = 0xC2C95B03, 0x00000010prm.0 = varptr(src), size, varptr(dest), varptr(base64)//prm.4 = varptr(d1),varptr(d2),varptr(d3),varptr(d4) ;<- debugreturn callfunc(prm, varptr(base64dec), 4)#global// jsonパーサ// 旧バージョンのTsubuyakiSoup.hspから移植#module jsonParse#deffunc json_sel str p1if vartype(mssc) != vartype("comobj") {newcom mssc, "MSScriptControl.ScriptControl"mssc("Language") = "JScript"}sdim tmp, strlen(p1)+1sdim jsontext, strlen(p1)+1tmp = p1jsontext = utf8n2sjis(tmp)sdim tmp, 0mssc -> "addCode" "obj = "+ jsontext +";"return#defcfunc json_val str p1comres resultmssc -> "Eval" "obj"+ p1 +" === null"if (result == -1) : return ""mssc -> "Eval" "obj"+ p1return result#defcfunc json_length str p1comres resultmssc -> "Eval" "obj"+ p1 +".length"return result#deffunc json_unselsdim jsontext,0return#global#module//============================================================/* [HDL symbol infomation]%indexgetAuthorizeAddressアクセス許可を求めるURLを生成%prm()%instユーザにアクセス許可を求めるアドレスを生成し、戻り値として返します。内部でTwitterと通信し、リクエストトークンを取得しています。リクエストトークンの取得に失敗した場合は、"Error"という文字列を返します。%groupTwitterAPI操作関数%*///------------------------------------------------------------#defcfunc getAuthorizeAddress// アクセストークン取得sdim argumentsarguments(0) = "oauth_callback=oob"execRestApi "oauth/request_token", arguments, METHOD_GETif stat != 200 : return "Error"// トークンの取り出しgaa_body = getResponseBody();request_tokenTokenStart = instr(gaa_body, 0, "oauth_token=") + 12TokenEnd = instr(gaa_body, TokenStart, "&")requestToken = strmid(gaa_body, TokenStart, TokenEnd);request_token_secretSecretStart = instr(gaa_body, 0, "oauth_token_secret=") + 19SecretEnd = instr(gaa_body, SecretStart, "&")requestSecret = strmid(gaa_body, SecretStart, SecretEnd)setRequestToken requestToken, requestSecretreturn "https://api.twitter.com/oauth/authorize?oauth_token="+ requestToken//============================================================//============================================================/* [HDL symbol infomation]%indexGetAccessTokenOAuthでAccessTokenとSecret取得%prmp1, p2, p3, p4p1 = 変数 : Access Tokenを代入する変数p2 = 変数 : Access Secretを代入する変数p3 = 変数 : ユーザ情報を代入する変数p4 = 文字列 : PINコード%instTwitterAPI「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の詳しいことは、リファレンスをご覧ください。%hrefGetAuthorizeAdressGetxAuthTokenSetAccessToken%groupTwitterAPI操作命令%*///------------------------------------------------------------#deffunc publishAccessToken var p1, var p2, var p3, str p4sdim p1sdim p2sdim p3sdim argumentsarguments(0) = "oauth_verifier=" + p4execRestApi "oauth/access_token", arguments, METHOD_POSTstatcode = statpat_body = getResponseBody()if statcode = 200 {//トークンの取り出し;request_tokenTokenStart = instr(pat_body, 0, "oauth_token=") + 12TokenEnd = instr(pat_body, TokenStart, "&")p1 = strmid(pat_body, TokenStart, TokenEnd);request_token_secretTokenStart = instr(pat_body, 0, "oauth_token_secret=") + 19TokenEnd = instr(pat_body, TokenStart, "&")p2 = strmid(pat_body, TokenStart, TokenEnd);User情報TokenStart = instr(pat_body, 0, "user_id=") + 8TokenEnd = instr(pat_body, TokenStart, "&")p3 = strmid(pat_body, TokenStart, TokenEnd) +","TokenStart = instr(pat_body, 0, "screen_name=") + 12TokenEnd = strlen(pat_body)p3 += strmid(pat_body, TokenStart, TokenEnd)}return statcode//============================================================#deffunc getMentionsTimeline int countsdim argumentsarguments(0) = "count="+ countexecRestApi "statuses/mentions_timeline.json", arguments, METHOD_GETreturn stat#deffunc getUserTimeline str screen_name, int countsdim argumentsarguments(0) = "screen_name="+ screen_namearguments(1) = "count="+ countexecRestApi "statuses/user_timeline.json", arguments, METHOD_GETreturn stat#deffunc getHomeTimeline int countsdim argumentsarguments(0) = "count="+ countexecRestApi "statuses/home_timeline.json", arguments, METHOD_GETreturn stat#deffunc getRetweetsOfMe int countsdim argumentsarguments(0) = "count="+ countexecRestApi "statuses/retweets_of_me.json", arguments, METHOD_GETreturn stat#deffunc getRetweets str idsdim argumentsexecRestApi "statuses/retweets/"+id+".json", arguments, METHOD_GETreturn stat#deffunc showStatus str idsdim argumentsexecRestApi "statuses/show/"+id+".json", arguments, METHOD_GETreturn stat#deffunc destoryStatus str idsdim argumentsexecRestApi "statuses/destroy/"+id+".json", arguments, METHOD_POSTreturn stat#deffunc retweetStatus str idsdim argumentsexecRestApi "statuses/retweet/"+id+".json", arguments, METHOD_POSTreturn stat#deffunc postfavo str idcsdim argumentsida = "id="+ idcidb = ida + "&include_entities=true"execRestApi "favorites/create.json", idb, METHOD_POSTid =0return stat//============================================================/* [HDL symbol infomation]%indexTweetツイートする%prmp1, p2p1 = 文字列 : ツイートする文字列p2 = 文字列 : 返信(reply)対象のステータスID%instTwitterAPI「statuses/update」を実行し、Twitterへ投稿します。結果はSetFormatType命令で指定したフォーマットで取得します。p1にツイートする140字以内の文字列を指定してください。140字以上の場合、140字に丸めてからツイートされます。p2に返信(reply)対象のステータスIDを指定することでどのステータスに対する返信かを明示できます。p2に空文字を指定するか省略した場合は、明示されません。TwitterAPIの仕様上、存在しない、あるいはアクセス制限のかかっているステータスIDを指定した場合と、p1で指定した文字列に「@ユーザ名」が含まれない、あるいは@ユーザ名」で指定したユーザが存在しない場合は、無視されます。TwitterAPIを実行した際のステータスコードはシステム変数statに代入されます。API制限適用対象外のAPIを使用していますが、1日に1000回までという実行回数上限が設定されています(API以外からの投稿もカウント対象)。%hrefDelTweetReTweet%groupTwitterAPI操作命令%*///------------------------------------------------------------#deffunc _Tweet str p1, str p2, str p3, str p4, str p5, str p6tmpBuf = p1tmpStr = ""//utf-8へ変換。sjis2utf8n tmpStr, tmpBuf//POSTsdim arguments,256arguments(0) = "status="+ form_encode(tmpStr, 1)if p2 != "" : arguments(1) = "in_reply_to_status_id="+ p2if p3 != "" : arguments(2) = "media_ids="+form_encode(p3, 1)if p4 != "" : arguments(3) = p4if p5 != "" : arguments(4) = p5if p6 != "" : arguments(5) = p6execRestApi "statuses/update.json", arguments, METHOD_POSTreturn 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 p2sdim rawtext,512sdim p2,512sdim picname,256status = 0repeat p3exist p1(cnt)if strsize <= 0:status = -2:breakpicname = p1(cnt)execRestApi "media/upload.json", picname, METHOD_POSTif stat != 200 :status = -1:breakrawtext = "["+getResponseBody()+"]"json_sel rawTextp2 += json_val("[0].media_id_string") + ","json_unselawait 50loopp2 = 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 p3rc = 0,0,0,0DrawText p1, p2, -1, varptr(rc), $00000400p3.0 = rc.2p3.1 = rc.3return;文字列の挿入関数; StrInsert pstr, pstrin, in; pstrのバッファのインデックスinバイトにpstrinを挿入します。; 挿入位置が2バイト文字の途中だったら2バイト文字の手前に挿入します。#defcfunc StrInsert var pstr, var pstrin, int inif 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*Inittitle "いりの遊び場"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バイト┘*Mainscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZE;読み込むLoadUnicodeFile "meta.bin"if(stat<0):dialog "Unicodeファイルが見つかりません。",1,"確認":endfont "BIZ UD明朝",12sdim s1,1024sdim s2,1024exist "meta.hsp"if (strsize < 0){tCupInit "testClient", CONSUMER_KEY, CONSUMER_SECRET, 10address = getAuthorizeAddress()response = "##### HEADER ######\n"+getResponseHeader()+"\n\n##### BODY #####\n"+getResponseBody()exec address,16PIN = ""pos 0,0mes "表示されたパスワードを入力してください"input PIN,100,20button "OK",*ok2stop*ok2userdata = ""ACCESS_TOKEN = ""ACCESS_SECRET = ""publishAccessToken ACCESS_TOKEN,ACCESS_SECRET,userdata,PINsdim savetext,1024savetext += userdata+"\n"savetext += ACCESS_TOKEN+"\n"savetext += ACCESS_SECRETexist "meta.hsp"if strsize > 0:delete "meta.hsp"bsave "meta.hsp",savetext,strlen(savetext)}sdim tokenTxt,strsize+1pos 0,0bload "meta.hsp",tokenTxtnotesel tokenTxtnoteget ACCESS_TOKEN,1noteget ACCESS_SECRET,2noteunseltCupInit "test", CONSUMER_KEY, CONSUMER_SECRET, 10setAccessToken ACCESS_TOKEN, ACCESS_SECRETTweetText = ""getHomeTimeline 10s1 = getResponseBody()s2 = UnicodeToSJIS(s1)i = 0kai = 0*hatascreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEi = 0k = 0pos 0,0repeatfont "BIZ UD明朝",12time2 = 0time3 = 0time = 0value = 0x = 0y = 0name = 0name2 = 0name3 = 0name4 = 0name5 = 0name6 = 0nameend = 0x2 = 0x3 = 0xz = 0xz2 = 0xz3 = 0color rnd(230),rnd(230),rnd(230)time2 = instr(s2,i , "id") +itime3 = instr(s2, i,"created_at") +itime = strmid(s2,time3,time2-time3)mes timevalue = instr(s2, i, "RT")y = instr(s2, i, "truncated") - instr(s2, i,"text")x = strmid(s2,instr(s2, i, "text")+i,y)key = "\n"repeata = instr(x, 0, "\\n") : if a == -1 : breakwpoke x, a, wpeek(key) ; wpeek(key) ⇔ 2573loopxhp = 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+iname2 = instr(s2, name7,"name")name3 = name + name2 //iからの距離name3++name5 = name3 + i//総合距離name4 = instr(s2,name5,"name")name6 = name4 +name5nameend = instr(s2,i,"description")//iからの距離nameend++nameend5 = nameend - name3//長さnameend7 =nameend+inameend2 = instr(s2,nameend7,"description")nameend4 = nameend + nemeend2//iからの距離nameend3 = nameend4 +inameend6 = nameend3 - name6x2 = strmid(s2,name5,nameend5)x3 = strmid(s2,name6,nameend6)mes x2mes x3}else{name = instr(s2,i,"name")name++name7 = name+iname2 = instr(s2, name7,"name")name3 = name + name2 //iからの距離name3++name5 = name3 + i//総合距離name4 = instr(s2,name5,"name")name6 = name4 +name5nameend = instr(s2,i,"description")//iからの距離nameend++nameend5 = nameend - name3//長さnameend7 = nameend+inameend2 = instr(s2,nameend,"description")nameend4 = nameend + nemeend2//iからの距離nameend3 = nameend4 +inameend6 = nameend3 - name6x2 = strmid(s2,name5,nameend5)x3 = strmid(s2,name6,nameend6)mes x2mes x3}font "BIZ UD明朝",16if(xz=0){mes x}else{mes xzmes xz2}font "BIZ UD明朝",12mestime2 = time2+4id = strmid(s2,time2,19)objsize 100, 20k++if(k=1){id1=idz1=xbutton "いいね",*favo1}if (k=2){id2=idz2=xbutton "いいね",*favo2}if (k=3){id3=idz3=xbutton "いいね",*favo3}if (k=4){id4=idz4=xbutton "いいね",*favo4}if (k=5){id5=idzo=xbutton "いいね",*favo5}if (k=6){id6=idz6=xbutton "いいね",*favo6}if (k=7){id7=idz7=xbutton "いいね",*favo7}if (k=8){id8=idz8=xbutton "いいね",*favo8}if (k=9){id9=idz9=xbutton "いいね",*favo9}if (k=10){id10=idz10=xbutton "いいね",*favo10}*iplusi++f= instr(s2,i,"},{")i = f+iif f=-1: count = cnt : breaklooppos 0,680font "BIZ UD明朝",20objmode 2input TweetText,400,80,0font "BIZ UD明朝",12pos 400,680objsize 200, 40button "OK",*okbutton "更新",*Initrepeat 1000await 65loopgoto *Initstop*okTweet TweetTextpos 0,0if kai < 1000 : goto *Initstop//--------------------------------------// ユニバーサル文字列のデコード//--------------------------------------#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 1if($0000<=k)and(k<=$04FF):k=UnicodeTable1(k-$0000):breakif($2000<=k)and(k<=$9FFF):k=UnicodeTable2(k-$2000):breakif($E000<=k)and(k<=$FFFF):k=UnicodeTable3(k-$E000):break;無効文字k=$0000loop;マップされてない文字if(k==$0000):k=$8145 ;「・」文字に変換;出力poke outBuff,outPos,((k>>8)& $FF):outPos++poke outBuff,outPos,((k>>0)& $FF):outPos++continue(cnt+6)looppoke outBuff,outPos,$00 ;NULL文字return outBuff//--------------------------------------// Unicodeファイルを読み込む//--------------------------------------#deffunc LoadUnicodeFile str _fname_exist(_fname_)if(strsize<0):return -1;読み込むbload(_fname_),UnicodeTable1,-1bload(_fname_),UnicodeTable2,-1,length(UnicodeTable1)*4bload(_fname_),UnicodeTable3,-1,length(UnicodeTable1)*4+length(UnicodeTable2)*4return 0stop*favo1id =id1postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes z1mes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo2id =id2postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes z2mes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo3id =id3postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes z3mes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo4id =id4postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes z4mes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo5id =id5postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes zomes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo6id =id6postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes z6mes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo7id =id7postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,00mes z7mes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo8id =id8postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes z8mes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo9id =id9postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes z9mes "をいいねしました"repeat 100await 10loopgoto *hatastop*favo10id =id10postfavo idscreen 0,700,750,SCREEN_NORMAL|SCREEN_FIXEDSIZEfont "BIZ UD明朝",20pos 0,0mes z10mes "をいいねしました"repeat 100await 10loopgoto *hatastop