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

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

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

PHPはてなダイアリーとウェイボの連携

普通に探してもなかなか見つからなかったのでとりあえず作ってみます。
やりたいのは、はてなダイアリー→新浪ウェイボです。
方法としては、
1、はてなダイアリーRSSを読み込む
2、DB内に既に登録されていないかを確認
3、登録されていない場合、ウェイボのAPIを使用してWEIBOに書き込む
4、DBにも書き込み、(一度書いたものは書かないようにするため)
これだけなんですけどね。

細かい作業として
RSSからタイトルとリンクを抜き出す。
数値文字参照を文字に変換する。
という作業もあります。
RSS自体はsimplexml_load_fileを使ってかんたんに取得しています。


ウェイボ側のAPI操作が結構めんどくさかったりします。
ログイン画面を飛ばす方法が結構厄介。
API関連はここでは書きません。API関連は
PHPで新浪微薄APIを使ってみる。を参照してください。

ウェイボAPIがいつ変更になるかもわからないので
とりあえず暫定的ですが。。。

ソースを書くときに飛ばす先のリンクですが、ふつうにURLをコードに入れると勝手に短いURLに変更されてしまいます。
HTMLタグも使用不可のようです。専用の何かがあるのかもしれませんが。。。
アンドロイドスマホで見た場合、リンクを「网页链接」から普通に「手机版」で見ると文字化けしてしまいます。
「原网页」で見るとちゃんと見えます。このことから、
PC版はUTF-8になってましたがウェイボのスマホ文字コードUTF-8じゃないのかな?
とか思ったりして。。。
とりあえずテスト中ということでこのまま放置します。
ウェィボAPIのログイン部分はこの記事を参照


<?php
header("Content-Type: text/html; charset=UTF-8");
$HOME_PATH='/home/hogehoge/';//フルパス


//この前の段階でウェイボ用のログインを済ませておくこと。
//
//
//ウェイボ用クライアントオブジェクトを作成。
$weibo = new SaeTClientV2($app_key, $app_secret,$sina_session);


//SQLITE読み込み
$link = sqlite_open($HOME_PATH . "blogtitle.db", 0666, $sqliteerror);
if (!$link) {
die('接続失敗です。'.$sqliteerror);
return;
}

print('接続に成功しました。
');
//テーブルを作成する必要がある場合。(最初の一回だけ)
//$sql = "create table T_hatenapost ( 'POST_DATA' TEXT ,PRIMARY KEY('POST_DATA'));";
//echo $result = sqlite_query($link, $sql, SQLITE_BOTH, $sqliteerror);


set_time_limit(180);


//RSSを取得
$root = simplexml_load_file('http://d.hatena.ne.jp/shan1tian2/rss');
for($ii = 0; $ii < count($root->item); $ii++){
$item = $root->item[$ii];
//DB内に対象のリンクがあるかを確認
$flg = -1;
$sql = "SELECT POST_DATA FROM T_hatenapost WHERE POST_DATA='" . $item->link ."';";
$result = sqlite_query($link, $sql, SQLITE_BOTH, $sqliteerror);
if (!$result) {die('クエリーが失敗しました。'.$sqliteerror);return;}
//DBの確認データが見つかった場合抜ける。
for ($i = 0 ; $i < sqlite_num_rows($result) ; $i++){
$rows = sqlite_fetch_array($result, SQLITE_ASSOC);
$dbuserid = $rows['POST_DATA'];
$flg = 0;
continue;
}
//数値参照文字のコンバート
$item->title=convert_sutimojisanshou($item->title);
//タイトルの抜き出し。(はてなRSSは頭にカテゴリがあるのでこれを取得)
preg_match_all("/\[(.*?)\]/is", $item->title, $contentmatches);
$wkRenketsu ="";
if(isset($contentmatches[1][0])){
//最初に値だけ取得
for($j = 0; $j < count($contentmatches[1]); $j++){
$wkRenketsu = $wkRenketsu.$contentmatches[0][$j];
}
}
//タイトルのみを抜き出す。
$wordtitle = str_replace($wkRenketsu, "", $item->title);
//DB内にデータが存在しない場合データを追加
if($flg == -1){
//"タイトル"+"→"+"リンク"という形でウェイボに書き込み。URLは自動で短縮化される。
//携帯版が文字化けするのでウェブ版で見てくれって一応書いておきます。
$weibo->update($wordtitle."→希望换原网看一下(手机版乱码)".$item->link);
//投稿したデータをDBに追加
$sql2 = "INSERT INTO 'T_hatenapost' VALUES ('".$item->link."');";$result_flag = sqlite_exec($link, $sql2, $sqliteerror);
}
}
sqlite_close($link);
print('切断しました。');


//数値文字参照のコンバート
function convert_sutimojisanshou($intext){
$text = $intext;
//数値文字参照を見つける
preg_match_all("/&#(.*?);/is", $text, $contentmatches);
//var_dump($contentmatches);
if(isset($contentmatches[0][0])){
for($j = 0; $j < count($contentmatches[0]); $j++){
$str_char = mb_convert_encoding($contentmatches[0][$j], 'UTF-8', 'HTML-ENTITIES');
if("" != $str_char){
$text = str_replace($contentmatches[0][$j],$str_char,$text);
}
}
}
return $text;
}
?>


ウェイボAPIを使ってツイッターなりフェイスブックなりからJSON形式でデータを取り出して連携させることも可能かと思います。
ウェイボ→からツイッターフェイスブックはウェイボのデータを抜き出す必要がありますね。これもAPIを使えば
できるんじゃないかと思いますが。。。仕様が変わらなければいいですが。。。


普通の人が使える完全なアプリにしろって。。。。それはない?
こんなことしたらウェイボから怒られたりして??
まあほかにもアプリあるから問題ないとは思いますが、
いずれにしてもサーバースペックが脆弱なのと他人のUserIDを扱いたくないので。。。。