未完成故バグも多いです
色々な所からコードを引っ張ってきてるので不都合あれば削除します
未完成故バグも多いです
色々な所からコードを引っ張ってきてるので不都合あれば削除します
//------------------------------------------------------------------------------ // デコード用のデータ作成 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