tech::hexagram

personal note for technical issue.

今日のパーティーを占ったーの技術的仕様について[sample.php]

最後に,sample.phpについてです.
五月雨的ですみません(うちの教授の名言?迷言?).

<?php
session_start();

require_once("OAuth/twitteroauth.php");
$to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['access_token'], $_SESSION['access_token_secret']);

//names
$name=$_SESSION['screen_name'];
//get today number
$now = getdate();
$id = $_SESSION['user_id'];

//get number for party lists;
$total_num=$now[yday]*$now[yday]+$id*2;

$party_num[0]=$total_num%8;
$party_num[1]=($total_num+mt_rand(1,10))%8;
$party_num[2]=($total_num+mt_rand(1,10))%8;
$party_num[3]=($total_num+mt_rand(1,10))%8;

$hp[0]=mt_rand(1,1000);
$hp[1]=mt_rand(1,1000);
$hp[2]=mt_rand(1,1000);
$hp[3]=mt_rand(1,1000);

//variables

$hero='勇者';
$soldier='戦士';
$fighter='武闘家';
$wizard='魔法使い';
$pilgrim='僧侶';
$merchant='商人';
$goofoff='遊び人';
$sage='賢者';
$joblist=array($hero,$soldier,$fighter,$wizard,$pilgrim,$merchant,$goofoff,$sage);

$contents=("今日のパーティーは${joblist[$party_num[0]]}(@${name}さん):HP$hp[0]${joblist[$party_num[1]]}:HP$hp[1]
${joblist[$party_num[2]]}:HP$hp[2]${joblist[$party_num[3]]}:HP$hp[3]です。
via 今日のパーティーを占ったー http://bit.ly/gbePlZ #dq3party");
$contents2 = mb_convert_encoding($contents, "UTF-8","SJIS");
//tweet

$tweet =$to->OAuthRequest("https://twitter.com/statuses/update.xml",array("status"=>$contents2),"POST");

(中略)
?>

<html>
html本体
</html>

OAuth認証ページで得られる変数

$_SESSION{'screen_name'},$_SESSION{'user_id'}により,それぞれ,ユーザのTwitterIDと,IDを数値化したものが得られます.
今回,診断結果にはこの数値化されたIDを用いています.

//get number for party lists;
$total_num=$now[yday]*$now[yday]+$id*2;

$party_num[0]=$total_num%8;
$party_num[1]=($total_num+mt_rand(1,10))%8;
$party_num[2]=($total_num+mt_rand(1,10))%8;
$party_num[3]=($total_num+mt_rand(1,10))%8;

ここが診断結果の肝です.$total_numが数値化されたIDと数値化されたその日の日付を使った診断値です.
これを8で割った余りをユーザの診断結果としています.
次に,残り3人の診断結果がそれ以下の行に書いてあります.mt_rand(1,10)は,1〜10までのランダム値です.これを加算して8で割った余りをパーティの診断結果です.

$hero='勇者';
$soldier='戦士';
$fighter='武闘家';
$wizard='魔法使い';
$pilgrim='僧侶';
$merchant='商人';
$goofoff='遊び人';
$sage='賢者';
$joblist=array($hero,$soldier,$fighter,$wizard,$pilgrim,$merchant,$goofoff,$sage);


8で割ったあまりの8種類の値に対し,配列でジョブを割り振っています.

最後に,診断結果を以下で掃き出し,twitterにポストします.

$contents=("今日のパーティーは${joblist[$party_num[0]]}(@${name}さん):HP$hp[0]
${joblist[$party_num[1]]}:HP$hp[1]${joblist[$party_num[2]]}:HP$hp[2]${joblist[$party_num[3]]}:HP$hp[3]です。
via 今日のパーティーを占ったー http://bit.ly/gbePlZ #dq3party");
$contents2 = mb_convert_encoding($contents, "UTF-8","SJIS");
//tweet

$tweet =$to->OAuthRequest("https://twitter.com/statuses/update.xml",array("status"=>$contents2),"POST");

$contentsが生データです.ここで大事なのが,Twitterにポストする際,そのままだと文字化けが生じてしまうため,SJIS->UTF-8へ変換する必要があります(超重要)

最後の行で,$contents2をPOSTしてツイートができ,タイムラインに反映されて終了です.


今回,診断結果を勝手にツイートする!という部分に無駄にこだわりをいれたためこんな形になりました.本来であれば,診断結果に対し,ユーザのコメントとか入れられるとUI的には面白いんですが,それだと診断メーカーとなにも変わらないので.

意図せずツイートされてしまった!状態を作りたかっただけですw

というわけで,3回にわたりお送りしてきた(ホントはこれが言いたかったけど全部1日で更新してしまいましたが^^;)ソースコード晒し,いかがでしたでしょうか.またオモローなものを作っていきたいと思います.