【PHP】TwitterのOAuth認証を使ったログイン
TwitterのOAuth認証をPHPで実装します。
ログアウト処理がうまくできてないのでご助言いただけるとありがたいです…!
準備
ここでアプリケーションを登録します。
アプリケーションの種類はブラウザアプリケーション。
callbackURLにはlocalhostが指定できないので適当に登録します。
登録すると、Consumer keyとConsumer secretが得られます。
これを使って認証します。
Access token取得の流れ
- Consumer keyとConsumer secretを使ってRequest tokenとRequest secretを取得
- このとき、callbackURLを指定する
- Request tokenとRequest secretを使ってAuthorizeURL(Twitterの認証URL)を取得
- ユーザが認証ボタンを押す
- callbackURLにパラメータ(oauth_verifier)が付いて返ってくる(GET送信される)
- Consumer key、Consumer secret、Request token、Request secret、そしてoauth_verifierを使ってAccess tokenを取得
ややこしや!!
ソース
- testoauth.php
<?php session_start(); require_once("twitteroauth.php");// ライブラリの読み込み // セッションにアクセストークンがなかったらloginページに飛ぶ if($_SESSION['oauth_token']===NULL && $_SESSION['oauth_token_secret']===NULL){ header("Location: login.php"); } $user_id = $_SESSION['user_id']; $screen_name = $_SESSION['screen_name']; echo "<html><head><title>top</title></head><body>"; echo "<p>ようこそ!".$screen_name."さん</p>"; echo "<p>".$user_id."</p>"; echo "<p><a href=\"./logout.php\">ログアウト</a></p>" ?>
- login.php
- 本当はここにワンクッション置いたほうがいいかもしれません…
<?php session_start(); require_once("twitteroauth.php"); // Consumer keyの値 $consumer_key = "自分で取得したもの"; // Consumer secretの値 $consumer_secret = "自分で取得したもの"; // OAuthオブジェクト生成 $to = new TwitterOAuth($consumer_key,$consumer_secret); // callbackURLを指定してRequest tokenを取得 $tok = $to->getRequestToken("http://localhost/testtwitter/callback.php"); // セッションに保存 $_SESSION['request_token']=$token=$tok['oauth_token']; $_SESSION['request_token_secret'] = $tok['oauth_token_secret']; // AuthorizeURLを取得 $url = $to->getAuthorizeURL($token); echo "<html><head><title>login</title></head><body><a href=\"".$url."\">ログイン</a></body></html>"; ?>
- callback.php
<?php session_start(); require_once("twitteroauth.php"); // Consumer keyの値 $consumer_key = "自分で取得したもの"; // Consumer secretの値 $consumer_secret = "自分で取得したもの"; // パラメータからoauth_verifierを取得 $verifier = $_GET['oauth_verifier']; // Consumer key,Consumer secret, Request token, Request secretを使ってOAuthオブジェクト生成 $to = new TwitterOAuth($consumer_key,$consumer_secret,$_SESSION['request_token'],$_SESSION['request_token_secret']); // oauth_verifierを使ってAccess tokenを取得 $access_token = $to->getAccessToken($verifier); // token keyとtoken secret, user_id, screen_nameをセッションに保存 $_SESSION['oauth_token'] = $access_token['oauth_token']; $_SESSION['oauth_token_secret'] = $access_token['oauth_token_secret']; $_SESSION['user_id'] = $access_token['user_id']; $_SESSION['screen_name'] = $access_token['screen_name']; // TOPページへ header("Location: testoauth.php"); ?>
【Python】正規表現でHTML解析
いろいろライブラリを教えていただいたのですが、なかなかうまくできなかったので、正規表現を使ってやってみました。
HTMLのテキストを読み込む
import re,urllib2 url = "http://~"#URL html = urllib2.urlopen(url).read()
正規表現メモ
役に立った表現をメモしておきます。
- タグとタグの間の空白を取り除く
html=re.sub('>\s*?<','><',html)
- タグを取り除く
html=re.sub('<.+?>','',html)
タグを取り除く表現は下手をすると
<コンテンツ>
このようなテキストもはじいてしまうので注意が必要です…。
Twitterで相互フォローしているかを表示するGreasemonkeyを作りたかった…!
↑こんな感じで、TLのユーザーと相互フォロー状態だったら名前のうしろに「*」をつけるということをしたかったのですが、
TwitterAPIを叩くと
jsonp ~ is not defined
というエラーが出て取得できませんでした…。
使ったAPI
例)@eibiisiiと@eibiisii_botの間にfriend関係があるか調べる
http://api.twitter.com/1/friendships/exists.json?user_a=eibiisii&user_b=eibiisii_bot&callback=?
ソース
// ==UserScript== // @name is follow each other // @namespace eibiisii // @include http://twitter.com/* // @include https://twitter.com/* // @exclude http://twitter.com/invitations/* // @exclude http://twitter.com/settings/* // @exclude http://twitter.com/goodies/* // @exclude https://twitter.com/invitations/* // @exclude https://twitter.com/settings/* // @exclude https://twitter.com/goodies/* // @require http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js // ==/UserScript== (function(){ var my_name = $("span#me_name").text(); $(".status-content>strong").each(function(){ var your_name = $(this).text(); console.log(my_name); console.log(your_name); var apiurl = "http://api.twitter.com/1/friendships/exists.json?user_a="+my_name+"&user_b="+your_name+"&callback=?"; console.log(apiurl); $.getJSON(apiurl,function(data){ $.each(data,function(i,item){ console.log(item.friends); if(item.friends=="true"){ $(this).after("*"); } }); }); }); })();