codebird でつぶやきID取得

codebird でつぶやきID取得

#07 つぶやきのIDを取得してみよう
http://dotinstall.com/lessons/more_php_v2/21807
を参考につぶやきのIDを取得

とりあえず、プログラムができてきたので
index.html からアクセスしてみる

もし、うまくいかないのなら
chrome なら
Ctrl + shift + i
で java script console でエラーが表示されるので
これを元に修正していく

修正できたら、もっと読むボタンをクリックすることで
自分がつぶやいた過去のつぶやきをみることができる

さらに表示したいのなら
もっと読むボタンを押せばいい

このつぶやきを
右クリックして要素の検証を選び
chrome developer tools で
Element タブでみてみると

<li id="tweet_つぶやきID"></li>

となっているのが確認できる

まずは、このIDを引っ張ってくるという処理を
index.html の java script で行う

li 要素が追加されていたら、という判定にするので

if($('#tweets > li').length){
}


id=”tweets” の中に li要素が存在しているなら
という判定をして

li要素の一番最後なので
:last を使い

$('#tweets > li:last')
と記述して
.attr('id').replace();

とする

.attr() については
http://semooh.jp/jquery/api/attributes/attr/properties/
を参考
この関数は、ハッシュオブジェクトを引数に渡すことで
すべての要素に複数の属性を設定できるというもの

ちょっと長めだけど

$('#tweets > li:last').attr('id')

なので
id=”tweets” の中の 最後の li 要素の id という意味になる

これを .replace() で置き換える

replace() の置き換えについては
http://jquery.nanjaku.com/2012/05/11/jquery%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E7%BD%AE%E6%8F%9B%E3%81%97%E3%81%9F%E3%81%84%EF%BC%81/
を参照

replace() を使っているのは
IDがほしいけど、実際には
tweet_つぶやきID
となっているので、この最初の tweet_ を消したいから
今回は 正規表現を使って replace() で置き換える

.replace('/tweet_','');

これで
tweet_ の部分が削除される

これで、無事にIDのみになったので

max_id = $('$tweets > li:last').attr('id').replace(/^tweet_/,'');

として、
max_id に最後のIDを格納する

このIDが格納できたか確認したいので

console.log(max_id);

で確認

もしミスがあるなら、
developer tools の console タブで
エラーがでる

成功なら、この console タブへ
IDが表示される

ちなみに2回ほど
もっと読むボタンを押さないと表示されない


codebird でつぶやき取得

codebird でつぶやき取得

#06 つぶやきを取得しよう
http://dotinstall.com/lessons/more_php_v2/21806
を参考に
codebird を使って
パラメータを与えることでつぶやきを取得する

ユーザのタイムラインを取得するにはいくつかのオプションがある

今回、使用するのは
screen_name
include_trs

パラメータは配列でセットするので

$params = array(
        'screen_name'=>'ユーザ名',
        'include_trs'=>true
        );

として

$tweets = (array)$cb->statuses_userTimeline($params);

というように、$params を指定する

(array) はキャストで、型を配列に変換している

そして、中身を確認するため

var_dump($tweets);exit;

で確認する

なお、screen_name に入力する名前は
アプリ登録画面で
自分のアイコンにマウスを載せれば表示されるので
もしわかならいのなら、これで確認

さすがに文字がたくさんでわかりにくいので
ページを右クリックして
ソースを表示すると
整列されてみやすくなる

このときに
array(21) {
と1行めにでているように
21の配列で構成されている
必要なのは
[“text”]=>
あたりのところ

この返ってくる値には
最後にHTTPステータスコードがついてくるので
このステータスコードは取り除く

これには、配列の末尾から取り除く要素を関数
array_pop() を使う
解説については
http://phpspot.net/php/man/php/function.array-pop.html
を参照

今回なら

array_pop($tweets);

とする

これで余分なものは削除できたので
HTMLへかえす要素をリスト形式で作成

つぶやきのIDは

$tweet->id_str 

つぶやき本文は

$tweet->text

で取得できる

つぶやきを繰り返し取得して代入するので
foreach() を使う

foreach($tweets as $tweet){
echo '<li id="tweet_'. $tweet->id_str.'">'.$tweet->text.'</li>';
}

となる

twitter タイムラインをリスト形式で表示

twitter タイムラインをリスト形式で表示

#14 タイムラインを表示しよう
http://dotinstall.com/lessons/tw_connect_php_v2/21914
を参考に
twitter タイムラインをリスト形式で表示する

編集するのは index.php

やり方はPHPで foreach() で回してリストで表示する
HTML のul 要素の下へ

<?php foreach ($tweets as $tweet ): ?>

として
foreach() で
$tweets の中身を $tweet へ1つずつ代入する

プロテクトしているユーザの表示を
しないようにするため

<?php if(!$tweet->protected): ?>

としておく

つぶやきをリストで表示するには

<li><?php echo h($tweet->text); ?></li>

とする

twitter で認証したユーザのタイムライン情報の取得

twitter で認証したユーザのタイムライン情報の取得

#13 タイムラインを取得しよう
http://dotinstall.com/lessons/tw_connect_php_v2/21913
を参考に
認証した twitter ユーザのタイムラインを取得する

ユーザのタイムライン情報を取得するAPIは
https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
となる

編集するファイルは index.php になる

codebird でいろいろなユーザAPIへアクセスできる

ただし動画のと codebird のバージョンが違うので
すこし修正する

function h(){
}

の下あたりにcodebird の初期化を追記する

\Codebird\Codebird::setConsumerKey(COMSUMER_KEY,COMSUMER_SECRET);

$cb = \Codebird\Codebird::getInstance();

アクセストークンなどがセッションに入っているので
これをセットする

twitter のAPIを使うには
access_token
access_token_secret
が必要になるので

$db->setToken($_SESSION['me']['tw_access_token'], $_SESSION['me']['tw_access_token_secret']);

で取得

つぶやきを取得するときに配列として欲しいので
https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline

statuses/home_timeline
を使う
命名規則として
statuses/home_timeline
の場合
/ を _
_の次の文字を大文字にするので

statuses_homeTimeline()

というようになる

これで、今ログインしているユーザのライムラインが取得できる

注意点としては、HTTPステータスが
入ってくるので、これを取り除く必要がある

これには array_pop() を使う

array_pop() は配列の末尾の要素を取り除くことができるので
最後についてくるHTTPステータスを除去できる

array_pop() の解説は
http://phpspot.net/php/man/php/function.array-pop.html
を参考にするとわかりやすい

これを使って

array_pop($tweets);

とすることで、ライムラインの取得ができる
値を確認するには
いつもどおりに
var_dump() を使う

var_dump($tweets);exit;

これで、リロードすると中身が配列で表示される

見にくい場合
右クリックしてページのソースを表示
とすれば、整列されてわかりやすくなる

twitter ユーザのログアウト処理作成

twitter ユーザのログアウト処理作成

#12 ログアウト処理を作ろう
http://dotinstall.com/lessons/tw_connect_php_v2/21912
を参考に
ログアウト処理を実装

index.php を最初に編集していく

まず、twitter ユーザ名をホーム画面で表示したいので
PHP部分にソースを追記していく

function h($s){
        return htmlspecialchars($s,ENT_QUOTES,"UTF-8");
}

を追加して h() で簡単に使えるようにする

この htmlspecialchars() はHTMLの無害化のために使われる

詳しくは
http://php.net/manual/ja/function.htmlspecialchars.php
のリファレンスを参照

twitter ユーザ名で表示するには

<?php echo h($_SESSION['me']['tw_screen_name']); ?>

とすると
twitterユーザ名で表示される

これは callback.php で

$_SESSION['me'] = $user;

というように
me の中に twitter ユーザ情報を格納しているため

次にログアウト機能を実装する

vim logout.php
でファイルを作成し

require_once('config.php');
require_once('codebird.php');

session_start();


設定ファイル関連、セッションスタートを行う

$_SESSION = array();

でセッションを初期化

if(isset($_COOKIE[session_name())){

でクッキーの値があるか確認し
あるのなら、以下の処理を行う

setcookie(session_name(),'',time()-86400,'/tw_connect_php/');


setcookie() で cookieの値をセットする
time()-86400
は1日前の時間を指定

setcookie() については
http://php.net/manual/ja/function.setcookie.php
のリファレンスを参照

引数をメモすると
session_name(), クッキーの名前
time()-86400 クッキーの有効期限
‘/tw_connect_php/’ クッキーを有効にするパス

となる

そして

session_destroy();

セッションの破棄

header('Location: '.SITE_URL);

でトップ画面であるログイン画面に飛ばす

twitter ユーザでのログイン処理作成

twitter ユーザでのログイン処理作成

#11 ログイン処理を作ろう
http://dotinstall.com/lessons/tw_connect_php_v2/21911
を参考に
twitter ユーザでログインするための処理を実装

まず、$user の中身が入っているのを確認するので

if(!empty($user)){

で判定する

次に
セキュリティのためセッションハイジャック対策を行う

session_regenerate_id(true);

この意味は
セッションIDは新しいものと置き換わるが、セッション情報を維持される
というもの

ただしいくつか注意点もあるので
その参考リンクとしては

<a href="http://canalize.jp/archives/009281.php" title="http://canalize.jp/archives/009281.php" target="_blank">http://canalize.jp/archives/009281.php</a>

もみておいたほうがよいと思う
 
またログインセッションの me に$userの
情報をいれておくことで、ログインしているか判別する

ログインができたら、header() でホーム画面にとばす

header('Location: '.SITE_URL);

これで、再度 index.phpに戻り
ログインして twitter の認証後
ホーム画面が表示されれば成功

もし、

途中でうまくいかないときには
ソースと自分のファイルを
diff -w ソースファイル 自分のファイル

比較すると違いが表示されるのでわかりやすい

twitter ユーザ情報のDB格納とログイン処理

twitter ユーザ情報のDB格納とログイン処理

#10 ユーザー情報を格納してみよう (2)
http://dotinstall.com/lessons/tw_connect_php_v2/21910
を参考に
ユーザ情報のDB格納とログイン処理を実装

SQL文は前回作成しているので

$stmt = $dbh->prepare($sql);

prepare() のパラメータを
$params =array(
                        ":tw_user_id"=>$me->id_str,
                        ":tw_screen_name"=>$me->screen_name,
                        ":tw_access_token"=>$reply->oauth_token,
                        ":iw_access_token_secret"=>$reply->oauth_token_secret
                        );

で作成し

$stmt->execute($params);

で $stmt へデータを格納する

格納したデータをユーザの変数にいれるため

$myId = $dbh->lastInsertId();

で追加したIDを取得する

これでIDが判明するので
sqlでこのユーザの情報を取得

 $sql ="select * from users where id = :id limit 1";

                $stmt = $dbh->prepare($sql);
                $stmt->execute(array(":id"=>$myId));

$user = $stmt->fetch();
とすることで、ユーザ情報取得している

twitter ユーザ情報をDB格納

twitter ユーザ情報をDB格納

3ヶ月前につまづいたところが
ようやく解決したので

#09 ユーザー情報を格納してみよう (1)
http://dotinstall.com/lessons/tw_connect_php_v2/21909
を参考に
認証したユーザの情報をDBに格納していく

注意点としては
twitter id は 64bit の整数のため
32bit OS では数値として正しく扱えないとのこと
このため twitter API では
id の文字列表現を
id_str に入れている

32bit OSなら $me->id_str だけど
64bit OSなら $me->id でもOKらしい

とりあえず、これに注意しながら行っていく

DB接続処理は、callback.php へ追記していく

DB接続は PDO形式で行い try catch で行う

try{

}catch(PDOException $e){
	echo $e->getMessage();
	exit;
}

echo $e->getMessage();

はエラーメッセージの表示

PDOでDB接続は

$dbh = PDO(DSN,DB_USER, DB_PASSWORD);

で行う

この大文字は config.php で設定した定数

次に、DBを参照し
すでに指定したユーザがいるなら、そのユーザを使い
存在しないのなら新規にDBへ格納する

まずは、存在の有無を確認

$sql ="select * from usrs where tw_user_id = :id limit 1";

        $stmt =$dbh->prepare($sql);
        $stmt->execute(array(":id"=>$me->id_str));

で実行できる

もしユーザがいるなら

 $user = $stmt->fetch();

で$userに情報が格納される

もし、$user の中身が空なら、指定したユーザは存在しないのでDBへ追加していく

この判定をするには

if(!$user){

とすればOK

DBへ新しくデータを入れるには

$sql ="insert into users
                        (tw_user_id,tw_screen_name,tw_access_token,tw_access_token_secret,createdmodified) 
                        values( :tw_user_id,:tw_screen_name,:tw_access_token,:tw_access_token_secret,now(),now())";

というようにプレースホルダーを利用したSQLを使う

now() としているのは、現在時刻を使うから

twitter サービスでユーザ情報を表示

twitter サービスでユーザ情報を表示

以前実験した時にはここで挫折したので
再度チャレンジ

#08 ユーザー情報を表示してみよう
http://dotinstall.com/lessons/tw_connect_php_v2/21908
を参考に
認証後にユーザー情報を表示する

account_verifyCredentials() 

は codebirdで使える twitter へのアクセス方法

account_verifyCredentials() については
https://github.com/jublonet/codebird-php

3. Mapping API methods to Codebird function calls
の部分を参考にする

これが行っているのは
twitter API のほうでいろいろと情報取得するには
https://dev.twitter.com/docs/api/1.1
のリファレンスを参考にする

ここにはAPIで行える操作が載っている

今回取得したいのはユーザ情報なので
GET account/verify_credentials
のところになる

リファレンスは
https://dev.twitter.com/docs/api/1.1/get/account/verify_credentials
になる

GET account/verify_credentials
の / を _ にして
_ の後の文字を大文字にするというような
関数の記載ルールのようなものになっている

これで、アクセスしてもできなかったので
もう一度確認したところ
http://dotinstall.com/lessons/tw_connect_php_v2/21907
のまとめに

codebirdに付随するcacert.pemもcodebird.phpと同じディレクトリに置いてください。

とかかれていたので
FileZilla で cacert.pem を転送し
cp cacert.pem /var/www/html/tw_connect_php/
としたところ
無事に認証画面が開いた

これで twitter アカウントでログインすると
情報がでてくるので
一度右クリックしてページのソースを表示することで
見やすくなる
名前を確認するには
Ctrl + f で name と検索することで自分のユーザ名を調べやすくなる

これで、ユーザ情報の取得ができたことが確認できたので
var_dump($me); exit;
はコメントアウトして

以後DBへ結果の格納
ログイン処理
ホームへ飛ばす処理
これらを実装していく

twitter サービスログイン画面作成

twitter サービスログイン画面作成

#06 ログイン画面を作ろう
http://dotinstall.com/lessons/tw_connect_php_v2/21906
を参考に
ログイン画面を作成

ログインの確認はセッションをつかう

session_start();

そして、判定は if で行うので

f(empty($_SESSION['me'])){

で me の中身が空なのか判定する

もし空なら header() でログイン画面にとばす

        header('Location: '.SITE_URL.'/login.php');
        exit;

として login.php に飛ばす

login.php のソースは

<!DOCTYPE html>
<html lang="ja">
<head>
        <meta charset="utf-8">
        <title>ログイン</title>
</head>
<body>
<h1>ログイン</h1>
<p><a href="callback.php">twitter でログイン</a></p>

</body>
</html>

として
callback.php でログイン処理を行うようにする