画像等のファイルをダウンロードさせる場合に、Twitterアカウントでの認証及び、ダウンロードした旨のツイートを強要するサンプル。


先日、「ツイートしてくれた人にだけ、ファイルをダウンロードさせたい!」みたいな事を仰ってた方がいたので、ちょっと考えてみました。

PHPライブラリ、twitteroauth を利用しています。
サンプル〜って事で例外とかも考慮してないですし、Noticeもガン無視しています。

サンプルスクリプト

ファイル構成

ripper@skuld002:~/www/test$ tree
.
├── twdownload
│   ├── config.php
│   ├── download.php
│   ├── img
│   │   └── bufftan.jpg
│   └── index.php
└── twitteroauth
    ├── OAuth.php
    └── twitteroauth.php

config.php

<?php
define('CONSUMER_KEY', 'xxxxxxxxxxx'); //Consumer keyを入力
define('CONSUMER_SECRET', 'xxxxxxxxxxxxxxxxxxxx'); //Consumer secretを入力
define('TWITTER_OAUTH_PATH', './../twitteroauth/twitteroauth.php'); //twitteroauth.phpへのパスを入力
//ダウンロードさせたい画像のパスを入力。元画像に直接アクセスされたら意味が無いので、外部からはアクセス出来ない場所に配置するか、アクセス制限すると良いかもしれない。
define('IMG_PATH', './img/bufftan.jpg');
define('BASE_URL', 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['SCRIPT_NAME']) . '/');

ダウンロード可能なファイルをIMG_PATHとか決め打ちして単一のファイルにしか対応していませんが…。

これを例えば、
$imgs = array(
array(
‘img_path’ => ‘画像のパス’,
‘img_title’ => ‘画像のタイトル’,
‘img_description’ => ‘画像の概要’,
‘tweet’=>’ダウンロード時にツイートせたい内容’
),
array(
‘img_path’ => ‘画像のパス’,
‘img_title’ => ‘画像のタイトル’,
‘img_description’ => ‘画像の概要’,
‘tweet’=>’ダウンロード時にツイートせたい内容’
)


);

のように配列にしたり、画像情報をDBに持たせて〜・・・とかやると、割と色々出来るかもしれない。

index.php

<?php
session_start();
require_once './config.php'; //config読み込み
require_once(TWITTER_OAUTH_PATH); //twitteroauthの読み込み
//インスタンスの生成。リクエストトークンを持っている場合はリクエストトークンも渡す。
$tw = new TwitterOAuth(
        CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['request']['oauth_token']? : null, $_SESSION['request']['oauth_token_secret']? : null
);

switch ($_GET['mode']) {
    case 'request':
        $_SESSION['request'] = $tw->getRequestToken(BASE_URL . 'index.php?mode=token'); //リクエストトークンの取得してセッションに代入。
        header('Location:' . $tw->getAuthorizeURL($_SESSION['request'], false) . '&force_login=true'); //認証URLを取得してリダイレクト。
        break;
    case 'token':
        $_SESSION['access'] = $tw->getAccessToken($_GET['oauth_verifier']); //アクセストークンを取得してセッションに代入
        header('Location: ' . BASE_URL.'download.php');
        break;
    default :
        session_destroy();
        echo '画像をダウンロードするにはTwitterアカウントでの<a href="?mode=request">認証</a>が必要です。';
}

download.php

<?php

session_start();
require_once './config.php'; //config読み込み
require_once(TWITTER_OAUTH_PATH); //twitteroauthの読み込み

//アクセストークンを持ってない場合はTwitterアカウントでの認証を促すメッセージを表示。
if (isset($_SESSION['access']['oauth_token']) && isset($_SESSION['access']['oauth_token_secret'])) {
    $tw = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['access']['oauth_token'], $_SESSION['access']['oauth_token_secret']);//インスタンスの生成
    switch ($_GET['mode']) {
        case 'download':
            //画像は外部からはアクセス出来ない場所に配置している前提なのでPHPで出力する。
            header('Content-Type: application/octet-stream');
            header('Content-Length: '.filesize(IMG_PATH));
            header('Content-Disposition: attachment; filename='.basename(IMG_PATH));
            readfile(IMG_PATH);
            $tw->post('statuses/update', array('status' =>BASE_URL.' から画像をダウンロードしました。'));//TwitterAPIを利用したツイート
            break;
        default :
            echo '注意:以下のダウンロードリンクのクリックと同時に貴方のタイムラインにファイルをダウンロードしたといった趣旨のツイートを自動投稿します。<br>';
            echo '<a href="?mode=download">ダウンロードする</a>';
    }
} else {
    echo '<a href="index.php">Twitterアカウントでの認証が必要だよ!</a>';
}
スポンサード リンク

公開日:2013年11月23日
タグ:, , , ,