twitterのタグがつけられたコード一覧

C# サロゲートペアを考慮してSubstringできるやつ

using System;
using System.Collections.Generic;
using System.Text;

namespace Liberfy
{
	public sealed unsafe class TwStringInfo : IDisposable
	{
		#region fields

		private int* surrogateIndices;
		private int surrogateIndicesLength;

		#endregion

		#region properties

		public string String { get; private set; }

		public int Length { get; private set; }

		#endregion

		public TwStringInfo(string text)
		{
			if (text == null) return;

			var surrogateIndicesList = new LinkedList<int>();

			String = text.Normalize(NormalizationForm.FormC);

			char c;
			int Length = String.Length;

			int surrogateIndex;
			for (surrogateIndex = 0; surrogateIndex < Length; surrogateIndex++)
			{
				if ('\uD800' <= (c = String[surrogateIndex]) && c <= '\uDBFF')
				{
					surrogateIndicesList.AddLast(surrogateIndex);
					surrogateIndex++;
				}
			}

			surrogateIndicesLength = surrogateIndicesList.Count;

			if (surrogateIndicesLength > 0)
			{
				int* indices = stackalloc int[surrogateIndicesLength];

				LinkedListNode<int> node = surrogateIndicesList.First;

				for (int i = 0; i < surrogateIndicesLength; i++)
				{
					indices[i] = node.Value;
					node = node.Next;
				}

				surrogateIndices = indices;
				indices = null;

				surrogateIndicesList.Clear();
			}

			surrogateIndicesList = null;
		}

		public string Substring(int startIndex)
		{
			int substringStartIndex = startIndex;

			for (int i = 0; i < surrogateIndicesLength; i++)
			{
				if (surrogateIndices[i] < startIndex)
				{
					substringStartIndex++;
				}
				else
				{
					break;
				}
			}

			return String.Substring(substringStartIndex);
		}

		public string Substring(int startIndex, int length)
		{
			int i = 0;
			int substringStartIndex = startIndex;
			int substringLength = length;
			int totalLength = startIndex + length;

			for (; i < surrogateIndicesLength; i++)
			{
				if (surrogateIndices[i] < startIndex)
				{
					substringStartIndex++;
				}
				else
				{
					break;
				}
			}

			for (; i < surrogateIndicesLength; i++)
			{
				if (surrogateIndices[i] < totalLength)
				{
					substringLength++;
				}
				else
				{
					break;
				}
			}

			return String.Substring(substringStartIndex, substringLength);
		}

		#region IDisposable Support
		private bool disposedValue = false;

		private void Dispose(bool disposing)
		{
			if (!disposedValue)
			{
				if (disposing)
				{
					Length = 0;
					String = null;
				}
				else
				{
					surrogateIndices = null;
					surrogateIndicesLength = 0;
				}

				disposedValue = true;
			}
		}

		~TwStringInfo()
		{
			Dispose(false);
		}

		public void Dispose()
		{
			Dispose(true);
			GC.SuppressFinalize(this);
		}
		#endregion
	}
}

C# タイムラインの文字列表示処理

		public static void TwitterObectToInline(InlineCollection inlines, CoreTweet.Core.CoreBase obj, bool clearInlines = false)
		{
			if (obj == null || obj == null) return;

			// 内容の消去
			if (clearInlines) inlines.Clear();

			string text = null;
			IList<Entity> dic = null;

			// エンティティのリスト作成
			if (obj is Status)
			{
				var status = (Status)obj;
				text = status.Text;
				dic = ConcatArray<Entity>( // エンティティの結合
					status.Entities.UserMentions,
					status.Entities.Urls,
					status.Entities.Symbols,
					status.Entities.Media,
					status.Entities.HashTags);
			}
			else if (obj is DirectMessage)
			{
				var message = (DirectMessage)obj;
				text = message.Text;
				dic = ConcatArray<Entity>(
					message.Entities.UserMentions,
					message.Entities.Urls,
					message.Entities.Symbols,
					message.Entities.Media,
					message.Entities.HashTags);
			}

			if (dic == null) return;

			if (dic.Count > 0)
			{
				// エンティティが含まれている場合

				// エンティティの出現番号順に並び替え
				dic = dic.OrderBy(entity => entity.Indices[0]).ToList();

				// エンティティの開始が0文字目で無い場合に文字列を挿入
				if (dic[0].Indices[0] != 0)
					inlines.Add(HttpUtility.HtmlDecode(text.Substring(0, dic[0].Indices[0])));

				// エンティティの追加
				dic.ForEach((entity, index) =>
				{
					// *** リンクの生成 ***
					var link = new Hyperlink()
					{
						Cursor = Cursors.Hand,
					};

					if (entity is UserMentionEntity)
					{
						var user = (UserMentionEntity)entity;
						link.Inlines.Add(string.Format("@{0}", user.ScreenName));
					}
					else if (entity is UrlEntity)
					{
						var url = (UrlEntity)entity;
						link.Inlines.Add(url.DisplayUrl);
					}
					else if (entity is SymbolEntity)
					{
						var symbol = (SymbolEntity)entity;
						link.Inlines.Add(string.Format("{0}{1}",
							text[symbol.Indices[0]] == '$' ? '$' : '#',
							symbol.Text));
					}
					else if (entity is MediaEntity)
					{
						var media = (MediaEntity)obj;
						link.Inlines.Add(media.MediaUrl.AbsoluteUri);
					}

					inlines.Add(link);

					// *** エンティティ間/前後の文字列の挿入 ***

					var len = entity.Indices[1]; // エンティティの文字列の最終
					if (len != text.Length)
					{
						if (dic.Count > index + 1)
							inlines.Add(HttpUtility.HtmlDecode(
								text.Substring(len, dic[index + 1].Indices[0] - len)));

						else
							inlines.Add(HttpUtility.HtmlDecode(
								text.Substring(len, text.Length - len)));
					}
				});
			}
			else inlines.Add(HttpUtility.HtmlDecode(text));

			dic.Clear();
			dic = null;
		}

HSP ツイートボタンの代わりをしてみるテスト

;
;	ツイートボタンの代わりをしてみるテスト
;
#include "shell32.as"
#define SW_SHOWDEFAULT 10

#include "hspinet.as"
#include "encode.as"

twitterUrl = "https://twitter.com/intent/tweet"
twUrl  = "http://www.google.co.jp/"
twText = "ツイート内に含める文字"
twVia  = "ツイート内に含まれるユーザー名"
twHashtags = "ハッシュタグ"

input twUrl,  ginfo_winx
input twText, ginfo_winx
input twVia,  ginfo_winx
input twHashtags, ginfo_winx
button "ツイート", *twt
stop

;	ツイートを実行
*twt
	dest = ""
	url = ""

	;	Shift_JISをUTF-8にしてからパーセントエンコーディング
	sjis2utf8n dest, twText
	urlencode urlTwText, dest
	sjis2utf8n dest, twVia
	urlencode urlTwVia, dest
	sjis2utf8n dest, twHashtags
	urlencode urlTwHashtags, dest
	;	ツイート用URLを作成
	url = twitterUrl +"?url="+ twUrl +"&text="+ urlTwText +"&via="+ urlTwVia +"&hashtags="+ twHashtags

	mes url
	ShellExecuteA 0, 0, varptr(url), "", "", SW_SHOWDEFAULT
	stop

HSP モバイルWebでつぶやいてみる

	;
	;	MobileWEBからツイートする
	;

	//必要なモジュールをインクルード
		#include "hspinets.as"

	//IDとパスワード定義
		id=""
		pw=""

	//変数の定義
		valuebuf=""
		valuebuf2=""
		buf=""
		token=""
		logined=""

	chdir dir_cur
	//ログインページからトークン取得
		netinit
			neturl "https://mobile.twitter.com/session"
			netdlname "session.html"
			netload ""
		netterm
	//トークンを取得する
	notesel a
		noteload "session.html"
		nkfcnv buf,a,"W"

	notesel buf
		split buf,"value=\"",dst,valuebuf2
		split valuebuf2,"\"",token,dst
		mes token

	//ログインする
		netinit
			neturl "https://mobile.twitter.com/session"
			loginpost = "authenticity_token="+token+"&username="+id+"&password="+pw+""
			netrequest_post "",loginpost

			repeat
				netexec res
				if res > 0 : break
				if res < 0 : dialog"失敗" :end
				await 5
			loop
			netgetv logined
		netterm
		notesel logined
		notesave "logined.html"
		split logined,"force=",dst
		if stat-1>=1:mes "ログインに失敗"
		split logined,"Sign in information is not correct",dst
		if stat-1>=1:mes "ログインに失敗"
	//ツイートする
		netinit
			neturl "https://mobile.twitter.com/home"
			netdlname "main.html"
			netload ""
			notesel index
			noteload "main.html"
			split index,"<input name=\"authenticity_token\" type=\"hidden\" value=\"",dst,value2
			split value2,"\"",token2,dst
			mes token2
			if token!token2:dialog"不明なエラー"
			tweetpost = "authenticity_token="+token+"&tweet[text]=TEST"
			netrequest_post "",tweetpost
			repeat
				netexec res
				if res > 0 : break
				if res < 0 : dialog"失敗" :end
				await 5
			loop
			netgetv posted
		netterm
		dialog posted
	stop

HSP Tweetのハッシュタグ認識

#ifndef __HasyuTag__
#define __HasyuTag__
#include "kernel32.as"
#module

//--------------------------------------------------------------------------------------------------
/*

%index 
Tag
ツイートの解析

%prm
p1,p2,p3
p1 = 文字列 ; 解析結果が入ります
p2 = 文字列 : 解析するツイート
p3 = 文字列 : 解析したハッシュタグが代入されます

%
%*/
//--------------------------------------------------------------------------------------------------
#deffunc Tag var p1, str p2, var p3
miku = p2

value = instr(miku, , "#") + 1
getstr buf, miku, value, , instr(miku, value, "」")

MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0

if stat<3 {

	getstr buf, miku, value, , instr(miku, value, "-")
	MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
	if stat<3 {

		getstr buf, miku, value, , instr(miku, value, "【")
		MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
		if stat<3 {

			getstr buf, miku, value, , instr(miku, value, "?")
			MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
			if stat<3 {

				getstr buf, miku, value, , instr(miku, value, "!")
				MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
				if stat<3 {

					getstr miku, alt, value, , instr(miku, value, " ")
					MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
					if stat<3 {
					}
				}
			}
		}
	}

;この時点で[buf]にはハッシュタグのみが入っています
p3 = buf

split miku,"#",tweet1,tweet2,tweet3

kome="!#"+buf+"!";ハッシュタグの処理

bad=tweet1+kome

;ハッシュの処理
split miku,"#",mes1,mes2
;mes2に基本的に#以降が入る
split mes2," ",me1,me2
a=0;←こいつで判断

;分割 ハッシュタグ以降を切り取る
if strlen(me2)=0 {
	split mes2,"」",m1,m2
	a++
	if strlen(m2)=0 {
		split mes2,"-",ai,sou
		a++
		if strlen(sou)=0 {
			split mes2,"「",itibann,takara
			a++
			if strlen(takara)=0 {
				split mes2,"☆",yui,yuri
				a++
				if strlen(yuri)=0 {
					split mes2,"★",hinata,otonasi
					a++
					if strlen(otonasi)=0 {
						split mes2,"?",a1,a2
						a++
						if strlen(a2)=0 {
							split mes2,"【",a3,a4
							a++
							if strlen(a4)=0 {
								split mes2,"!",a5,a6
								a++
							}
						}
					}
				}
			}
		}
	}
}
if a=1 : op="」" : mes2=m2
if a=0 : op=" "  : mes2=me2
if a=2 : op="-"  : mes2=sou
if a=3 : op="「" : mes2=takara
if a=4 : op="☆" : mes2=yuri
if a=5 : op="★" : mes2=otonasi
if a=6 : op="?"  : mes2=a2
if a=7 : op="【" : mes2=a4
if a=8 : op="!"  : mes2=a6

angel=bad+op+mes2

p1=angel
return stat
#global

HSP UserStream取得

#runtime "hsp3cl"

#packopt name "USA"

#module
#defcfunc strCnt str p1, str p2
	string = p1
	count=0 : i=-1
	repeat
		i = instr(string, i+1, p2)
		if i=-1 : break
		count++
	loop
	logmes "21"
return count

#deffunc getBlockStr str p1, int p2, int p3, var block, var other
	string = p1
	count= 0 : i=0
	sdim p2_s
	poke p2_s, 0, p2
	head=instr(string, 0, p2_s)
	if head=-1 : block="" : other=string : return block

	repeat ,head
		if peek(string, cnt)=$00 : return "-1"
		if peek(string, cnt)=p2 : count++
		if peek(string, cnt)=p3 : count--
		if count=0 : break
		i++
	loop

	block=strmid(string, head, i+1)
	other=strmid(string, head+i+1, strlen(string))
return block
#global

#include "TsubuyakiSoup.as"
#module UserStream

#uselib "crtdll.dll"
#func time "time" var

#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, int, int, int
#func InternetSetOption "InternetSetOptionA" int, int, int, int

#define INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 0x2000
#define INTERNET_FLAG_IGNORE_CERT_CN_INVALID 0x1000

//------------------------------------------------------------
//OAuth認証を含めた、UserStreamの初期化
#deffunc UserStreamInit var p1, var p2, int p3, str p4, array p5
//  引数チェック&初期化
	sdim p1
	sdim p2
	API = p4
	if vartype(p5) != 2 : return 0
	hConnect = 0		//InternetConnectのハンドル
	hRequest = 0		//HttpOpenRequestのハンドル
	API_statcode = 0	//リクエストの結果コード
	API_p1Length = 0	//データ長
	API_rsize = 1024	//バッファ初期値
	API_hsize = 0		//取得したバイト数が代入される変数

	dup TS_AccessToken,TS_AccessToken@TsubuyakiSoup
	dup TS_Consumer_Key, TS_Consumer_Key@TsubuyakiSoup
	dup TS_Consumer_Secret,TS_Consumer_Secret@TsubuyakiSoup
	dup TS_AccessTokenSecret, TS_AccessTokenSecret@TsubuyakiSoup
	dup TS_RequestToken, TS_RequestToken@TsubuyakiSoup
	dup TS_RequestTokenSecret, TS_RequestTokenSecret@TsubuyakiSoup
//  メソッドの設定
	if (p3 = 1) {
		Method = "POST"
	} else {
		Method = "GET"
	}
//  ポート&フラグの設定
	UsePort = 443 : RequestFlag = -2147483648 | 0x800000 | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |INTERNET_FLAG_IGNORE_CERT_CN_INVALID : Scheme = "https"
	VersionStr = "2/"
	TokenStr = TS_AccessToken
	SigKey = TS_Consumer_Secret+" "+TS_AccessTokenSecret
	if (strmid(API,0,5) = "oauth") {
		VersionStr = ""
		if (API = "oauth/access_token") {
			repeat length(p5)
				if (p5(cnt) = "x_auth_mode=client_auth") : UsePort = 443 : RequestFlag = -2139082752 : Scheme = "https" : break
				if cnt = length(p5)-1 : TokenStr = TS_RequestToken : SigKey = TS_Consumer_Secret+" "+TS_RequestTokenSecret
			loop
		}
	}
//  シグネチャ生成
	SigArrayMax = 6 + length(p5)
	sdim SigArray, 500, SigArrayMax
	SigNonce = RandomString(8,32)
	time SigTime
	SigArray(0) = "oauth_consumer_key=" + TS_Consumer_Key
	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"
	repeat SigArrayMax - 6
		SigArray(6+cnt) = p5(cnt)
	loop
	//ソート
	SortString SigArray
	//"&"で連結
	TransStr = ""+ Method +" "+ Scheme +"://userstream.twitter.com/"+ VersionStr + API +" "
	repeat SigArrayMax
		if SigArray(cnt) = "" : continue
		TransStr += SigArray(cnt) +"&"
	loop
	TransStr = strmid(TransStr, 0, strlen(TransStr)-1)
	Signature = SignatureEncode(TransStr, SigKey)
//  データ整形
	if (p3 = 1) {
		//POST
		PostStr = ""
		repeat SigArrayMax
			PostStr += SigArray(cnt) +"&"
		loop
		PostStr += "oauth_signature="+ Signature
		PostStrLen = strlen(PostStr)
		AddUrl = ""
	} else {
		//GET
		PostStr = 0
		PostStrLen = 0
		AddUrl = "?"
		repeat SigArrayMax
			AddUrl += SigArray(cnt) +"&"
		loop
		AddUrl += "oauth_signature="+ Signature
	}
	logmes TransStr
	//サーバへ接続
	hConnect = InternetConnect(TwiH_hInet@TsubuyakiSoup, "userstream.twitter.com", UsePort, 0, 0, 3, 0, 0)
	if (hConnect) {
		//リクエストの初期化
		hRequest = HttpOpenRequest(hConnect, Method, VersionStr+API+AddUrl, "HTTP/1.1", 0, 0, RequestFlag, 0)
		if (hRequest) {
			logmes VersionStr+API+AddUrl
			//サーバへリクエスト送信
			if ( HttpSendRequest(hRequest, 0, 0, PostStr, PostStrLen)) {
				API_statcode = 0
			} else {
				//サーバへリクエスト送信できなかった場合
				API_statcode = -2
			}
		} else {
			//Requestハンドルを取得できなかった場合
			API_statcode = -3
		}
		} else {
		//Connectハンドルを取得できなかった場合
		API_statcode = -4
	}
return API_statcode

//適当な部分もある、UserStreamのヘッダ取得
#deffunc getHead_US var p2
				//ヘッダを取得する変数の初期化
				p2Size = 3000
				sdim p2, p2Size
				//ヘッダの取得
				if ( HttpQueryInfo(hRequest, 22, p2, p2Size, 0) ) {
					//ヘッダの解析
					notesel p2
					repeat notemax
						noteget API_BufStr, cnt
						API_buf = instr(API_BufStr, 0, "Status: ")				//ステータスコード
						if (API_Buf != -1) : API_statcode = int(strmid(API_BufStr, API_buf+8, 3))
						API_buf = instr(API_BufStr, 0, "Content-Length: ")		//長さ
						if (API_Buf != -1) : API_p1Length = int(strmid(API_BufStr, -1, strlen(API_BufStr)-API_buf+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
				} else {
					//ヘッダの取得ができなかった場合
					API_statcode = -1
				}
return API_statcode

//適当な部分もある、UserStreamのデータ取得
#deffunc getBody_US var p1
				wait 10
				p2Size = 3000
				sdim p2, p2Size
					//入手可能なデータ量を取得
					InternetQueryDataAvailable hRequest, varptr(API_rsize), 0, 0
					//バッファの初期化
					sdim API_bufStr, API_rsize+1
					sdim p1, API_rsize+1
					repeat
						InternetReadFile hRequest, API_bufStr, API_rsize, API_hsize
						p1 += strmid(API_bufStr, 0, API_hsize)
						wait 10
						if (API_hsize = 1)||(API_hsize!API_rsize)||(API_hsize=0) : break
					loop

return API_statcode

#global

#uselib "KERNEL32.DLL"
#cfunc OpenProcess "OpenProcess" int,int,int
#func GetExitCodeProcess "GetExitCodeProcess" int,int
#define PROCESS_QUERY_INFORMATION $400	//OpenProcess時に使う。

//コマンドライン解析用。http://lldev.jp/hsp/tips/miscellaneous.html#cmdlineprmsからDLしてください。
#include "cmdline_parser/gm_cmdline_parser.hsp"

;サンプル用設定ファイル
#include "SampleSetting.hsp"
if CONSUMER_KEY = "" : mes "「SampleSetting.hsp」でConsumerKeyとConsumerSecretを設定してください。" : end

	if getarg(0,1)="" : mes "USA: 引数が不正です。" : 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

	repeat						//コマンドラインの2~の要素を、UserStreamAPIに対しての引数とする。
		if getarg(cnt+2,1)="" : break
		Arg.cnt = getarg(cnt+2,1)
	loop
	parentpid = int(getarg(1,1))
	hParent=OpenProcess(PROCESS_QUERY_INFORMATION, 0, parentpid)	//親プロセス実行状況確認時に使う。
	if hParent=0 : mes "USA: error "+__LINE__ : wait 500 : end		//OpenProcessが実行できなかった場合。

	api = getarg(0,1)
	UserStreamInit body, head, 0, api, Arg	; HTTPS

	buf=""
*main
	;	結果待ちのためのループ
	wait 100

	getBody_US body
	buf+=body
	gosub *comp

	exitcode = 0
	GetExitCodeProcess hParent, varptr(exitcode)	//親プロセスの実行状況確認
	if exitcode!$103 : goto *exit					//親プロセスが閉じられていたら、*exitへ。
	wait 30
	goto *main

*exit
	//親プロセスが閉じられたっぽい。
	mes "USA: exit"
	wait 500
	end

*comp
	;	完了
	getBlockStr body, '{', '}', block, buf	//bodyの{と}の間をブロックとしてblockに格納、余ったごみをbufへ。
	mes block
	return

よく投稿されているコード

タグ

最近投稿されたコード