チェ・ゲバムラの日記

脱犬の道を目指す男のブログ

【TwitterOAuth】Twitterライブラリ+PHPで卒業証書のアプリをつくった

タイトルのものを作った。
OAuthとかたまにしか使わないと忘れるのでメモ的にはっておきます。
ソースコードコピペでそのまま動くようにしました。

毎週なんかをつくるっていう課題の元、今週は何にしようかと思っていたらこんなの見つけたので作って見た。
イデア的にはほぼママですがソースはみれないので見た目だけはかなりパクリ真似しました。
🌸卒業証書授与ったー🌸【卒業シーズン真っ最中】 - アプリ☆メーカー

TwitterAPI使い方

https://syncer.jp/Web/API/Twitter/REST_API/
TwitterOAuthでログイン認証をおこなう[OAuth][PHP]



大事なところだけメモ↓

アクセストークンとは

三者が他人のアカウントにアクセス出来る通行証。
ただし削除などはできないように制限がかかっている。
自分のは簡単に管理画面から取得できる。=自分のアカウントで悪用するひとはいないから。

他人のアクセストークン発行方法

1.リクエストークンを取得する。
2.リクエストークンをパラメータに付けて、ユーザーを認証画面に飛ばす。
3.ユーザーが、認証画面でアプリ連携を許可する。
4.許可証となるコードをパラメータに付けて、ユーザーがCallback URLで設定したURLアドレスに飛ばされてくる。
5.許可証となるコードを利用して、アクセストークンを取得する。

ソース

index.php

<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<?php 
session_start();
?>
<div id="wrapper">
  <div class="area whitebox <?php if(isset($_SESSION['access_token'])){echo 'none'; }; ?>">
<?php 
//Twitter連携後
if(isset($_SESSION['access_token'])){?>
    <div class='cert'>
      <div class='inner'>
        <h2>卒業証書</h2>
        <p class="name"><?php echo $_SESSION['name'];?> 殿</p>
        <p class="text">本校所定の外資系学科を卒業したことを証明する</p>
        <p class="school"><?php echo $_SESSION['school'];?>学校</p>
        <p class="chief"><?php echo $_SESSION['chief'];?>理事長</p>
        <p><a href='logout.php'>おわり</a></p>
      </div>
    </div>
<?php
//初回アクセス時、Twitter連携前
}else{?>
    <p>
    長い間よく頑張った!<br />
    今日で君も卒業だ!
    </p>
    <div id="button">
      <?php if(!isset($_SESSION['access_token'])){ ?>
        <a href="login.php">&#x1F338;卒業証書を受け取る&#x1F338;</a>
      <?php } ?>
    </div>
    <aside>※Twitterでログインします。自動でツイートされたり乗っ取られたりすることはありません。安心してご利用下さい。</aside>
<?php } ?>
</div>
</div>
</body>
</html>


login.php

<?php 
session_start();
define("Consumer_Key", "XXXXXXXXXXXXXXXXXXXXXX");
define("Consumer_Secret", "XXXXXXXXXXXXXXXXXXXXXX");

//Callback URL
define('Callback', 'http://XXXXXXXXXXXXXXXXXXXXXX/180316_gradCert/callback.php');

//ライブラリを読み込む
require "twitteroauth-master/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

//TwitterOAuthのインスタンスを生成し、Twitterからリクエストトークンを取得する
$connection = new TwitterOAuth(Consumer_Key, Consumer_Secret);
$request_token = $connection->oauth("oauth/request_token", array("oauth_callback" => Callback));

//リクエストトークンはcallback.phpでも利用するのでセッションに保存する
$_SESSION['oauth_token'] = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];

// Twitterの認証画面へリダイレクト
$url = $connection->url("oauth/authorize", array("oauth_token" => $request_token['oauth_token']));
header('Location: ' . $url);
?>

callback.php

<?php
session_start();
define("Consumer_Key", "XXXXXXXXXXXXXXXXXXXXXX");
define("Consumer_Secret", "XXXXXXXXXXXXXXXXXXXXXX");


//ライブラリを読み込む
require "twitteroauth-master/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

//oauth_tokenとoauth_verifierを取得
if($_SESSION['oauth_token'] == $_GET['oauth_token'] and $_GET['oauth_verifier']){
    
  //Twitterからアクセストークンを取得する
  $connection = new TwitterOAuth(Consumer_Key, Consumer_Secret, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
  $access_token = $connection->oauth('oauth/access_token', array('oauth_verifier' => $_GET['oauth_verifier'], 'oauth_token'=> $_GET['oauth_token']));

  //取得したアクセストークンでユーザ情報を取得
  $user_connection = new TwitterOAuth(Consumer_Key, Consumer_Secret, $access_token['oauth_token'], $access_token['oauth_token_secret']);
  $user_info = $user_connection->get('account/verify_credentials'); 
  $friendsList = $user_connection->get('friends/list'); 
            
  // ユーザ情報の展開
  //var_dump($user_info);

  //テスト
  //var_dump($friendsList);
                  
  //適当にユーザ情報を取得
  $name = $user_info->name;
  $profile_image_url_https = $user_info->profile_image_url_https;


  $rand = mt_rand(0, 15);
  $school = $friendsList->users[$rand]->location; 
  $chief = $friendsList->users[$rand]->name; 
              
  //各値をセッションに入れる
  $_SESSION['access_token'] = $access_token;
  $_SESSION['name'] = $name;
  $_SESSION['profile_image_url_https'] = $profile_image_url_https;
  $_SESSION['school'] = $school;
  $_SESSION['chief'] = $chief;

  header('Location: index.php');
  exit();
}else{
  header('Location: index.php');
  exit();
}
?>


logout.php

<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<?php 
session_start();
header("Content-type: text/html; charset=utf-8");
//セッション変数を全て解除
$_SESSION = array();
   
//セッションクッキーの削除
if (isset($_COOKIE["PHPSESSID"])) {
  setcookie("PHPSESSID", '', time() - 1800, '/');
}
    
//セッションを破棄する
session_destroy();

?>

<div id="wrapper">
  <div class="area whitebox">
    またきてね!
    <a href='index.php'>もう一度卒業証書を受け取る</a>
  </div>
</div>

</body>
</html>

style.css

body{
  font-family: 'ヒラギノ丸ゴ Pro W3', 'Hiragino Maru Gothic Pro', 'Hiragino Sans', '游ゴシック Medium', 'メイリオ',Meiryo, 'MS Pゴシック','MS PMGothic', sans-serif;
  background-image:url(../img/bg.jpg);
  background-repeat:no-repeat;
  background-size:cover;
  background-position:top;
  position:relative;
}
.area{
  margin:auto;
  position:absolute;
  left:0;
  right:0;
  bottom:0;
  top:0;
  width:600px;
  height:260px;
}
.whitebox{
  background:#fff;
  padding:20px;
}
.whitebox.none{
  background:none;
  padding:0;
}
#button {
  width:300px;
  margin:30px auto;
}
#button a{
  padding:10px 0;
  font-size:18px;
  border-radius:20px;
  text-align:center;
  text-decoration:none;
  background:#eb9486;
  color:#fff;
  display:block;
}
#button:hover{
  opacity:0.8;
  cursor:pointer;
}


/*Twitter 認証後*/
.cert {
line-height:30px;
position:relative;
background-image:url(../img/cert.jpg);
background-repeat:no-repeat;
background-size:100%;
height:830px;
padding:20%;
font-family: ro-nikkatsu-sei-kai-std, serif;
font-style: normal;
font-weight: 600;
}
.cert h2{
font-size:40px;
text-align:center;
}
.cert .name{
font-size: 24px;
padding: 40px 0 45px;
text-align:right;
}
.cert .text{
font-size:20px;
padding:0 0 60px;
}
.cert .school{
font-size:20px;
text-align:right;
}
.cert .chief{
font-size:20px;
text-align:right;
}