PHP+VBS : デスクトップアプリで Twitter API のアクセストークンを取得

  WEBアプリとは多少手順が変わります



WEB アプリでは、データのやり取りを リダイレクトを使ってユーザに手間がかからないようにしますが、デスクトップで動くアプリケーション( この場合は VBScript(WSH) ) では、途中でブラウザ使用して、Twitter のサイトにアクセスし、暗証番号( PIN ) を取得して、それをデスクトップアプリケーションに引き渡す必要があります。

これは、WEB アプリケーションで、oauth_verifier として取得していたものですが、この場合は人が暗記するかクリップボードにコピーする事になるので、桁数の少ない数字となります。

Twitter_pin

Twitter_pin2

さらに、Twitter に対する認証処理は、クライアントからでも良いのですが、元となるアプリケーションのキーとパスワードを公開するわけにはいかないので、アクセストークンを取得する部分の処理を PHP としてホスティングします。

アクセストークン( 秘密のフクセストークンも含む )は、ローカルの PC に保存する事となりますが、そのトークンをキャンセルしたい場合は、自分の Twitter ユーザに登録されている 該当アプリを削除すれば OK です。ですが、そういう内容のものなので、自宅でのみ使う事ように「警告」した上で公開する必要は出てきます。


関連する記事

 PHP+VBS : デスクトップ/Twitterへのアクセス準備
 PHP : TwitterAPI : Access Token取得
 PHP : TwitterAPI : 資格情報の確認
 PHP + Twitpic API v2 で画像アップロード
 VBScript : Twitpic に画像をアップロード
 VBScript : Picasa へ画像ファイルをアップロード
 VBScript : ココログマイフォトに画像アップロード
 PHP : bit.ly を使用した専用短縮URLサービス作成
 PHP : Google ドキュメントのセルのAPI更新
 PHP+Zend : Picasa APIアップロード
 PHP : cURL でFTPESダウンロード
 PHP : CodeIgniter+TwitterAPI投稿
 VBScript : Twitter API を呼び出して投稿する
 VBScript でバッチ twitter 投稿
 VBScript でバッチ mixi ボイス投稿
 Python3.1 : mixi ボイスへ投稿
 VBScript : Seesaaの禁止ワード一括登録
 VBScript : Seesaaブログのエクスポート
 VBScript : XML-RPC で Seesaa に投稿
 VBScript : 手書きブログAPIで画像ダウンロード
 Ruby+Mechanize : Twitter 投稿
 Ruby+Mechanize : Seesaa最新情報更新
 Ruby+Mechanize : Seesaaアクセス解析情報



  PHP ( ホスト側のコード )



プロセスが途中でユーザの手作業が入るので、二つ必要になります

※ 引き渡すデータは単純なテキストで返しています( XML や JSON を使うほどでも無いので )
※ テストは localhost で問題ありません


phase_1.php
001.<?
002.// **********************************************************
003.// Acquiring a request token
004.// **********************************************************
005.header( "Content-Type: text/html; Charset=utf-8" );
006.header( "pragma: no-cache" );
007.header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
008.header( "Cache-control: no-cache" );
009. 
010.// **********************************************************
011.// OAuth 用の urlencode 関数
012.// **********************************************************
013.function url_rfc3986( $str ) {
014.    // php 5.3.x ~ ではこの変換は必要無い
015.    return str_replace('%7E', '~', rawurlencode($str));
016.}
017. 
018.// **********************************************************
019.// API ( SSL is recommended )
020.// **********************************************************
021.$twitter_url = 'https://api.twitter.com/oauth/request_token';
022. 
023.// **********************************************************
024.// 認証データ
025.// **********************************************************
026.$oauth_consumer_key = "Consumer key";
027.$oauth_consumer_secret = "Consumer secret";
028.$oauth_token = "";
029.$oauth_secret = "";
030. 
031.// 毎回変化するランダムな文字列
032.$mt = microtime();
033.$rand = mt_rand();
034.$oauth_nonce = md5($mt . $rand);
035. 
036.$oauth_signature_method = "HMAC-SHA1";
037.$oauth_timestamp = mktime();
038. 
039.$oauth_version = "1.0";
040. 
041.// コールバック url
042.$oauth_callback = "oob";
043. 
044.// *********************************************************
045.// シグネチャ用ベース文字列作成
046./*
047.  httpMethod + "&" +
048.  url_encode(  base_uri ) + "&" +
049.  sorted_query_params.each  { | k, v |
050.      url_encode ( k ) + "%3D" +
051.      url_encode ( v )
052.  }.join("%26")
053.*/
054.// *********************************************************
055.$base_string = "POST";
056.$base_string .= "&" . url_rfc3986($twitter_url);
057.$base_string .= "&";
058. 
059.$base_string .= url_rfc3986("oauth_callback")."%3D".url_rfc3986(url_rfc3986($oauth_callback))."%26";
060.$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
061.$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
062.$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
063.$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
064.$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version);
065. 
066.// *********************************************************
067.// シグネチャ作成
068./*
069.url_encode( consumer_secret ) + "&" +
070.url_encode( oauth_token_secret || nil )
071.*/
072.// *********************************************************
073.$oauth_signature =
074.base64_encode( hash_hmac(
075.    "sha1",
076.    $base_string,
077.    url_rfc3986($oauth_consumer_secret) . "&",
078.    true
079.));
080.//$postfields['oauth_signature'] = $oauth_signature;
081. 
082.// *********************************************************
083.// curl 処理
084.// *********************************************************
085.$curl = curl_init();
086.curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
087.curl_setopt($curl, CURLOPT_HEADER, false);
088.curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
089.curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
090.curl_setopt($curl, CURLOPT_URL, $twitter_url);
091.curl_setopt($curl, CURLOPT_POST, 1);
092. 
093.// *********************************************************
094.// http ヘッダ作成
095.// *********************************************************
096.$header = array();
097.$header[] = 'Expect:';
098. 
099.$header[] = 'Authorization: OAuth '.
100.url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
101.url_rfc3986("oauth_callback")."=\"".url_rfc3986($oauth_callback)."\",".
102.url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
103.url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
104.url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
105.url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\",".
106.url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\"";
107. 
108.curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
109. 
110.// *********************************************************
111.// https 用
112.// *********************************************************
113.curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
114.curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
115. 
116.// *********************************************************
117.// 送信
118.// *********************************************************
119.$result = curl_exec($curl);
120. 
121. 
122.// *********************************************************
123.// 結果
124.// *********************************************************
125. 
126.if($result === false) {
127.    echo 'Curl error: ' . curl_error($curl);
128.    exit();
129.}
130.else {
131.//  echo 'Operation completed without any errors';
132.}
133.curl_close($curl);
134. 
135.parse_str($result,$arr);
136.print $arr['oauth_token_secret'] . "\n";
137.print "https://twitter.com/oauth/authorize?oauth_token={$arr['oauth_token']}\n";
138. 
139.?>


phase_2.php
001.<?
002.header( "Content-Type: text/html; Charset=utf-8" );
003.header( "pragma: no-cache" );
004.header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
005.header( "Cache-control: no-cache" );
006.// **********************************************************
007.// AOuth 用の urlencode 関数
008.// **********************************************************
009.function url_rfc3986( $str ) {
010.    // php 5.3.x ~ ではこの変換は必要無い
011.    return str_replace('%7E', '~', rawurlencode($str));
012.}
013. 
014.// **********************************************************
015.// API ( SSL is recommended )
016.// **********************************************************
017.$twitter_url = 'https://api.twitter.com/oauth/access_token';
018. 
019.// **********************************************************
020.// 認証データ
021.// **********************************************************
022.$oauth_consumer_key = "Consumer key";
023.$oauth_consumer_secret = "Consumer secret";
024.$oauth_token = $_GET['oauth_token'];
025.$oauth_secret = $_GET['oauth_token_secret'];
026. 
027.// 毎回変化するランダムな文字列
028.$mt = microtime();
029.$rand = mt_rand();
030.$oauth_nonce = md5($mt . $rand);
031. 
032.$oauth_signature_method = "HMAC-SHA1";
033.$oauth_timestamp = mktime();
034. 
035.$oauth_version = "1.0";
036. 
037.// *********************************************************
038.// シグネチャ用ベース文字列作成
039./*
040.  httpMethod + "&" +
041.  url_encode(  base_uri ) + "&" +
042.  sorted_query_params.each  { | k, v |
043.      url_encode ( k ) + "%3D" +
044.      url_encode ( v )
045.  }.join("%26")
046.*/
047.// *********************************************************
048.$base_string = "POST";
049.$base_string .= "&" . url_rfc3986($twitter_url);
050.$base_string .= "&";
051. 
052.$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
053.$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
054.$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
055.$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
056.$base_string .= url_rfc3986("oauth_token")."%3D".url_rfc3986($oauth_token)."%26";
057.$base_string .= url_rfc3986("oauth_verifier")."%3D".url_rfc3986($_GET['oauth_verifier']);
058.$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version);
059. 
060.// *********************************************************
061.// シグネチャ作成
062./*
063.url_encode( consumer_secret ) + "&" +
064.url_encode( oauth_token_secret || nil )
065.*/
066.// *********************************************************
067.$oauth_signature =
068.base64_encode( hash_hmac(
069.    "sha1",
070.    $base_string,
071.    url_rfc3986($oauth_consumer_secret) . "&" . url_rfc3986($oauth_secret),
072.    true
073.));
074.//$postfields['oauth_signature'] = $oauth_signature;
075. 
076.// *********************************************************
077.// curl 処理
078.// *********************************************************
079.$curl = curl_init();
080.curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
081.curl_setopt($curl, CURLOPT_HEADER, false);
082.curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
083.curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
084.curl_setopt($curl, CURLOPT_URL, $twitter_url);
085.curl_setopt($curl, CURLOPT_POST, 1);
086. 
087.// *********************************************************
088.// http ヘッダ作成
089.// *********************************************************
090.$header = array();
091.$header[] = 'Expect:';
092.$header[] = 'Authorization: OAuth '.
093.url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
094.url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
095.url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
096.url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
097.url_rfc3986("oauth_token")."=\"".url_rfc3986($oauth_token)."\",".
098.url_rfc3986("oauth_verifier")."=\"".url_rfc3986($_GET['oauth_verifier'])."\",".
099.url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\",".
100.url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\"";
101. 
102.curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
103. 
104.// *********************************************************
105.// https 用
106.// *********************************************************
107.curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
108.curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
109. 
110.// *********************************************************
111.// 送信
112.// *********************************************************
113.$result = curl_exec($curl);
114. 
115.// *********************************************************
116.// 結果
117.// *********************************************************
118. 
119.if($result === false) {
120.    echo 'Curl error: ' . curl_error($curl);
121.    exit();
122.}
123.else {
124.//  echo 'Operation completed without any errors';
125.}
126.curl_close($curl);
127. 
128.parse_str($result,$arr);
129.print $arr['oauth_token'] . "\n";
130.print $arr['oauth_token_secret'] . "\n";
131. 
132.?>




  VBScript : クライアントアプリケーション( アクセストークンの取得 )

取得したトークンはテキストファイルに出力しています。実際の処理を行うアプリケーションが
このトークンを使う事になりますので、このコードはその前処理のようなものです。


GetAccessToken.wsf
01.<JOB>
02.<OBJECT id="WshShell" progid="WScript.Shell" />
03.<OBJECT id="Fso" progid="Scripting.FileSystemObject" />
04.<OBJECT id="objHTTP" progid="MSXML2.XMLHTTP" />
05. 
06.<SCRIPT language=VBScript>
07.' **********************************************************
08.' 暗証番号( PIN ) を手に入れる為の URL を取得する
09.'
10.' 取得用 URL ( アプリケーションのユーザが用意する )
11.' **********************************************************
12.phase_1_url = "http://............/phase_1.php"
13. 
14.' *********************************************************
15.' 送信準備
16.' *********************************************************
17.Call objHTTP.Open( "GET",phase_1_url, False )
18. 
19.' *********************************************************
20.' 送信
21.' *********************************************************
22.Call objHTTP.Send(strData)
23. 
24.' *********************************************************
25.' URL を取得
26.' *********************************************************
27.aRet = Split(objHTTP.responseText,vbLf)
28. 
29.if Ubound(aRet) < 2 then
30.    Wscript.Echo aRet(0)
31.    Wscript.Quit
32.end if
33. 
34.' *********************************************************
35.' IE で URL にアクセス
36.' *********************************************************
37.WshShell.Run( "iexplore.exe " & aRet(1) )
38. 
39.' **********************************************************
40.' 一時トークン保存
41.' **********************************************************
42.Set OutObj1 = Fso.OpenTextFile( "token1.log", 2, True )
43.Set OutObj2 = Fso.OpenTextFile( "token2.log", 2, True )
44.aData = Split(aRet(1),"=")
45.OutObj1.Write aData(1)
46.OutObj2.Write aRet(0)
47.OutObj2.Close
48.OutObj1.Close
49. 
50.PIN = InputBox("暗証番号( PIN )を入力して下さい")
51. 
52.' **********************************************************
53.' 取得用 URL ( アプリケーションのユーザが用意する )
54.' **********************************************************
55.phase_2_url = "http://............/phase_2.php?"
56.phase_2_url = phase_2_url & "oauth_token=" & aData(1)
57.phase_2_url = phase_2_url & "&oauth_token_secret=" & aRet(0)
58.phase_2_url = phase_2_url & "&oauth_verifier=" & PIN
59. 
60.' *********************************************************
61.' 送信準備
62.' *********************************************************
63.Call objHTTP.Open( "GET",phase_2_url, False )
64. 
65.' *********************************************************
66.' 送信
67.' *********************************************************
68.Call objHTTP.Send(strData)
69. 
70.' *********************************************************
71.' URL を取得
72.' *********************************************************
73.aRet = Split(objHTTP.responseText,vbLf)
74. 
75.if Ubound(aRet) < 2 then
76.    Wscript.Echo aRet(0)
77.    Wscript.Quit
78.end if
79. 
80.' **********************************************************
81.' トークン保存
82.' **********************************************************
83.Set OutObj1 = Fso.OpenTextFile( "token1.log", 2, True )
84.Set OutObj2 = Fso.OpenTextFile( "token2.log", 2, True )
85.OutObj1.Write aRet(0)
86.OutObj2.Write aRet(1)
87.OutObj2.Close
88.OutObj1.Close
89. 
90.WScript.Echo "処理が終了しました"
91. 
92. 
93.</SCRIPT>
94.</JOB>















   SQLの窓    create:2010/06/05  update:2018/02/18   管理者用(要ログイン)





フリーフォントWEBサービス

SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ