異邦人になってみた~~上海生活写真ブログ

中国上海市在住です。もう10年を超えました。休日は星空(天の川)撮影やポートレート撮影等、連休時はカメラを持って中国各地を旅行してます。最近は内モンゴル自治区によく行っています。

 このブログについて(about)
  中国旅行/観光/写真記事一覧(省別)

PHPで新浪微薄APIを使ってみる。

PHP新浪微薄APIを使う。
なかなか新浪微薄と連携する方法がないよな。。。っと思ってそれなら作っちゃえってことで
新浪微薄APIをとりあえず使ってみることにしました。

私はこれではてなダイアリーの投稿記事をWEIBOに登録すると言う連携を行ってますが、
はてなのRSSをそのままWeiboに入れているだけです。
まあ「はてな」でなくてもFaceBookTwitterでもできちゃうんですけどね。
(2014年5/29日の時点でまだ動いてます)


テスト用で何件か追加してみました。

開発者用の登録を行いAPIKEYを取得する。

Weiboの開発用APIを使うにはまず、Weibo登録する必要があります。
そのあと新浪微薄・开发平台
に行って開発用の登録をします。
するとAPIKEYがもらえます。
APIKEYがもらえてやっと開発を行うことができます。
詳しくはまた今度書きます。


新浪微薄APIを使って何を作る?

とりあえずSDKを落とします
开发文档からPHP用のSDKをダウンロードします
中にはサンプルが入っていてこれはそのまま動きます。
ログインしていない場合ログイン画面がでてログイン後、自分のWeiboの一覧がでてきます。
私がやりたいのは、バッチみたいな感じで自分のブログのRSSを読み込んでWEIBOに登録する。
ということです。このままじゃ使えません。
ログイン画面をすっ飛ばして、
自動でログインする機能がひつようですね。
とりあえず一件書き込むところまで作ってみます。

新浪微薄APIを使ったサンプルソースコード

config.php→定義用
saetv2.ex.class.php→新浪微薄のAPIをコールするクラス(これはSDKそのまま)
callback.php→ログイン後に遷移するページ
index.php→メインページ


config.phpでAPIKEY等を宣言します。


<?php
header('Content-Type: text/html; charset=UTF-8');
$app_key='XXXXXXXX';
$app_secret='XXXXXXXXXXXXXX';
$callback_url='http://jibunnodomein/callback.php';
?>


callback.phpにログイン後の処理を書きます。
コールバック関数はアクセストークンを何とかしてメインに返したい
セッションに入れてもうまくいかない場合があったので、
レスポンスで無理やり返した。


<?php
require_once('config.php');
require_once ('saetv2.ex.class.php');

session_start();

if(isset($_GET['code']) && $_GET['code']!=''){
$o = new SaeTOAuthV2($app_key, $app_secret);
$keys = array ();
$keys ['code'] = $_GET['code'];
$keys ['redirect_uri'] = $callback_url;
try{
$result = $o->getAccessToken ( 'code', $keys );
}catch(Exception $e){
echo "callback2";//エラーの場合
return;
}
}

if(isset($result['access_token']) && $result['access_token']!=''){
$_SESSION['sina_ssession'] = $result['access_token']; //access tokenをセッションに保存
echo $result['access_token'];//成功の場合アクセストークンを返す
}else{
echo "callback1";//失敗アクセストークンが帰ってこない。
}

?>


index.php
メイン処理の流れ
セッションを確認。(すでにログイン済みかを確認する)
セッションがある場合はセッションよりアクセストークンを取得して一件投稿する。
curlでログインページを呼び出しログインする。
コールバック関数でアクセストークンが帰ってくるのでそれを利用して
SaeTClientV2オブジェクトを作成し一件投稿する。


<?php
//index.php
require_once 'config.php';
require_once 'saetv2.ex.class.php';
session_start();

//セッションの確認、ない場合はログインする。
$sina_session=isset($_SESSION['sina_ssession'])?$_SESSION['sina_ssession']:'';
if($sina_session==''){
$o = new SaeTOAuthV2 ($app_key, $app_secret);
//$oauth_urlに自分用のログインURLが帰ってくる
$oauth_url = $o->getAuthorizeURL ($callback_url);

$postdata ['client_id'] = $app_key;
$postdata ['response_type'] = 'code';
$postdata ['redirect_uri'] = urlencode($callback_url);
$postdata ['action'] = 'submit';
$postdata ['userId'] = 'xxxxxxxx@xx.com';//weiboのアカウント
$postdata ['passwd'] = 'xxxxxxxxxxxxx';//ウェイボのパスワード
$postdata ['isLoginSina'] = 0;
$postdata ['from'] = '';
$postdata ['regCallback'] = '';
$postdata ['state'] = '';
$postdata ['ticket'] = '';
$postdata ['withOfficalFlag'] = 0;

//パラメータを文字列にする。
$postdata_str = '';
foreach ( $postdata as $dk => $dv ) {
$postdata_str .= $dk . '=' . ($dv) . "&";
}
$postdata_str = trim ( $postdata_str, '&' );

$ch = curl_init ();
$user_agent = 'shantian(sthz.lolipop.jp)';

curl_setopt ( $ch, CURLOPT_URL, "https://api.weibo.com/oauth2/authorize" );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt ( $ch, CURLOPT_REFERER, $oauth_url );
curl_setopt ( $ch, CURLOPT_USERAGENT, $user_agent );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postdata_str );

//コールする。戻りの値はコールバックPHPからのレスポンス。
$response = curl_exec ( $ch );
//echo 'response='.$response;
if($response=='callback2'){
echo '異常事態';
}elseif($response=='callback1'){
echo '失敗';
}else{
$sina_session=$response;
}
}else{
echo $sina_session;
}
if($sina_session!=''){
$c = new SaeTClientV2($app_key, $app_secret,$sina_session);
$c->update('testあああい');
}else{
echo "書き込まない";
}
?>

コールバックPHPでセッションに入れてるんですが、なぜか取れないことがある。
そのため毎回ログインのロジックに行ってしまう。
何でかわかりませんが、仕方ないのでレスポンスでも返すことにしました。
一度ログインしてしまうと、コールバックPHP側には飛んでくれない。
そのためアクセストークンはからなずどこかに取っておく必要がある。
セッションに入れるのが一番手っ取り早いと思ったのですが。。。
また何度も試行錯誤してるとAPIがいうことを聞かなくなってしまいます。
その時は$oauth_urlに入ってるURLを開いて、開発何とかってところのリンクを踏むと治りました。
とりあえずこれで自動ログインして一件書くところまではできましたが、
まだ問題があるかもしれません。
投稿はできたのでこれでアプリつくれますね。


新浪WEIBOのAPIが変更にならないように祈ります。
開発者登録をちゃんと最後までやってないので登録した人が、
来自未通过审核应用(審査が通ってないアプリケーション)ってなってるけど
これこのままだと使えなくなったりするのかな???

shěnhé【审核】審査する,突き合わせる