UTF8対応版TsubuyakiSoupのTweetUTF8

UTF8対応版TsubuyakiSoupのTweetUTF8

UTF8対応版TsubuyakiSoupのTweetUTF8

  • タグ:
  • タグはありません
/*======================================================================
    ツイートサンプル
------------------------------------------------------------------------
    ツイートするサンプルです。
    (このサンプルを実行するには、「Sample01_OAuth.hsp」か
    「Sample02_xAuth.hsp」を実行して「Setting.txt」を作成してくださ
    い。)

  ※このモジュールやサンプルを実行する場合には、Twitter側から
    ConsumerKeyとConsumerSecretを取得する必要があります。詳しくは、モ
    ジュールと同封されている「TsubuyakiSoupドキュメント」を参照して
    ください。
------------------------------------------------------------------------
Author     : takata
LastUpdate : 10/10/16
CreateDate : 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 out
	MultiByteToWideChar 65001/*CP_UTF8*/, 0, varptr(in), -1, 0, 0
	len = stat
	sdim out, len * 2 + 2
	MultiByteToWideChar 65001/*CP_UTF8*/, 0, varptr(in), -1, varptr(out), len
return len
#deffunc UnicodeToUTF8 var in, var out
 	// Unicode → UTF-8
	WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(in), -1, 0, 0, 0, 0
	len = stat
	sdim out, len + 1
	WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(in), -1, varptr(out), len, 0, 0
return len
#deffunc ShiftJISToUTF8 str _in_sjis, var out_utf8
	in_sjis = _in_sjis
	// SHIFT_JIS → Unicode
	len = strlen(_in_sjis) * 2
    sdim uni, len + 2
 	cnvstow uni, _in_sjis
 	// Unicode → UTF-8
	WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(uni), -1, 0, 0, 0, 0
	len = stat
	sdim out_utf8, len + 1
	WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(uni), -1, varptr(out_utf8), len, 0, 0
return 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 + 1
		copybuf = in_utf8
		sdim in_utf8, len*2 + 1
		memcpy in_utf8, copybuf, len, 0, 3
		return 1
	}
return 0
// instr(手抜きUTF8対応版)
#defcfunc instr_utf8 var in_buf, int p, str _key
	key = _key
	inbuf_ptr = varptr(in_buf) + p
	s_pos = strstr(inbuf_ptr, key)
	if s_pos == 0 : return -1
return (s_pos - inbuf_ptr)
#global
#module
#deffunc _TweetUTF8 str p1, double p2
	tmpStr = p1
	//140字に丸める
	if (mb_strlen(tmpStr) > 140) {
		tmpStr = mb_strmid(p1, 0,140)
	}
	//POST
	sdim Argument
	Argument(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, Argument
return stat
#define global TweetUTF8(%1, %2=0) _TweetUTF8 %1, %2
#global
#module
#defcfunc hex2bin str _s1
	s1 = _s1
	memexpand s1, strlen(s1)*2
	sdim buf, strlen(s1)*2+1
	i = 0
	repeat 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++
		}		
	loop
return 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 SFA
		noteload "Setting.txt"
		if (Decryption(SFA, "SampleKey")=0) : dialog "ファイルの復号に失敗したため、読み込むことができませんでした。終了します。" : end
		noteget xToken,0
		noteget xSecret,1
		noteunsel
		SetAccessToken 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, 8
	button gosub "投 稿", *submit

stop


*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,"投稿失敗"
	}
//---------------------------------

return

stop