Home

sukechan.net

Twitter の投稿日時のフォーマットを変更するグリモン

Twitter Time Converter

これは何?

Twitter に表示される投稿日時(3 hours ago など)を yyyy/mm/dd hh:mi 形式に変更する Greasemonkey です。

きっかけは自分のログを振り返っている時に、「17 時間前」などと表示されても直感的にいつだったのかが分かりにくかったからです。

対応しているページは、Friends Timeline, Replies, Archive, Public Timeline, Favorites です。Permalink, Direct Messages には対応していません。

使い方

下記リンクからインストールしてください。 Firefox/Greasemonkey または Safari/Greasekit が必要です。

Twitter Time Converter – Userscripts.org

技術的なところ

Twitter のページの HTML に、ISO 8601 形式の日付が abbr タグの title 属性に入っているのですが、その ISO 8601 形式の日付が JavaScript の Date.parse で解釈できないようなので、仕方なく手動で parse しました。

parse については、以下のライブラリを参考にさせていただきました。感謝。
[JSAN] Date.W3CDTF - ISO-8601日時フォーマット対応JavaScriptクラス

関連リンク

ソース

// ==UserScript==
// @name           Twitter Time Converter
// @namespace      http://www.sukechan.net/
// @description    The format of posted date is change.
// @include        http://twitter.com/*
// @version        1.0
// ==/UserScript==

(function() {
  var f = function() {
    var x = document.evaluate('//a[@class="entry-date"]/abbr', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0; i < x.snapshotLength; i++) {
      var item = x.snapshotItem(i);
      var ds = parseDate(item.getAttribute("title"));
      if (ds) item.parentNode.innerHTML = ds;
    }
  }
  function parseDate(s) {
    var arr = s.split(/[^0-9]/);
    if (arr.length == 8 ) {
      for (var j = 0; j < arr.length; j++) arr[j] = arr[j] - 0;
      var msec = Date.UTC(arr[0], arr[1] - 1, arr[2], arr[3], arr[4], arr[5]);
      if (s.indexOf("+") < 0) arr[6] *= -1;
      msec -= (arr[6] * 60 + arr[7]) * 60 * 1000;
      var dt = new Date(msec);
      return dt.getFullYear() + "/" + padZero(dt.getMonth() + 1) + "/" + padZero(dt.getDate()) + " " + padZero(dt.getHours()) + ":" + padZero(dt.getMinutes());
    } else {
      return;
    }
  }
  function padZero(s) {
    return ("0" + s).slice(-2);
  }
  f();
  addFilter(f);
  function addFilter(filter, i) {
    i = i || 4;
    if (window.AutoPagerize && window.AutoPagerize.addFilter) {
      window.AutoPagerize.addFilter(filter);
    }
    else if (i > 1) {
      setTimeout(arguments.callee, 1000, filter, i -1);
    }
  }
})();

Google Trends のキーワードを投稿する Twitter bot

Google で検索数が急上昇しているキーワードを、Twitter に投稿する bot を作りました。

Twitter / GoogleTrendsFan

元になるページはこちら。
急上昇ワード

実際には、こちらの XML 形式で返してくれる API から取得しています。
http://www.google.com/m/services/trends/get

今のところ 1 時間毎 cron で取得し、トップ 10 を配信しています。

ソース

<?php
require_once 'HTTP/Client.php';

// パラメータ
$username = 'google_trends';
$password = '**********';
$auth = array(
  'Authorization' => 'Basic '.base64_encode($username.':'.$password)
);
$link_url = 'http://tinyurl.com/6r7zux';

// Google Trends の XML からキーワードを抽出
$items = array();
$xml = simplexml_load_file('http://www.google.com/m/services/trends/get');
if($xml) {
  for($i = 0; $i < 10; $i++) {
    $query = $xml->item[$i]->query;
    if($query) {
      $items[] = mb_convert_encoding($query, 'UTF-8', 'auto');
    }
  }
} else {
 return;
}
$status = $link_url.' '.implode(', ', $items);

// Twitter に post
$client =& new HTTP_Client(null, $auth);
$http_status = $client->post("http://twitter.com/statuses/update.xml", array('status' => $status));
?>

やってることはいたって単純。SimpleXML を使って Google Trends の XML を取得して、Twitter に BASIC 認証して発言するだけです。

関連リンク

PHP で Twitter をスクレイピングする

Twitter API を使っても過去の user_timeline を取得できないので、PHP で直接 Web をスクレイピングして取得してみました。

環境

・PHP 5.2.3
・PEAR::HTTP_Client を使用

取り出す内容

・id
・メッセージ(text)
・permalink
・発言日時

コード(クラス)

<?php
require_once 'HTTP/Client.php';

class Twitter_Scrape {

  private $statuses;

  public function __construct () {
  }

  public function getTimeline ($username, $page = 1) {
    $url = 'http://twitter.com/'.$username.'?page='.$page;

    $client =& new HTTP_Client();
    $client->get($url);
    $response = $client->currentResponse();

    $res = mb_convert_encoding($response['body'], 'UTF-8', 'UTF-8,SJIS,EUC-JP,JIS');
    $dom = @DOMDocument::loadHTML($res);
    if ($dom) {
      $xml = simplexml_import_dom($dom);
      if ($xml) {
        $i = 0;

        // $page が 1 の場合は最新の発言を取得する
        if ($page == 1) {
          $entries = $xml->xpath('//div[@class="desc hentry"]');
          $content = $entries[0]->xpath('p[@class="entry-title entry-content"]');
          $meta = $entries[0]->xpath('p[@class="meta entry-meta"]');
          $statuses[$i++] = array(
            'id'	 => substr($meta[0]->a[0]['href'], -9),
            'text' => strip_tags($content[0]->asXML()),
            'permalink' => $meta[0]->a[0]['href'],
            'date' => $meta[0]->a[0]->abbr['title']
          );
        }

        // ページ内の発言を取得する
        // URL が長いと途中で切れてしまう...
        $entries = $xml->xpath('//tr[@class="hentry"]');
        foreach ($entries as $entry) {
          $content = $entry->xpath('td[@class="content"]');
          $meta = $content[0]->xpath('span[@class="meta entry-meta"]');
          $statuses[$i++] = array(
            'id' => substr($entry['id'], 7),
            'text' => strip_tags($content[0]->span[0]->asXML()),
            'permalink' => $meta[0]->a[0]['href'],
            'date' => $meta[0]->a[0]->abbr['title']
          );
        }
        return $statuses;
      } else {
        print ('xml parse error');
      }
    } else {
      print ('dom parse error');
    }
  }
}
?>

コード(呼出元)

<?php
require_once "twitter_scrape.class.php";

$req = new Twitter_Scrape();
$statuses = $req->getTimeline('yusuke0927', 1);
foreach ($statuses as $status) {
  print('<tr>');
  print('<td>'.$status['id'].'</td>');
  print('<td>'.$status['text'].'</td>');
  print('<td>'.$status['permalink'].'</td>');
  print('<td>'.$status['date'].'</td>');
  print('</tr>');
}
?>

簡単な説明

インスタンスを生成して、getTimeline でユーザ名とページ数を渡すと、スクレイピングした結果を連想配列で返します。

問題点

発言に含まれる URL が長いと切れたままになってしまう。これは発言を asXML で取得した後に strip_tags でタグを除去しているせい。なんとかしたい。

さくらのレンタルサーバに PEAR をインストール

Go-PEAR を使ってさくらインターネットのレンタルサーバに PEAR をインストールしました。
元々さくらのレンタルサーバには PEAR がインストールされていますが、そこにインストールされていないパッケージは自分でインストールできないので、自分のディレクトリにインストールしました。
以下はそのメモです。内容が必ずしも合っているとは限らないですがご容赦を。

環境:
・さくらインターネット レンタルサーバ スタンダードプラン
・PHP 5.2.5

PEAR のインストール

http://pear.php.net/go-pear を開く。そこに表示されるスクリプトを go-pear.php としてローカルに保存。

FTP 等で、Web からアクセス可能なディレクトリ(例:/home/アカウント名/www/install)を作成し、そこに go-pear.php をアップロード。
ディレクトリのパーミッションは 755 にしておく。777 にしたら Internal Server Error になったので。.htaccess とかでパスワード制限をかけておいた方がいいかも。

ブラウザで、設置した go-pear.php にアクセスします。Next >> でインストール開始。

設定画面が表示されます。注意する点は以下。
1. Installation prefix は Web からアクセスできないディレクトリを指定。
10. Filename of WebFrontend は管理画面のパス。Web からアクセスできる場所を指定。
11. php.exe path, optional はさくらの場合 /usr/local/bin/php を指定。
install ボタンでインストール開始。

インストールが終わると、ログの下の方に PEAR Installation path という箇所があるので、これを控えておきます。

php.ini の設定

php.ini に先ほど控えた PEAR Installation Path を include_path として設定します。

include_path = “.:/home/アカウント名/pear/PEAR”

パッケージのインストール

管理ページをブラウザで開きます。URL は先ほど指定した 10. Filename of WebFrontend になります。
必要なパッケージを検索してインストール。依存しているライブラリも表示されるのであれば先にインストールします。

パッケージを全てインストールした後、管理ページはパスワード制限をかけておくか削除します。

その他

管理画面ではなく、コマンドプロンプトからパッケージをインストールしようとすると、 channel-update をしろといった警告が表示されます。
「pear channel-update pear.php.net」としても、
could not create lock file: failed to open stream: Permission denied
というエラーになってしまいます。原因は今のところ分からず・・・
管理画面からはパッケージをインストールできているんですが。

参考サイト

Twitter Tools をカスタマイズ

1 日の Twitter の発言を WordPress に投稿したりといったことができるプラグイン、Twitter Tools を入れていますが、少しソースを弄ってみたのでメモとして残しておきます。

まず、投稿される内容の部分。twitter-tools.php 245 行目あたりから。

$content = '<dl class="aktt_tweet_digest">'."¥n";
foreach ($tweets_to_post as $tweet) {
  $content .= '<dt><a href="http://twitter.com/'.$this->twitter_username.'/statuses/'.$tweet->tw_id.'">'.date('Y-m-d H:i:s', strtotime($tweet->tw_created_at)).'</a> '.make_clickable($tweet->tw_text).'</dt>'."¥n";
}
$content .= '</dl>'."¥n";

もう 1 つ、投稿時間を修正。323 行目あたりの INSERT 文の中。

VALUES
( '".$wpdb->escape($this->tw_id)."'
, '".$wpdb->escape($this->tw_text)."'
, '".date('Y-m-d H:i:s', $this->tw_created_at + 9*3600)."'
, NOW()
)

こちらを参考にしました。

 Page 9 of 12  « First  ... « 7  8  9  10  11 » ...  Last » 

Home

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

Return to page top