自分のTweetをblog形式で表示するOpenPNE3用のプラグインにチャレンジ。
呟きをblogのように日付で整理し月別やリプライ別に検索表示したりできます(実際はまだそこまで作りこんでませんが)。

過去の呟きは全てDBにキャッシュ(過去のツブヤキは最大32,000件まで取得)しているのでTwitter側のレスポンスに左右されることなく動きます。
今回もsymfonyに慣れたいが故の制作ですが、まだまだ思い通りに使いこなすには時間がかかりそうです。
学習目的ですがOpenPNE3のプラグインとしてOAuthプラグインを作ってみました。
え?これで実際何ができるかって。。。
これだけだと単に対応サービスへのアクセス権を得るだけです、具体的には有効なトークン情報をDBへ保存するだけの極々簡素なもの(^^;
後はこのDBに保存されたトークンを使って煮るなり焼くなり好きにしてって感じw
画像はこの情報を使って実際にTwitterのプロフィール情報とGmailのINBOXから情報をひっぱり出してみたよの図です。
Twitterの場合はそれそのものがサービスの実体なのですが、Googleの場合は複数のサービスが存在するため、scopeパラメータを使い許可するサービスを指定します。
下の図は、GoogleのOAuthでGmailとCalendarを指定した場合に表示される確認画面です。

※2010/5/20:追記
この記事を書いた直後、サンフランシスコで開催されているGoogle I/Oでの発表と合わせGoogle Buzzの仕様が更新されBuzzでもOAuthが使えるようになったことをTwitterのTLで知りました、参考までにBuzzのScopeはこんな感じです。
| Scope | Meaning |
|---|---|
| https://www.googleapis.com/auth/buzz | read and write |
| https://www.googleapis.com/auth/buzz.readonly | read-only access |
とりあえずベータ版として公開、OpenPNE2専用(テンプレート挿入型)のタイムラインビュアーです(現状投稿機能はありません)。
インストールは他のモジュールと同様、explateディレクトリ内にtwitterディレクトリを丸ごと転送、setupディレクトリ内のファイル(openpne.sql、openpne.css、openpne.tpl)を設定して下さい。
※詳細はreadme.txt参照
OAuth認証のライブラリーは twitteroauth を使っています。
twitteroauth/ディレクトリ(OAuth.php twitteroauth.php)をOpenPNEのインストールサーバー(OpenPNE/webapp/lib/twitteroauth/)コピーして下さい。
ダウンロードtwitter20100429.zip


※OAuth認証用アカウントとして http://twitter.com/tweetinpne を使っていますが、ご自由に変更して頂いて構いません。
まず管理画面から「Twitterガジェットを利用する」の項目を追加します。
管理画面|SNS設定|プロフィール項目設定|プロフィール項目追加
| 項目名: | Tweeterガジェットの利用 |
|---|---|
| 識別名: | use_twitter |
| 必須: | □ |
| 公開設定の選択: | 固定 |
| 公開設定デフォルト値: | 全員に公開 |
| 新規登録: | 表示する |
| プロフィール変更: | 表示する |
| メンバー検索: | 表示する |
| 説明: | HOME画面でTweeterガジェットを利用する場合はチェック |
| フォームタイプ: | 複数選択(チェックボックス) |
.
■プロフィール選択肢一覧
Tweeterガジェットの利用
| ID | 項目名 | 並び順 |
|---|---|---|
| xxx | 利用する | 1 |
上記を設定することで、$c_member.profile.use_twitter.value[0]に値が入ってきますのでそれを判定に利用します、具体的には以下のようにテンプレートの中身を判定で挟みテンプレート挿入して下さい。
({/if})
つぶやき機能が欲しい、PNEからも呟きたい!そんな要望にお応えして、OpenPNE2に簡単に組み込めるTwitterモジュールを作ってみました、まだプロトタイプ版ではありますが中々快適に動作しています。過去幾つか公開しているモジュール同様explateがインストールされているOpenPNE2であれば、ファイルコピーと管理画面からのテンプレート挿入とカスタムCSSの追加で動作します。
Twitterへの認証方法もアカウント情報を預かることなく可能なOAuthを使用していますので、SNS側でパスワードを保存する必要もなくかなり気軽に(?)使えると思います。
|
|
| 認証前 | 認証後Timeline表示 |
今度は、フレンド申請を利用したスパムが流行っているそうなので簡単な業者対策を。
以前ここで紹介した「メッセージスパム対策」と殆ど同じ方法です。
webapp/modules/pc/do/f_link_request_insert_c_friend_confirm.php
38行目に(OpenPNE 2.12.7の場合)、以下のコードを挿入してみて下さい。
//-----------------------
$sql = "SELECT r_datetime FROM c_friend_confirm WHERE c_member_id_from=? ORDER BY c_friend_confirm_id DESC";
$unxLast = strtotime(db_get_one($sql,array($u)));
$difMinute = (time()-$unxLast)/60;
if ( $difMinute < 10 ) { //10分
openpne_redirect('pc', 'page_h_access_block');
}
//-----------------------
さて、メッセージの場合は認証文字を打ち込むのが面倒ですが、「フレンド申請」の場合はそれほど利用頻度が高くないので、「友達を誘う」画面のようなキャプチャ認証を入れても良のではないでしょうか?
というわけで、以下の画面のような「キャプチャ認証」を導入する改造方法も載せておきます。
※MyNETSでは同じような対策がされるようです。

多少複雑になりますが「友達を誘う」のキャプチャ認証と同じ方法です。
修正するファイルは次の3つ。
26行目に次のコードを挿入。
//----------------------------------------------
({if $smarty.const.OPENPNE_USE_CAPTCHA})
<table>
<tr>
<th>確認キーワード</th>
<td>
<p><img src="./cap.php?rand=({math equation="rand(0,99999999)"})" alt="確認キーワード" /></p>
<p>※上に表示されているキーワードをご記入下さい。</p>
({/if})
<input type="text" class="input_text" name="captcha" value="" size="30" />
</td>
</tr>
</table>
//----------------------------------------------
38行目に次のコードを挿入。
//----------------------------------------------
if (OPENPNE_USE_CAPTCHA && (empty($_SESSION['captcha_keystring']) || $_SESSION['captcha_keystring'] != $requests['captcha'])) {
unset($_SESSION['captcha_keystring']);
$msg = "確認キーワードが誤っています";
$_REQUEST['msg'] = $msg;
openpne_forward('pc', 'page', "f_link_request");
exit;
}
//----------------------------------------------
ファイルの最後に追加以下のコードを追加
[captcha]
type = "string"
default = ""
メッセージに管理者が設定した特定の単語(特定URLやメールアドレス、放送禁書用語など)が含まれていたら、受け付けないような機能を追加します。
本来はデータベースにNGワード管理用のテーブルを追加して専用の入力フォームを作って、とやるところなのでしょうが、今回は簡単実装に拘ります!
だからと言ってNGワードを別ファイルやソースコードに埋め込むことで追加、編集、削除が面倒になるのも問題です、更にNGワードのメンテナンスは管理者1人だけではなく、SNS内の信用できる仲間と共同で管理したい、そんな夢のような(笑)ことがDBを一切弄ることなく、数行のコードを追加するだけで実現できてしまうのがOpenPNEの素晴らしいところなのです。
では以下に、その方法を説明します。
作成する時の条件は「参加条件と公開範囲」を「管理者の承認が必要、掲示板:コミュニティ参加者にのみ公開」にして下さい。
トピックを1つ作って、そこにNGワードを書き溜めて行きます、1行に1ワードで書き溜めて下さい。
そのトピックを表示した時にアドレスバーに現れる target_c_commu_topic_id=N 、この N の数字をメモして下さい。
ここからは「対策其の1」で紹介した方法と同じです。
※メッセージをブロックしたい場合は f_message_send_insert_c_message.php の41行目に以下のコードを
//-----------------------
$topic_id = N; //NGワード専用コミュのトピックID
$sql = "SELECT body FROM c_commu_topic_comment WHERE number=0 AND c_commu_topic_id=$topic_id";
$buf = db_get_one( $sql );
if ( $buf ) {
$words = spliti( "\n", $buf );
foreach( $words as $val) {
if (eregi($val,$body)) {
$msg1 = "規制された文字列が含まれています。" . $val;
break;
}
}
}
//-----------------------
※フレンド申請をブロックしたい場合は f_link_request_insert_c_friend_confirm.php の38行目に以下のコードを入れて下さい
//-----------------------
$topic_id = N; //NGワード専用コミュのトピックID
$sql = "SELECT body FROM c_commu_topic_comment WHERE number=0 AND c_commu_topic_id=$topic_id";
$buf = db_get_one( $sql );
if ( $buf ) {
$words = spliti( "\n", $buf );
foreach( $words as $val) {
if (eregi($val,$body)) {
openpne_redirect('pc', 'page_h_access_block');
break;
}
}
}
//-----------------------
その時に「$topic_id = N;」の N の部分を先ほどメモした target_c_commu_topic_id の番号を指定して下さい。
以上です完成です、NGワード管理コミュニティーに信頼できる仲間を招待すれば複数人で管理可能なシステムになります。
それから、「正規表現」という機能が使えます、例えばNGワードに ABCD[0-9]EFG と書いておくと、 ABCD0EFG,ABCD1EFG,ABCD2EFG,ABCD3EFGもNGワードとして検出されます、正規表現は他にも色々ありますのでネットで調べて下さい、まぁあまり使わないと思いますが。。。
webapp以下のソースコードに変更を加える場合は、webapp_exフォルダーを使う事をお勧めします。
※この記事は取り急ぎ公開しています、修正、加筆される可能性があります。
OpenPNEやMyNETSから簡単に利用できるグラフをFLASHで作ってみました、元々は「足あと」ページの企画で作り始めたものなのですが、だんだん汎用的に使えるようになって来ました、実際このようにWPに簡単に貼れています。。。w
以下がそのサンプルになりますが、1つのFlashモジュールに異なるXMLを読み込ませることで配色にもこの様に変化を持たせることが可能です。
余談ですが、プロトタイプ版をActionScript2で作り始め、最終的にActionScript3へ移植しました、言語の仕様が大幅に変わっているのには驚きましたが、個人的にはかなり使いやすい言語になってきたと思います。
仕様は時間をみて書くつもではありますが、FlashやXMLの知識がある方なら上記3つのサンプルソースを見て頂ければ大体の仕様は分かると思います、表示されているSWFをそのままダウンロードしてご自由に使って頂いても構いません。
最近OpenPNEを使って構築されたSNS内でメッセージを利用したスパムが横行しているようで方々から悲鳴が上がっています、主にオープン型で運営されているSNSでの話しだとは思いますが、招待制であっても一旦もぐり込まれ複アカで自分を召還し始めると厄介かもしれませんね、いずれはコアチームが対応してくれるとは思いますが、(PNE3のこともあって忙しそうなので)取り急ぎ簡単なスパムフィルター(ブロッカー?)の実装方法を説明します。
最低限シンプルに書いていますので気の利いた設定などはありません、ある程度PHPが理解できる方であれば色々と応用も利くと思います(もちろんこのままでも動作します)。
マイフレンド以外へのメッセージの連続攻撃をブロックします。
※マイフレンドはスパムしないでしょうから。笑
webapp/modules/pc/do/f_message_send_insert_c_message.php
41行目(PNE2.12.7)へ以下のコードを追加して下さい。
//-----------------------
if ( !db_friend_is_friend($c_member_id_to, $u ) ) {
$sql = "SELECT r_datetime FROM c_message WHERE c_member_id_from=? ORDER BY c_message_id DESC";
$unxLast = strtotime(db_get_one($sql,array($u)));
$difMinute = (time()-$unxLast)/60;
if ( $difMinute < 10 ) { //10分
$msg1 = "メッセージはビジー状態です、暫くお待ち下さい。";
}
}
//-----------------------
何故41行目かと言いますと、この判定は$msg1の初期化後でないと利かないので、
$msg1 = “”;
$msg2 = “”;
の直後が良いと思います。

※上記のソースは10分以上のインタバルを空けなければ送れない設定です。
このまま利用する場合は十分な検証を行った上で使用して下さい。
マイフレンドからのスパム、一通一通時間を置いて根気よく送られてくるスパムには全く効果はありません。
OpenPNE 2.6.11 での動作確認がとれました、ただしスクリプトの挿入位置が少し違いますので、コメントを参考にして下さい。