UTF8対応版TsubuyakiSoupのTweetUTF8
UTF8対応版TsubuyakiSoupのTweetUTF8
/*======================================================================ツイートサンプル------------------------------------------------------------------------ツイートするサンプルです。(このサンプルを実行するには、「Sample01_OAuth.hsp」か「Sample02_xAuth.hsp」を実行して「Setting.txt」を作成してください。)※このモジュールやサンプルを実行する場合には、Twitter側からConsumerKeyとConsumerSecretを取得する必要があります。詳しくは、モジュールと同封されている「TsubuyakiSoupドキュメント」を参照してください。------------------------------------------------------------------------Author : takataLastUpdate : 10/10/16CreateDate : 10/09/23======================================================================*/// モジュールをインクルード#include "../TsubuyakiSoup.as"#module#uselib "msvcrt"#cfunc strstr "strstr" int, sptr#uselib "kernel32"#func MultiByteToWideChar "MultiByteToWideChar" int, int, sptr, int, sptr, int#func WideCharToMultiByte "WideCharToMultiByte" int, int, sptr, int, sptr, int, int, int#deffunc UTF8ToUnicode var in, var outMultiByteToWideChar 65001/*CP_UTF8*/, 0, varptr(in), -1, 0, 0len = statsdim out, len * 2 + 2MultiByteToWideChar 65001/*CP_UTF8*/, 0, varptr(in), -1, varptr(out), lenreturn len#deffunc UnicodeToUTF8 var in, var out// Unicode → UTF-8WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(in), -1, 0, 0, 0, 0len = statsdim out, len + 1WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(in), -1, varptr(out), len, 0, 0return len#deffunc ShiftJISToUTF8 str _in_sjis, var out_utf8in_sjis = _in_sjis// SHIFT_JIS → Unicodelen = strlen(_in_sjis) * 2sdim uni, len + 2cnvstow uni, _in_sjis// Unicode → UTF-8WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(uni), -1, 0, 0, 0, 0len = statsdim out_utf8, len + 1WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(uni), -1, varptr(out_utf8), len, 0, 0return len#deffunc BOMDelete var in_utf8// EF BB BF(BOM) 手抜き~if (0xBFBBEF == (lpeek(in_utf8, 0) & 0xFFFFFF)){len = strlen(in_utf8)sdim copybuf, len*2 + 1copybuf = in_utf8sdim in_utf8, len*2 + 1memcpy in_utf8, copybuf, len, 0, 3return 1}return 0// instr(手抜きUTF8対応版)#defcfunc instr_utf8 var in_buf, int p, str _keykey = _keyinbuf_ptr = varptr(in_buf) + ps_pos = strstr(inbuf_ptr, key)if s_pos == 0 : return -1return (s_pos - inbuf_ptr)#global#module#deffunc _TweetUTF8 str p1, double p2tmpStr = p1//140字に丸めるif (mb_strlen(tmpStr) > 140) {tmpStr = mb_strmid(p1, 0,140)}//POSTsdim ArgumentArgument(0) = "status="+ form_encode(tmpStr, 1)if p2 > 0 : Argument(1) = "in_reply_to_status_id="+ strf("%.0f",p2)RESTAPI ResponseBody, ResponseHeader, METHOD_POST, "statuses/update."+ TS_FormatType@TsubuyakiSoup, Argumentreturn stat#define global TweetUTF8(%1, %2=0) _TweetUTF8 %1, %2#global#module#defcfunc hex2bin str _s1s1 = _s1memexpand s1, strlen(s1)*2sdim buf, strlen(s1)*2+1i = 0repeat strlen(s1)key = strmid(s1, cnt, 1)if (key == " " || key == "\t"){// 読み飛ばすcontinue}key = strmid(s1, cnt, 2)if (key == "\n"){// 読み飛ばすcontinue}else : if (key == "0x"){poke buf, i, int("$"+strmid(s1, cnt+2, 2))i++}loopreturn buf#global// ここから;サンプル用設定ファイル#include "SampleSetting.hsp"if CONSUMER_KEY = "" : dialog "「SampleSetting.hsp」でConsumerKeyとConsumerSecretを設定してください。" : end// 初期化TS_Init "TsubuyakiSoup Sample", CONSUMER_KEY, CONSUMER_SECRET, 20//設定ファイルの有無確認xToken = ""xSecret = ""exist "Setting.txt"if strsize != -1 {notesel SFAnoteload "Setting.txt"if (Decryption(SFA, "SampleKey")=0) : dialog "ファイルの復号に失敗したため、読み込むことができませんでした。終了します。" : endnoteget xToken,0noteget xSecret,1noteunselSetAccessToken xToken, xSecret}if ( (xToken ="") or (xSecret = "") ) : dialog "「Sample01_OAuth.hsp」か「Sample02_xAuth.hsp」を実行して「Setting.txt」を作成してください。" : end;TweetText = "";pos 10, 10;input TweetText, 450,20;InputID = stat;pos 470, 8button gosub "投稿", *submitstop*submit//---------------------------------// ツイート// Tweet 命令で投稿します。// 第一引数に投稿する文字列を指定します。//Tweet TweetText, 0// Unicodeにしかない文字はこちらで 下は ☝( ՞ਊ ՞)☝ (UTF-8)を文字列化(HEXダンプ)したものShootingStarString = hex2bin("0xE2 0x98 0x9D 0x28 0x20 0xD5 0x9E 0xE0 0xA8 0x8A 0x20 0xD5 0x9E 0x29 0xE2 0x98 0x9D")// 日本語とか変換可能なのはこっちShiftJISToUTF8 "送信テスト", UTF8String// 2つを連結するTweetString = UTF8String+ShootingStarString// UTF8対応版TweetUTF8 TweetString, 0//Tweet "ツイートテスト", 0; エラー判断if (stat = 200) {;objprm InputID, ""dialog "送信完了"} else {dialog "投稿に失敗しました。\nステータスコード : "+stat,1,"投稿失敗"}//---------------------------------returnstop