異邦人になってみた~上海の人 

読者です 読者をやめる 読者になる 読者になる

異邦人になってみた~上海の人 

上海在住です。中国時代劇をよく見ています、中国旅行の事、weiboやQQの設定、一眼レフカメラの写真掲載、上海での日々の生活情報を書いています

 記事一覧表示
スポンサーリンク

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

プログラム PHP 中国アプリ

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é【审核】審査する,突き合わせる