flash on 2012-4-21
♥0 |
Line 338 |
Modified 2012-04-23 12:02:52 |
MIT License
archived:2017-03-30 02:55:03
ActionScript3 source code
/**
* Copyright tepe ( http://wonderfl.net/user/tepe )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/swXj
*/
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.text.*;
public class twit1 extends Sprite {
private var _resultStage:Sprite = new Sprite();
private var maxID:Number=0;//これより古いIDを取得
private var sinceID:Number=0;//これより新しいIDを取得
private var tlTop:Number = 25;
private var tlBottom:Number;
private var titleArea:Sprite = new Sprite();
private var keyword:String;
private var serchWord:TextField = new TextField();
public function twit1():void {
//背景
titleArea.graphics.beginFill(0x39CCFF);
titleArea.graphics.drawRect(0, 0, 165, 23);
//Serchの文字
serchWord.text = "検索:";
serchWord.width = 33;
serchWord.height = 18;
serchWord.x = 2;
serchWord.y = 2;
serchWord.textColor = 0xFFFFFF;
titleArea.addChild(serchWord);
titleArea.x =300;
//テキスト入力欄。キーボードのキーを押し上げた際にonKeyUpが実行される
var title:TextField = new TextField();
with(title){
text = "wonderfl";
width = 126;
height = 18;
x = 36;
y = 2;
border = true;
borderColor = 0xFFFFFF;
background = true;
backgroundColor = 0x99DDFF;
type = TextFieldType.INPUT;
addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
}
titleArea.addChild(title);
serchWord.addEventListener(MouseEvent.CLICK,function():void{
if(title.text != keyword){
setKeyword(title.text);
request();
}
});
//検索結果を配置するSpriteをaddChild
_resultStage.y = 25;
addChild(_resultStage);
addChild(titleArea);
//初期状態で検索結果画面が出るように、検索を実行する。
//setUserID("kis");
//request();
_resultStage.addEventListener(MouseEvent.MOUSE_OVER,addScrool);
_resultStage.addEventListener(MouseEvent.MOUSE_OUT,removeScrool);
}
private function removeScrool(e:MouseEvent):void{
removeEventListener(Event.ENTER_FRAME,onFrame);
addEventListener(Event.ENTER_FRAME,stopScr);
}
private function addScrool(e:MouseEvent):void{
addEventListener(Event.ENTER_FRAME,onFrame);
}
private function stopScr(e:Event):void{
if(1<Math.abs(scrSpeed))scrSpeed/=1.001;
else{
scrSpeed=0;
removeEventListener(Event.ENTER_FRAME,stopScr);
}
if(_resultStage.y+(scrSpeed*100)>tlTop || _resultStage.y+(scrSpeed*100)<tlBottom){
scrSpeed/=1.1;
}
_resultStage.y-=scrSpeed;
}
private var scrSpeed:Number=0;
private var requestNow:Boolean=false;
private function onFrame(e:Event):void{
if(mouseY < 100 && mouseY-100 < scrSpeed*10 ){
if(tlTop > _resultStage.y)scrSpeed = (mouseY-100)/10;
else scrSpeed=0;
}
else if(350 < mouseY && scrSpeed*10 < mouseY-350){
scrSpeed = (mouseY-350)/10;
}
else {
if(0.1<Math.abs(scrSpeed))scrSpeed/=1.05;
else scrSpeed=0;
}
_resultStage.y-=scrSpeed;
if(-tlBottom+600 > _resultStage.y && requestNow==false){
moreRequest();
requestNow=true;
}
}
private function onKeyUp(e:KeyboardEvent):void {
//Enterキーのキーコード13だったら、serchメソッドを実行。引数には適すと入力欄の文字列
if (e.keyCode == 13) {
setKeyword(e.currentTarget.text);
request();
}
}
private var requestURL:String;
//リクエスト実行
public function request():void{
//_resultStage上のオブジェクトを全て削除
tlBottom=0;
while (_resultStage.numChildren) {
_resultStage.removeChildAt(0);
}
_resultStage.y = 25;
var myURLLoader:URLLoader = new URLLoader();
myURLLoader.addEventListener(Event.COMPLETE, onCompleteXML);
myURLLoader.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
myURLLoader.load(new URLRequest(requestURL));
}
//キーワードを指定してリクエスト
public function setKeyword(keyword:String=""):void{
if(keyword=="")return;
var myURLLoader:URLLoader = new URLLoader();
var xmlURL:String = "http://search.twitter.com/search.atom?q=";
xmlURL += encodeURIComponent(keyword);
requestURL = xmlURL;
}
//ユーザーを指定してリクエスト
public function setUserID(userID:String=""):void{
if(userID=="")return;
//url指定
const SEARCH_PARAMS:Object = { rpp:20 };//取得数
var xmlURL:String = "http://search.twitter.com/search.atom?q="+"from%3A"+ userID
for (var key:String in SEARCH_PARAMS) {
xmlURL += "&" + key + "=" + SEARCH_PARAMS[key];
}
requestURL = xmlURL;
}
//追加リクエスト
public function moreRequest():void{
var myURLLoader:URLLoader = new URLLoader();
myURLLoader.addEventListener(Event.COMPLETE, onCompleteXML);
myURLLoader.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
myURLLoader.load(new URLRequest(requestURL + "&max_id=" + maxID.toString()));
}
public function onIoError(e:IOErrorEvent):void {
trace(e.type);
}
private function idNum(id:String):String{
var reg:RegExp = new RegExp();
reg = /:\d+/;
var result:Object = reg.exec(id);
var str:String = id.substring(result.index+1);
return str;
}
//URLにリンクタグを付ける
private function setHttpLink(str:String):String{
var reg:RegExp = new RegExp();
reg = /http(:|s:)\/\/[\w.%&\/]+/g;
var result:Object;
var res2:String=new String();
var str2:String;
var prev:int=0;
for(var i:int =0;i<10;i++){
result = reg.exec(str);
if(result == null)break;
if(reg.lastIndex!=0){
res2+=str.substring(prev,result.index);
str2 = str.substring(result.index,reg.lastIndex);
res2+="<a href='" + str2 + "' target='_blank'>"+ '<u><font color="#0088ff">'+ str2+"</font></u>"+"</a>";
prev=reg.lastIndex;
}
else{
res2+=str.substring(prev,result.index);
str2 = str.substring(result.index);
res2+="<a href='" + str2 + "' target='_blank'>"+ '<u><font color="#0088ff">'+ str2+"</font></u>"+"</a>";
prev=str.length;
break;
}
}
res2+=str.substring(prev);
return res2;
}
//表示名取得
private function getUserName(str:String=""):String{
var reg:RegExp = new RegExp();
reg = / (.*)/;
var result:Object;
var str2:String;
result = reg.exec(str);
str2 = str.substring(result.index+2,str.length-1);
return str2;
}
//アカウント名取得
private function getAccountName(str:String=""):String{
var reg:RegExp = new RegExp();
reg = / /;
var result:Object;
var str2:String;
result = reg.exec(str);
str2 = str.substring(0,result.index);
return str2;
}
//ID取得
private function getUserID(str:String=""):String{
var reg:RegExp = new RegExp();
reg = /.+ /;
var result:Object;
var str2:String;
result = reg.exec(str);
str2 = str.substring(result.index,str.length-1);
return str2;
}
private function removeTag(str:String=""):String{
var reg:RegExp = new RegExp();
reg = /#[^ $]+/g;
var result:Object;
var res2:String=new String();
var str2:String;
var prev:int=0;
for(var i:int =0;i<10;i++){
result = reg.exec(str);
if(result == null)break;
if(reg.lastIndex!=0){
res2+=str.substring(prev,result.index);
prev=reg.lastIndex;
}
else{
res2+=str.substring(prev,result.index);
prev=str.length;
break;
}
}
res2+=str.substring(prev);
return res2;
}
//タイムスタンプ取得
private function getTime(str:String):Date{
var year:int, mon:int, day:int, hour:int, min:int, sec:int;
//日付取得
var reg:RegExp = new RegExp();
reg = /\d\d\d\d-\d\d-\d\d/g;
var res:Object= reg.exec(str);
var str2:String = str.substring(res.index,reg.lastIndex);
year = parseInt(str2.substring(0,4));
mon = parseInt(str2.substring(5,7))-1;
day = parseInt(str2.substring(8,10));
//時間取得
var reg2:RegExp = new RegExp()
reg2 = /\d\d:\d\d:\d\d/g;
res = reg2.exec(str);
str2 = str.substring(res.index,reg2.lastIndex);
hour = parseInt(str2.substring(0,2));
min = parseInt(str2.substring(3,5));
sec = parseInt(str2.substring(6,8));
//日時データ生成
var dat:Date = new Date(year,mon,day,hour,min,sec);
dat.minutes-=dat.timezoneOffset;//GMTをローカルタイムに修正
return dat;
}
//タグリスト取得
private function getTag(str:String):Array{
var tagList:Array = new Array();
var reg:RegExp = new RegExp();
var result:Object;
var tag:String;
reg = /#[^ $]+/g;
for(var i:int =0;i<10;i++){//10以上は取らない
result = reg.exec(str);
if(result == null)break;
if(reg.lastIndex!=0){
tag = str.substring(result.index,reg.lastIndex);
tagList.push(tag);
}
else{
tag = str.substring(result.index,str.length);
tagList.push(tag);
break;
}
}
return tagList;
}
//ツイートデータ
// id:Number ツイートID
// time:Date タイムスタンプ
// title:String 本文。htmlText形式。ハッシュタグは非表示。
// userName:String ユーザー表示名
// account:String アカウント名
// tag:Array ハッシュタグ
// imgURL:String ユーザーアイコンのURL
// link:String ユーザータイムラインのURL
private function twitObj(entry:XML):Object{
default xml namespace = new Namespace("http://www.w3.org/2005/Atom");
var item:Object = new Object();
item.time = getTime( entry.published);//文字列 → 日時データ
item.id = Number( idNum( entry.id));//ツイートID
item.link = entry.author.uri;//ユーザータイムラインへのリンク
item.userName = getUserName( entry.author.name);//ユーザー名(表示名)
item.account = getAccountName( entry.author.name);//アカウント名
item.title = setHttpLink( removeTag( entry.title));//本文 タグ除外
item.tag = getTag( entry.title);//タグリスト
//アイコン画像のURLを取得
var imgURL:String = entry.link[1].@href;
var extention:String = imgURL.substr( -4);
extention = extention.toLowerCase();
if (extention != ".jpg" && extention != ".gif" && extention != ".png") {
imgURL = "http://s.twimg.com/a/1254440757/images/default_profile_mini.png";//デフォルトアイコン
}
imgURL = encodeURI(imgURL);
item.imgURL = imgURL;
return item;
}
private var dat2:Date = new Date();
private function onCompleteXML(e:Event):void {
requestNow = false;
//eventListenerを削除
e.currentTarget.removeEventListener(Event.COMPLETE, onCompleteXML);
//XML型にキャスト
var myXML:XML = new XML(e.currentTarget.data);
//namespaceを設定
default xml namespace = new Namespace("http://www.w3.org/2005/Atom"); //*2
//ヘッダーの下
var tfY:int = tlBottom;
//要素を取り出して、textFieldを作りならべる
var itemLength:int = myXML.entry.length();
maxID=myXML.max_id;
var dat3:Date = new Date();
var item2:Object = twitObj(XML(myXML.entry[0]));
if(maxID==0)maxID = Number( idNum(myXML.entry[0].id) );
if(sinceID==0)sinceID = Number( idNum(myXML.entry[0].id) );
for (var i:int = 0; i < itemLength; i++) {
var item:Object = twitObj(XML(myXML.entry[i]));
//日時タグ作成
if(item.time > dat3.time){
var dTag:TextField = new TextField();
with(dTag){
width = 460;
x = 2;
Wrap = true;
background = true;
backgroundColor = 0xFFFFFF;
border = true;
borderColor = 0x39CCFF;
//htmlText = "";
autoSize = "left";
}
dTag.text = String(dat3.month+1)+"/"+String(dat3.date)+"\n";
//テキストフィールドのy座標はtfYに加算していくことにより、決定
dTag.y = tfY+50;
tfY += dTag.height + 53;
_resultStage.addChild(dTag);
dat2 = dat3;
}
//-------------
//idの評価
if(sinceID < item.id )sinceID=item.id;
if( item.id < maxID )maxID=item.id;
//--------------
//得られた各値をhtmlTextに入るように整形
var htmldata:String = "";
htmldata = "<a href='" + item.link + "' target='_blank'>";
htmldata += "<img src='" + item.imgURL + "' width='48' height='48' />";
htmldata += "</a>";
htmldata += "<b>" + item.userName + "</b> ";
htmldata += "<b>"+item.time.toLocaleTimeString()+"\n</b> ";
//htmldata += "<b>"+dat1.toString()+"\n" + ts+"</b> ";
htmldata += "\n"+item.title;
//検索結果のテキストフィールド
var tf:TextField = new TextField();
tf.width = 460;
tf.x = 2;
tf.wordWrap = true;
tf.background = true;
tf.backgroundColor = 0xFFFFFF;
tf.border = true;
tf.borderColor = 0x39CCFF;
tf.htmlText = htmldata;
tf.autoSize = "left";
//テキストフィールドのy座標はtfYに加算していくことにより、決定
tf.y = tfY;
tfY += tf.height + 3;
_resultStage.addChild(tf);
}
tlBottom=tfY;
}
}
}