短縮URLサービスの作り方

短縮URLサービスをいろいろ使ったりしてたのですが、
・サービスがたまに止まったりしてる
・突然Twitterで使えなくなったりする
・アカウント登録がめんどくさい

などから、自前で作ってみることにしました。

まずは、URLを短縮して置き換えるとこ

make.php

<?php

if (isset($_POST["url"])) {
	
	$r = substr((md5(date("YmdD His"))), -7);

	//$r と $_POST["url"] をDBに格納する
}

?>

<html>
	<head>
		<title></title>
	</head>
	<body>
		<form method="post" action="./make.php">
		<input type="text" name="url" size="64"/>
		<input type="submit" />
		<h3><?php echo $r?></h3>
		</form>
	</body>
</html>

とりあえず、今日の日時分あたりのmd5ハッシュ値とURLを紐付けし、それをDBに格納します。
(DB格納部分は今度)

ハッシュしたKeyから、URLを引っ張ってきて、ridirectするとこ

redirect.php

<?php
$url = "";
if ($_GET['id']) {
	$value = getUrl($_GET['id']);
	if (!empty($value)) {
		$url = $value;
	}
}

header("Location:".$url);

function getUrl($id) {
	//DBに格納した、ハッシュからURLを引っ張る
}
?>

例えば、これを http://hogehoge.com 上に配置すると、

http://hogehoge.com/redirect.php?id=ABCD123

とかすれば、「ABCD123」に対応したURLに飛ばしてくれるわけです、

でも、redirect.php?id=ABCD123 とかのままでは、ちょっとカッコ悪いので、

Apache.htaccess をちょっといじります。

RewriteEngine on
RewriteRule ^([a-zA-Z0-9]+)$ /r1edirect.php?id=$1

こうすれば、
http://hogehoge.com/ABCD123

これで、リダイレクトしてくれるので、やや雰囲気が出るかなと。

(DBの部分は次回に)

PHPでFacebookにログイン認証するサンプル

アプリIDとシークレットIDの取得が前提です。

login.php

<?php
require_once __DIR__ . '/facebook-php-sdk-v4-5.0.0/src/Facebook/autoload.php';

$appId = "xxxxxxxxxxxxx";
$appSecret = "xxxxxxxxxxxxxxxxxxxxx";
$REDIRECT_URI = "http://192.168.1.1/redirect.php";

$fb = new Facebook\Facebook([
  'app_id' => $appId,
  'app_secret' => $appSecret,
]);

$helper = $fb->getRedirectLoginHelper();

// Optional permissions
$permissions = ['public_profile','email','user_birthday','publish_actions']; 

$loginUrl = $helper->getLoginUrl($REDIRECT_URI, $permissions);
header("Location: {$loginUrl}");

?>

ログイン認証されている場合は、指定したページ

$REDIRECT_URI = "http://192.168.1.1/redirect.php";

に移動します。
認証されていない場合は、Facebookのログイン画面を挟んでから、移動します。

redirect.php

<?php
require_once __DIR__ . '/facebook-php-sdk-v4-5.0.0/src/Facebook/autoload.php';

$appId = "xxxxxxxxxxxxx";
$appSecret = "xxxxxxxxxxxxxxxxxxxxx";

$fb = new Facebook\Facebook([
  'app_id' => $appId,
  'app_secret' => $appSecret,
]);

$helper = $fb->getRedirectLoginHelper();

try {
  $accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  // When Graph returns an error
  echo 'FacebookResponseException: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  // When validation fails or other local issues
  echo 'FacebookSDKException: ' . $e->getMessage();
  exit;
}

if (! isset($accessToken)) {
  if ($helper->getError()) {
    header('HTTP/1.0 401 Unauthorized');
    echo "Error: " . $helper->getError() . "\n";
    echo "Error Code: " . $helper->getErrorCode() . "\n";
    echo "Error Reason: " . $helper->getErrorReason() . "\n";
    echo "Error Description: " . $helper->getErrorDescription() . "\n";
  } else {
    header('HTTP/1.0 400 Bad Request');
    echo 'Bad request';
    exit;
  }
}

// Logged in
echo '<h3>Access Token</h3>';
var_dump($accessToken->getValue());

// The OAuth 2.0 client handler helps us manage access tokens
$oAuth2Client = $fb->getOAuth2Client();

// Get the access token metadata from /debug_token
$tokenMetadata = $oAuth2Client->debugToken($accessToken);
echo '<h3>Metadata</h3>';
var_dump($tokenMetadata);

// Validation (these will throw FacebookSDKException's when they fail)
$tokenMetadata->validateAppId(APP_ID); // Replace {app-id} with your app id
// If you know the user ID this access token belongs to, you can validate it here
$tokenMetadata->validateExpiration();

if (! $accessToken->isLongLived()) {
  // Exchanges a short-lived access token for a long-lived one
  try {
    $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
  } catch (Facebook\Exceptions\FacebookSDKException $e) {
    //echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>\n\n";
    //exit;
        
  }

  echo '<h3>Long-lived</h3>';
  var_dump($accessToken->getValue());
}
?>
callback用のページです、ここでユーザのアクセストークン取得したら、長いアクセストークンに変換したりします。

Graph APIを使って、Facebookのタイムラインに投稿(feed)する方法

1. FBアカウントの取得
2.アプリ登録
3.トークンを取得する

トークンは、Graph APIエクスプローラから取得

4.投稿するソース
<?php

require_once __DIR__ . '/facebook-php-sdk-v4-5.0.0/src/Facebook/autoload.php';

$appId = "xxxxxxxxxxxxx";
$appSecret = "xxxxxxxxxxxxxxxxxxxxx";
$token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

$post_data = array(
    'message' => '投稿メッセージ本文',
);

$fb = new Facebook\Facebook([
  'app_id' => $appId,
  'app_secret' => $appSecret,
]);

try{
    $fb->post("me/feed", $post_data, $token);
} catch(FacebookApiException $e) {
    echo 'FacebookApiException: ' . $e->getMessage();
}

?>

$post_dataには、

$post_data = array(
    'name' => 'リンク名',
    'link' => 'リンク先URL',
    'picture' => '画像URL',
    'caption' => '説明文',
    'description' => '詳細文',
    'message' => '投稿メッセージ本文',
);

こんなものが指定可能。

アンカリング

先日、調べ物をしていたら、”アンカリング”と言う言葉にぶつかりました。

心理学の用語のみたいですね。

”アンカリング”で検索してみるとこんな説明がありました。

「ある体験に対して、感覚的な刺激を条件付けし、その体験を定着させてたやすく引き出せるようにすること」を言う

言葉だけでは分かりにくいので、簡単に例えると、

幹事 : 今日の飲み会の会費 8,000円ね
参加者 : 了解(ちょっと高くない?)
幹事 : 調整したら、一人5,000円に成ったよ
参加者 : おお結構、安いじゃん

最初に出された数字がアンカ(定着)させることで意識を向かわし、最終的には、相手にお得感を与えるんです。
(最初から、5,000円で済んでいたのかも知れないのですが)

こちらの方がわかりやすいですね。

http://bizmakoto.jp/makoto/articles/1001/15/news010.htmlbizmakoto.jp


ネットでもよくありますね、
今なら30%引きとか、限定◯◯名様までこの価格とか。

自分に価値のある価格を意識しておきたいですよね。
特に、高額な物ほど、普段の買い物と桁がちがうし、なぜか高い方が安心したりとか。
そんな心理も働きますよね。

頑張って努力しても報われない、工夫しないと

日本人って、頑張るという言葉が好きですよね。

普段の生活でも、「頑張ってください」「頑張ります」「勤勉は美徳、努力は必ず報われる」などよく聞きます。

でも、大切なのは「何を頑張ることが必要なのか」そして「それをきちんと理解し、実行しているか」ですよね。

自分もそうでしたが、夜遅くまで仕事をしていたことがよくあります。
確かにやること一杯で、こなしてもこなしても終わらないことばかりでした。

でも実は、自分で終わらせないようにしていたのかも。
そして、夜遅くまですることで、仕事していた気に成っていたのかも知れません。

掲題に「頑張って努力しても報われない」と記載しましたが、
そんなことはないです。
努力って大切です。

ただ、その方向性を間違えないことが必要ですね。

人と違う結果を出すためにはどうすればいいのかについて、新しいやり方を考え実行すること、工夫が必要です。

努力とは、最も短い時間で成果を出すための工夫をすること。

楽な方に行ってしまいがちなのが人間です。
人に言われた作業をこなし、問題が発生したら他人(上司)に話を振って自分は何もしない。周りの人と同じ事をして安心する。そしてだらだらと。

自分でかいててつらい。。。。。

松井証券の社長さんが、社員にこう言っています。
「みんな頑張るのはやめよう。どうか頑張らないでくれ。頑張ったって所詮何割の世界でしかない。頑張らないでも良い方法を頑張って考え実行しよう。そうすれば、何倍、何十倍、何百倍の世界の門が開く」


結局頑張るのかい!?ですが、
その方向性なのでしょうね。
人と違う結果を出すこと。
その為に、自分の殻を破り、実行すること。

考えてるだけでは、だめ、実行しないとね。