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)