ホーム > タグ > PHP

PHP

はてブ Web Hook を使ってブックマーク時に Twitter に投稿する

はてなブックマークから Web Hook 機能というのがリリースされました。
これははてブにブックマークしたタイミングで、設定した URL に HTTP POST を投げてくれます。

というわけで、これを使ってはてブにブックマークしたら Twitter にその内容を投稿する PHP スクリプトを書いてみました。

<?php
require_once 'HTTP/Client.php';
header('Content-type: text/plain; charset=utf-8');

// はてなブックマーク Web Hook Key
define('HB_WEBHOOK_KEY', 'your_key');

// bit.ly アカウント
define('BITLY_USERNAME', 'your_username');
define('BITLY_API_KEY', 'your_api_key');

// Twitter アカウント
define('TW_USERNAME', 'your_username');
define('TW_PASSWORD', 'your_password');

// 正しいパラメータが設定されている場合
if(urldecode($_POST['key']) == HB_WEBHOOK_KEY) {
  if(isset($_POST['title'], $_POST['url'], $_POST['status'], $_POST['comment'])) {

    // ブックマークを追加した場合のみ
    if($_POST['status'] == 'add') {

      // パラメータをデコードする
      $title = mb_convert_encoding(urldecode($_POST['title']), 'UTF-8', 'auto');
      $url = urldecode($_POST['url']);
      $comment = preg_replace('/\[.+\]/', '', mb_convert_encoding(urldecode($_POST['comment']), 'UTF-8', 'auto'));

      // URL を bit.ly で短縮する
      $client =& new HTTP_Client();
      $http_status = $client->get('http://api.bit.ly/shorten?version=2.0.1&login='.BITLY_USERNAME.'&apiKey='.BITLY_API_KEY.'&longUrl='.$url);
      if($http_status == 200) {
        $response = $client->currentResponse();
        $result = mb_convert_encoding($response['body'], 'UTF-8', 'auto');
        $json = json_decode($result, true);
        if($json['statusCode'] == 'OK') {
          $url = $json['results'][$url]['shortUrl'];
        }
      }
      $status = "[B!] $title $url $comment";

      // Twitter に投稿する
      $client =& new HTTP_Client(null, array('Authorization' => 'Basic '.base64_encode(TW_USERNAME.':'.TW_PASSWORD)));
      $http_status = $client->post('http://twitter.com/statuses/update.xml', array('status' => $status));
      if($http_status == 200) {
        print('success.');
      } else {
        print('error. status='.$http_status);
      }
    }
  } else {
    header('HTTP', true, 400);
  }
} else {
  header('HTTP', true, 401);
}
?>

改変などはご自由にどうぞ。
せっかくなので Twitter の OAuth に対応させてみようかと思いましたが、途中でめんどくさくなりましたw

(追記@20090607)
140 文字以内に収まるように、bit.ly で短縮 URL にしてから投稿するようにしました。

ブログを少々カスタマイズ

ここ数日、いろいろブログを弄ったのでメモ。

  • ページナビゲーションを強化
  • WP-PageNavi プラグインを追加しました。
    index.php や archive.php 等をそれぞれ以下のように修正(テーマに Vicuna を使っています)。

    (old)
    <?php vicuna_paging_link('indent=2') ?>
    
    (new)
    <?php if(function_exists('wp_pagenavi')) {
      wp_pagenavi();
    } else {
      vicuna_paging_link('indent=2');
    } ?>

  • 各エントリにはてなブックマークへの追加ボタンと Twitter に送るボタンを追加
  • そのままです。

  • ページを表示している時にヘッダのナビゲーションをそれっぽく
  • ソースは以下。ID をオンコーディングしてるけどとりあえず気にしない。

    <ul id="globalNavi">
      <li><a href="http://www.sukechan.net/">Home</a></li>
      <?php if($post->ID == '72') : ?><li class="current"> <?php else : ?></li><li> <?php endif; ?><a href="http://www.sukechan.net/lab">Lab</a></li>
      <?php if($post->ID == '2') : ?><li class="current"> <?php else : ?></li><li> <?php endif; ?><a href="http://www.sukechan.net/about">About</a></li>
    </ul>

空目 bot を作りました

これは何?

Twitter の「○○を××に空目した」という発言を抽出して、Twitter に投稿する bot です。

Twitter / sorametter

しくみ

  • Twitter検索 : 空目 空目 - twitter検索 から発言を取得(1 時間毎)
  • 正規表現でマッチする発言のみを抽出して、テーブルに格納
  • テーブルに格納した中から発言していないものをランダムに 1 つ取得して、Twitter に post
  • 他の時報 bot などと発言が重なってタイムラインが早くなりすぎるのを避けるため、発言は毎時 30 分 1 時間に 2 回しています。

謝辞

発言を抽出するために Twitter検索を使わせていただいています。shin1×1 さんに感謝します。

追記@20090124

最近、仕様を少し変更しました。

「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」を PHP で解いてみる【第 5 回】

  • 2008-06-08 (日)
  • PHP
  • Tags:
  • hatena add hatena users
  • send twitter

新しくプログラミング言語を覚えたいときに行うべき10の練習問題の第 5 問を解いてみます。今回のお題はこちら。

5.キーワードを入れてYahoo!の検索結果を出力。

このお題には、Yahoo! が提供しているウェブ検索の API を使いました。
API を使うには、事前にアプリケーション ID を登録する必要があります。

指定された URL にリクエストを投げると、結果が XML で返ってくるので、SimpleXML で読み込んで検索結果を表示しています。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<title>yahoo search sample</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<form method="GET" action="069_phpstudy_05.php">
<input type="text" name="query" length="30" value="<?php print($_GET['query']) ?>" />
<input type="submit" value="検索" />
</form>

<?php
if(isset($_GET['query']) && strlen($_GET['query']) > 0) {

  // appid には登録した ID を指定する
  $url = 'http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?appid=(appid)&query='.urlencode($_GET['query']);

  $xml = simplexml_load_file($url);
  if($xml) {
    print('<p>"'.htmlspecialchars($_GET['query']).'" で検索した結果 : '.number_format($xml['totalResultsAvailable']).'件</p><hr />');
    print('<ol>');
    foreach($xml->Result as $result) {
      print("<li><a href='$result->ClickUrl'>$result->Title</a><br />");
      print($result->Summary);
      print('</li>');
    }
    print('</ol>');
  }
}
?>

</body>
</html>

>>作成したサンプルはこちら

参考リンク

「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」を PHP で解いてみる【第 4 回】

  • 2008-06-07 (土)
  • PHP
  • Tags:
  • hatena add hatena users
  • send twitter

新しくプログラミング言語を覚えたいときに行うべき10の練習問題の第 4 問を解いてみます。今回のお題はこちら。

4.簡易電卓。0で割ったときの処理を自分なりに作りこむ。

この問題をどうやって実装しようかと悩んでたのですが、数値を入力するエリア 2 つと演算子を選択するだけのシンプルなフォームにしてみました。

計算を行っているのは calc 関数。
まず、最初にアクセスした時は $_GET は空なので、isset() 関数を使って値がセットされているかどうかを確認します。
値がセットされていてその値が数値の場合は、選択された演算子で計算し、計算結果を左側のエリアにセットします。
割る数が 0 の場合は、計算せずに元の値をそのままセットしています。

caution 関数は、入力された値が間違っている場合(0 で割ろうとした場合も含む)にエラーメッセージを表示しています。

<?php
function calc() {
  if(isset($_GET['op'], $_GET['v1'], $_GET['v2'])) {
    if(is_numeric($_GET['v1']) && is_numeric($_GET['v2'])) {
      switch($_GET['op']) {

        // 加算
        case '1':
          print($_GET['v1'] + $_GET['v2']);
          break;

        // 減算
        case '2':
          print($_GET['v1'] - $_GET['v2']);
          break;

        // 乗算
        case '3':
          print($_GET['v1'] * $_GET['v2']);
          break;

        // 除算
        case '4':

          // 0の場合は割らない
          if($_GET['v2'] != '0') {
            print($_GET['v1'] / $_GET['v2']);
          } else {
            print($_GET['v1']);
          }
          break;
      }
    } else {
      print($_GET['v1']);
    }
  }
}

function caution() {
  if(isset($_GET['op'], $_GET['v1'], $_GET['v2'])) {
    if(is_numeric($_GET['v1']) && is_numeric($_GET['v2'])) {
      if($_GET['op'] == '4' && $_GET['v2'] == '0') {
        print('0では割れません。<br />');
      }
    } else {
      print('半角数値を入力してください。<br />');
    }
  }
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<title>sukechan.net: 「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」第 4 回のサンプル</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>

<form method="GET" action="068_phpstudy_04.php">
<input type="text" name="v1" size="10" value="<?php calc(); ?>" />
<select name="op">
<option value="1" selected="selected">+</option>
<option value="2">−</option>
<option value="3">×</option>
<option value="4">÷</option>
</select>
<input type="text" name="v2" size="10" value="" />
<br />
<?php caution(); ?>
<input type="submit" value="計算" />
</form>
</body>
</html>

>>作成したサンプルはこちら

参考リンク

 Page 1 of 3  1  2  3 »

Home > Tags > PHP

Search
Feeds
Meta
あわせて読みたい
あわせて読みたいブログパーツ
Others...
フィードメーター - sukechan.net
track feed

Return to page top