twitter APIとjQueryでtwitter widgetを作成する
twitterのwidgetのデザインをカスタマイズしたいのと、リプライを表示させたくないと言う理由からtwitter APIとjQueryを使ってオリジナルのwidegetを作成しました。
当ブログでは殆どデザインしてませんが、公式のwidgetに近いデザインで作成する場合の記事にしました。
twitterのwidgetのデザインをカスタマイズしたいのと、
リプライを表示させたくないと言う理由から
twitter APIとjQueryを使ってオリジナルのwidegetを
作成しました。
当ブログでは殆どデザインしてませんが、
公式のwidgetに近いデザインにする場合の制作方法を書きました。
サンプル

ベースはA jQuery Twitter Ticker | Tutorialzineを参考にしてます。
また複数ユーザーのツイートを表示したい場合は上記サイトが参考になります。
ソース
jQuery
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script> <script type="text/javascript" src="jquery.mousewheel.js"></script> <script type="text/javascript" src="jquery.jscrollpane.min.js"></script> <link rel="stylesheet" type="text/css" href="jquery.jscrollpane.css" />
jQueryはgoogleのCDNを利用してます。
jScrollPaneはスクロールバーの機能を提供するスクリプトです。
jScrollPane – cross browser styleable scrollbars with jQuery and CSS
のダウンロード→download a zipから一式取得できます。
mousewheel.jsはスクロールバーをマウスホイールに対応させます。
mousewheel.jsもjScrollPaneの一式に入ってます。
jScrollPaneのスタイルを適用させるためjquery.jsrollpane.cssも読み込みます。
<script type="text/javascript">
$(function(){
var screenName = 'barchin'; //初期設定1:スクリーンネーム
//twitter API
var twitAPI = "http://api.twitter.com/1/statuses/user_timeline.json?callback=?";
//JSON取得
$.getJSON(twitAPI,
{
screen_name: screenName,
count: '20', //初期設定2:書き出すツイート数
exclude_replies :true //リプライ表示・非表示
},
function(data){
//プロフ取得
var userName = data[0].user.name;
var userId = data[0].user.name;
var userPic = '<img src="'+data[0].user.profile_image_url+'" />';
$("#userName").html(userName); //ユーザー名出力
$("#userPic").html(userPic); //アイコン出力
$("#screenName").html('<a href="http://twitter.com/'+screenName+'">'+screenName+'</a>'); //スクリーンネーム出力
var container=$('#tweet-container');
container.html('');
//#tweet-containerの初期化
//ツイートごとに処理
$.each(data, function(i, item){
var str = ' <div class="tweet">\
<div class="txt">'+formatTwitString(item.text)+'</div>\
<div class="time">'+relativeTime(item.created_at)+'</div>\
<div class="action"><a href="http://twitter.com/intent/retweet?tweet_id='+item.id_str+'">retweet</a>│<a href="http://twitter.com/intent/favorite?tweet_id='+item.id_str+'">favorite</a></div>\
</div>';
//ツイートをソースに追加
container.append(str);
});
//jScroll
container.jScrollPane();
});
$('#tweet').show('slow');
});
// ツイート本文フォーマットfunction
function formatTwitString(str)
{
str=' '+str;
str = str.replace(/((ftp|https?):\/\/([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?)/gm,'<a href="$1" target="_blank">$1</a>');
// URLにリンクを付ける
str = str.replace(/([^\w])\@([\w\-]+)/gm,'$1@<a href="http://twitter.com/$2" target="_blank">$2</a>');
// メンションにリンク
str = str.replace(/([^\w])\#([\w\-]+)/gm,'$1<a href="http://twitter.com/search?q=%23$2" target="_blank">#$2</a>');
// ハッシュにリンク
return str;
}
// ツイートの時間を割り出す
function relativeTime(pastTime)
{
var origStamp = Date.parse(pastTime);
var curDate = new Date();
var currentStamp = curDate.getTime();
var difference = parseInt((currentStamp - origStamp)/1000);
if(difference < 0) return false;
if(difference <= 5) return "Just now";
if(difference <= 20) return "Seconds ago";
if(difference <= 60) return "1 minute ago";
if(difference < 3600) return parseInt(difference/60)+" minutes ago";
if(difference <= 1.5*3600) return "1 hour ago";
if(difference < 23.5*3600) return Math.round(difference/3600)+" hours ago";
if(difference < 1.5*24*3600) return "1 day ago";
// 1日前の場合はその日付を
var dateArr = pastTime.split(' ');
return dateArr[1]+' '+dateArr[2]+
(dateArr[3]!=curDate.getFullYear()?' '+dateArr[3]:'');
}
</script>
まずTwitterAPIを使ってツイートのストリームをJSON形式で取得します。
初期設定として、スクリーンネームを入力します。
表示するツイート数、リプライの表示設定などもします。
プロフィール情報もJSONから取得します。
各ツイートにはそのツイート発言者の情報が含まれており、
今回は全てのツイートが同一ユーザーなので一番目のツイートから情報取得してます。
各ツイートごとに処理を行います。
ツイート文はそのままの状態ではURLなどにリンクが貼られてないので、
formatTwitStringを使ってリンクを付けます。
投稿時間はそのままでは投稿した時間となるのでrelativeTimeを使って、
現在時間との差を割り出しどのくらい前の投稿か表示します。
jScrollを実行してスクロールバーの機能を実装します。
HTML
<body> <div id="top-bar"> <a href="http://twitter.com/barchin"><img src="img/img_topBar.jpg" alt="follow me!" width="300" height="110" /></a> </div> <div id="twitter-widget"> <div id="prof"> <div id="userPic">Loading...</div> <div id="screenName">Loading...</div> <div id="userName">Loading...</div> </div> <!--stream--> <div id="tweet-container"> Loading... </div> <!--/#streem--> </div> </body>
#profでは、twitterのアイコンやユーザー名を表示します。
#twee-container内にストリームを表示します。
CSS
<style type="text/css">
a, a:visited {
color:#00BBFF;
text-decoration:none;
}
a:hover{
text-decoration:underline;
}
#top-bar{
width:300px;
}
/* widget*/
#twitter-widget{
padding:0 5px;
width:290px;/*300px*/
height:350px;
background:url(img/bg_ticker.jpg) no-repeat #50340d;
color:#666666;
/* 角丸 */
-moz-border-radius:0 0 6px 6px;
-khtml-border-radius: 0 0 6px 6px;
-webkit-border-radius:0 0 6px 6px;
border-radius:0 0 6px 6px;
}
/* ツイートのストリーム */
#tweet-container{
height:270px;
width:100%;
overflow:auto;
background:rgba(0,0,0,0.2);
-webkit-box-shadow: inset 1px 1px 3px 0px #000; /* Safari, Chrome用 */
-moz-box-shadow: inset 1px 1px 3px 0px #000; /* Firefox用 */
box-shadow: inset 1px 1px 3px 0px #000; /* CSS3 */
}
/*プロフィール*/
#prof{
padding:0 8px;
height:60px;
overflow:hidden;
}
#userPic{
float:left;
}
#userPic img{
-moz-border-radius:3px;
-khtml-border-radius:3px;
-webkit-border-radius:3px;
border-radius:3px;
}
#screenName{
margin:0 0 0 55px;
font-weight:bold;
font-size:14px;
}
#screenName a{
color:#fff;
text-decoration:underline;
}
#userName{
margin:0 0 0 55px;
color:#fff;
}
/*tweet*/
.tweet{
margin:5px 8px;
padding:5px 0;
color:#fff;
width:auto;
overflow:hidden;
}
/*post時間*/
.tweet .time{
display:inline;
text-transform:uppercase;
font-size:10px;
color:#aaa;
white-space:nowrap;
}
/*retweet&favorite*/
.tweet .action{
display:inline;
padding-left:1em;
}
/*text*/
.tweet .txt{
}
/*scroll bar*/
.jspTrack{
background-color:#fff;
-webkit-box-shadow: inset 1px 1px 1px 0px #000; /* Safari, Chrome用 */
-moz-box-shadow: inset 1px 1px 1px 0px #000; /* Firefox用 */
box-shadow: inset 1px 1px 1px 0px #000; /* CSS3 */
}
.jspDrag{
background-color:#805400;
-webkit-box-shadow: inset -1px -1px 1px 0px #000; /* Safari, Chrome用 */
-moz-box-shadow: inset -1px -1px 1px 0px #000; /* Firefox用 */
box-shadow: inset -1px -1px 1px 0px #000; /* CSS3 */
background-image: linear-gradient(bottom, rgb(97,62,1) 0%, rgb(128,83,0) 100%);
background-image: -o-linear-gradient(bottom, rgb(97,62,1) 0%, rgb(128,83,0) 100%);
background-image: -moz-linear-gradient(bottom, rgb(97,62,1) 0%, rgb(128,83,0) 100%);
background-image: -webkit-linear-gradient(bottom, rgb(97,62,1) 0%, rgb(128,83,0) 100%);
background-image: -ms-linear-gradient(bottom, rgb(97,62,1) 0%, rgb(128,83,0) 100%);
}


Comment
コメント(0)
コメントはまだありません。
コメントする
Trackback(0)