Categoryはてな

スクリプトでメールを送信して、はてなダイアリを更新する

はてなダイアリー日記 – パソコンのメールからも更新が可能になりました」というわけで、メールではてなダイアリを更新できるようになった。そこで、以下のようなスクリプトを書いて、実験してみた。
結果、普通に更新できた!当然、はてな記法もちゃんと適用されている。また、以下のスクリプトでは、試しに画像を2枚添付して送信してみたが、最初の一枚だけが掲載されるようであった。

はてなダイアリー日記 – メール投稿で複数画像のアップロードに対応しました」というわけで、複数の添付画像に対応したとのこと。

ともあれこれで、Plaggerのはてなダイアリへのpublish用プラグインとか、作れちゃいそうである。

#!/usr/bin/perl
use strict;
use warnings;
use MIME::Lite;
my $msg = MIME::Lite->new(
From => 'test@example.com',
To   => '秘密のアドレス',
Subject => 'てすとだぉ',
Data => <<'__BODY__',
本文始まりだぉ。
-りすと1だぉ
-りすと2だぉ
>>
引用だぉ
<<
本文終了だぉ。
__BODY__
);
# スクリプトと同じ階層に、事前にtest1.jpg, test2.jpgを置く
for (qw(test1.jpg test2.jpg)) {
$msg->attach(
Type     => 'image/jpeg',
Path     => $_,
Filename => $_,
);
}
$msg->send;

HTML::WidgetValidatorのプラグインを作成した

はてなダイアリのウィジェットブログパーツ)対応については、予告通り着々と進行しているところだが、それらウィジェットの安全な使用を可能にする仕組みについても、「はてなダイアリー日記 – はてなダイアリーで設置可能なブログパーツを判定するPerlモジュールをCPANにて公開しました」にて発表された通り、HTML::WidgetValidatorなるモジュールがCPANにて公開された。

はてなダイアリーに貼り付け可能なブログパーツの判別に利用しているPerlモジュール「HTML::WidgetValidator」をCPANにアップロードして公開しました。

はてなダイアリーで設置可能なブログパーツを判定するPerlモジュールをCPANにて公開しました – はてなダイアリー日記

このモジュールは、各ウィジェットへの対応を、プラグインを追加することで増やしてしていくことができ、また、以下の通り、開発への参加がよびかけられている。

このモジュールの対応ブログパーツの追加に興味をもたれた開発者で、新たなブログパーツ判別のためのコードを書いていただけるという方は、ぜひ作成したコードをsupport☆hatena.ne.jp(引用者註:@を☆に変更)までお送りください。お送りいただいたコードは、可能な限りHTML::WidgetValidatorに取り込ませていただきたいと考えております。

はてなダイアリーで設置可能なブログパーツを判定するPerlモジュールをCPANにて公開しました – はてなダイアリー日記

激烈に素晴しいことこの上ないこの試みに対し、僭越ながらこの僕も是非とも協力させていただきたいと思い、プラグインを作成してみた。対応したブログパーツは、先日、ブロゴスフィアに激甚な衝撃をもたらした、あのISTブログパーツである。ご存知ない方は、実際にそれが適用されたサンプルブログをご覧いただきたい。必ずや「これはすごい!自分のはてなダイアリーにも是非適用したい!!!」と思うことだろう。
コードは、以下のリンク先から得ることができる。

是非ともこのプラグインを採用していただき、ユーザはもとより閲覧者についても、誰もがより豊かなはてなダイアリーライフを満喫できるよう、寛大な取り計らいを望む。

はてなブックマークコメントへのはてなスター追加に寄せて

機能変更、お知らせなど – はてなブックマーク日記 – はてなブックマークへのはてなスターの表示試験について」に見られる通り、はてなブックマークのコメントに対しても、スターをつけられるようになった。

本日よりはてなブックマークのコメント欄に、はてなスターを表示します。これはあくまで試験的な試みで、1週間から数週間程度の期間をみて評価を行い今後の継続を検討するものです。

はてなブックマークへのはてなスターの表示試験について – はてなブックマーク日記 – 機能変更、お知らせなど

よいフィードバックが得られ、またその結果として、正式な機能として継続していけたら、大変素晴しいことだと思う。
はてなスターは、スターをつけたそのひと自身にとってのエントリの一覧性については、たぶん、わりとどうでもよいのだろうと思う。たとえば、はてなスター – antipop favoritesを見ても、あれがどういう仕組みであんな風に表示されてるのか、いまだによくわからないし。
ともあれ、より重要なのは、はてなスターがこれまでになく手軽でポップ、かつ、有用なアノテーションシステムであるということだ。つまり、はてなスターは、スターをつける人々に直接的に益するというよりもむしろ、スターをつける対象リソースをより豊かなものにすることこそに、その本領を発揮する。もちろん、みながスターを付けたり付けなかったりした結果、より豊熟したリソースを得られることにより、スターをつけた人々にも利益となる。
個別的に見れば、本件、すなわち、はてなブックマークコメントに対するスター追加により、エントリ個別ページの表示が重くなるのが嫌だという懸念については十分に理解可能だし、また、実際に表示が重くなったらマズかろうとは思う。しかし、それは本質的なことではない。今後のHatenaStar.js、および、その利用に関する改善に期待すればよいだけのことだ。事の本質は、繰り返しになるが、スターの付加によるリソースの価値向上にあるのだ。
あらゆるパーマリンクが指し示すリソースにスターをつけられる世界こそが望ましい……いや、それだけではまだ星が足りない。このウェブの世界には、まだまだスターが欠けている。たとえば、エントリの段落単位でスターを付けたいことだってあるし、もっと考えを進めると、むしろフレーズ単位で星をつけられるようになってこそ、真に有用なアノテーションたり得るのかもしれない。「このフレーズ、ヤバイ!!!!!!!!!!!」と思ったら、マウスでパーッと選択して、さくっとスター付けできること。
はてなダイアリは、その当初から、はてなキーワードによりその種のアノテーションを行ってきた。はてなスターは、はてなダイアリの持つ本義に鑑みれば、なにもことさらに新しい機能というわけではない。はてなスターはキーワードと違い、基本的にポジティヴな判断を示すという方向性と、手軽な参加を可能にした点に、その新しさがあるわけだが、しかし、そもそもはてなダイアリで文章を書くことは、自ずから、コミュニティとともにあるということだ。それは常に、リソースをより開かれた、より豊かなものにしてくれる。
ウェブを、多様なアノテーションに満ちた、もっともっと豊かなものにしていくために、本件に限らぬさらなるはてなスターの横溢を、あなたともに言祝ぎたいと願う。

RimoCh – Rimoのユーザチャンネルを管理・共有するサービス

f:id:antipop:20070325205555p:image
みんなが大好きRimoが、チャンネルを作って公開できるようになったってんで、かなりと強まりまくり、大興奮!DARAOにも同様の機能があったりするのだけど
しかしいまんとこ、両者ともにチャンネルを作りっぱなしにするだけで、自分の作ったチャンネルを管理・共有するのがめんどいので、RimoChというサービスを作りました。

RimoChは、はてなが提供しているRimoのチャンネル機能を拡張するサービスです。現在のところRimoでは、チャンネルを作ることはできますが、そのチャンネルを管理したり、簡単に共有したりすることができません。RimoChを使うと、はてなIDがある方なら誰でも、Rimoチャンネルを管理・共有できます。

404 ERROR – Page Not Found

YouTubeのビデオへのリンクがたくさんあるようなページ(各種まとめサイトや、自分のブックマークやブログ等)からブックマークレットでもってチャンネルを作成します。より多くのひとが作ったチャンネルは、トップページに「人気チャンネル」として表示されます。あと、一応Wiiにも対応してたりします。つってもまぁ、UA名がWiiのものっぽかったら、文字をちょっとでかくしてるだけですが。
Rimo(リィモ)開発日記 – ユーザーチャンネルの改善について」にもアナウンスされている通り、人気・新着チャンネルのみなら、すでに大元のRimoにて提供されていたりします(Rimo – ユーザーチャンネル」)。ユーザ単位でのチャンネル管理機能にもそのうち対応するだろうと期待していますが、まぁそれまでのつなぎってことで(「ウェブサービス作りたい期」なので><)。
どうぞご利用ください。

Plagger で、はてなミュージックを Windows 以外でも使えるようにする

はてラボで、はてなミュージックなんてな素敵サービスがリリースされ、音楽好きとしてはこれ以上ない楽しみなわけで、さっそく遊んでいます。しかし、いまんとこはてなミュージックの曲情報更新クライアントは Windows + iTunes にしか対応していないわけで、

はやくMacではてなミュージックしたいです。

なんてな記述も見受けられます。まぁ、ちょっと追加のコードを書きさえすれば、まさに「それPla」な話。そこで、はてなミュージックの更新クライアントの挙動を調べて、まずは WebService::Hatelabo::Music というモジュールを作り、それを Plagger から使うために Plagger::Plugin::Publish::HatelaboMusic というプラグインを作りました。

まぁ、以前「antipop – mixi ミュージック、あるいは Web2.0 のレッスン」なんてエントリを書いたりもしてるので、mixi をいじっておいて、はてなをいじらないわけにもいかないし!

WebService::Hatelabo::Music

WebService::Hatelabo::Music はこんな風に使います。まぁ、new して add_tracks するだけ。

use WebService::Hatelabo::Music;
my $music = WebService::Hatelabo::Music->new(
username => $username,
password => $password,
);
$music->add_tracks(
{
artist => 'Cornelius',
album  => 'Sensuous',
track  => 'Music',
date   => '2006-11-11 01:46:08',
length => 292,
count  => 11,
},
{
artist => 'Kahimi Karie',
album  => 'Nunki',
track  => 'He shoots the sun',
date   => '2006-11-11 01:51:00',
length => 165,
count  => 4,
},
);

Plagger::Plugin::Publish::HatelaboMusic

んでもって Plagger::Plugin::Publish::HatelaboMusic について。iTunes の曲情報を取得するプラグインはすでに存在するので(CustomFeed::iTunesRecentPlay)、それを使います。その際、title_format フィールドを %title と明示的に指定しておくほうがよいです。設定他、詳しくはそれぞれのプラグインの POD やソースをご覧ください。

  - module: CustomFeed::iTunesRecentPlay
config:
library_path: /path/to/iTunes Music Library.xml
duration:     120
title_format: %track # you'll prefer it in most case
- module: Publish::HatelaboMusic
config:
username: hatena_id
password: hatena_password

こんな感じで、Windows 以外の環境でも、はてなミュージックを楽しめるようになります。楽しみましょう。

はてなミュージック曲情報更新プロトコルについて

いろいろ調べてコードを書いたのですが、音ログ 開発日記 | はてなミュージックは AudioScrobbler 互換? 及びコメントによると、Audioscrobbler – The Music Technology Playground from Last.fm と互換のプロトコルとのこと!うおお。そうなるといろいろとアレしないとならなくなってきたなあああ。
というわけで仕様の詳細がわかったので、以下の記述はあんまり読む必要ないです(微妙に違うところがあったり、他の環境での実装の参考になる点はいくつかあるとは思いますが)。

まぁせっかくなので、上記のコードを書くにあたって調べたことを、他の環境でクライアントを作成したい方のために、まとめておきます。当然、API の非公式な使用ですので、今後の保証はまったくありません。

クライアント起動時

はてなミュージック更新クライアントは、起動時に http://music.hatelabo.jp/tools/HatenaMusic.rdf をリクエストします。その中身はこんな感じ。クライアント自体の更新があったときに、自動更新かなんかするためでしょう。

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<RDF:Description about="urn:hatenamusic">
<hatena:version>0.1</hatena:version>
<hatena:updateLink>http://music.hatelabo.jp/tools/HatenaMusicSetup.exe</hatena:updateLink>
</RDF:Description>
</RDF:RDF>
認証に用いるための MD5 ハッシュ文字列の取得

認証方法は、Digest 認証ぽい感じの方法を用いているようです。最初に、パスワードをダイジェストするのに使うための MD5 ハッシュ文字列を取得します。
まず http://music.hatelabo.jp/trackauth に対して、

hs
hand shake
p
protocol?
c
client?
u
user

こんな感じのよくわからないパラメタ付きでリクエストします。以下のような感じ。

http://music.hatelabo.jp/trackauth?hs=true&p=1.1&c=hatena&v=1.0&u=hatena_id

リクエスト成功時には以下のようなレスポンスが返されます。

UPTODATE
(MD5 ハッシュ)
http://music.hatelabo.jp/trackadd
INTERVAL 1

リクエスト失敗時には以下のようなレスポンスが返されます。
hs が true 以外

FAILED handshake is not requested. INTERVAL 1

u が指定されていない

BADUSER INTERVAL 1

p や c が指定されていない

FAILED prams are short. INTERVAL 1
セッションの確立、曲情報の送信

次に、上述の過程で取得した MD5 ハッシュ文字列を元に、セッションを確立します。セッションの確立に用いられる文字列の作成方法は、以下の通り(例の md5_hex は、Perl の Digest::MD5::md5_hex)。

s = md5_hex(md5_hex(password) + サーバから送られてきた MD5 ハッシュ文字列)

このようにして作成したセッション文字列を用いて、http://music.hatelabo.jp/trackadd に対して、以下のようなリクエストを送ります。

u=hatena_id&s=上記で作成したセッション文字列&a[0]=&b[0]=&t[0]=&i[0]=1970-01-01 00:00:00&l[0]=0&p[0]=1&r[0]=0&c[0]=0&f[0]=20

以下のようなレスポンスが返されたら、認証に成功したことがわかります。

OK
INTERVAL 1

認証が成功したら、上記と同様、http://music.hatelabo.jp/trackadd に対して、曲情報を送信します。パラメータは以下の通り

a (required)
artist の名前
b (required)
album の名前
t (required)
track の名前
i (required)
再生した時刻
l (required)
length (秒単位)
c
count(アルバムの何曲目か)
p
不明
r
不明
f
不明

また、それぞれのパラメタは配列のような形式をとっており、複数の曲情報を送信することができます。例としては、以下のようなパラメタになります。

u=hatena_id&s=上記で作成したセッション文字列&a[0]=℃-ute&b[0]=キューティークイーンVol.1&t[0]=YES! しあわせ&i[0]=2006-11-10 09:05:14&l[0]=275&p[0]=0&r[0]=0&c[0]=8&f[0]=0

リクエスト成功時には以下のようなレスポンスが返されます。

OK
INTERVAL 1

リクエスト失敗時には以下のようなレスポンスが返されます。

BADAUTH
INTERVAL 5
注意点

http://music.hatelabo.jp/trackadd にアクセスし、MD5 ハッシュ文字列を取得するたびに、セッション文字列を再構築しなければならないことに注意が必要です。例えば、自作プログラムではてなミュージックにアクセスしている間に、通常の iTunes プラグインや、ブラウザ等によって http://music.hatelabo.jp/trackadd にアクセスがあると、セッションが初期化されるので、セッションを再確立しなければなりません。詳細については、WebService::Hatelabo::Music の add_tracks() と retry() メソッドのあたりの実装をごらんください。

http 記法拡張テスト

はてなダイアリー日記 – 日記で簡単に動画を紹介できる http記法の拡張について」とのこと。
スペジェネ on YouTube
http://youtube.com/watch?v=4g-2zxbqfvA
スペジェネ on Google Video
http://video.google.com/videoplay?docid=-9219772437705180899
スペジェネ on Google Video の URL に “#1m20” をくっつけてみた(Google Video の新機能? [ SEOに疲れたら読むブログ ]あたり参照)。
http://video.google.com/videoplay?docid=-9219772437705180899#1m20
外部からの swf 貼り付け時のビデオ開始時間指定はやっぱだめぽ。これははてなではなく、Google Video 側の仕様のせいだけど。

Askビデオさん、動画デジカメ欲しい!

Askビデオさん、動画デジカメ欲しい!

livedoor Reader + YouTube + はてなブックマークで最速動画ウォッチング

YouTube のタグによる検索結果の feed アイコンを表示する Greasemonkey スクリプト」で述べた通り、YouTube の検索結果による feed を利用できることがわかったので、早速 livedoor Reader に登録してみました。それはそれでまぁいいんだけど、「これはよさげ?」という動画をいちいちタブを開いて観るのめんどくさい!feed のチェックから視聴、はたまた気に入った動画のブックマークまでの全てを、LDR 内で完結させたい!!!という思いがむくむくと湧き起こってきました。
というわけで、上記要求を満たすのに必要なもののうち、欠けていた LDR 内で YouTube の動画を観られるようにする greasemonkey スクリプトを書いた(詳細は後述)ので、なかなか快適な YouTube ヲチ生活を送れそうです。百聞は一見に如かずというわけで、とりあえずデモンストレーション動画をご覧ください。
YouTube – Mashup livedoor Reader, YouTube and Hatena::Bookmark
http://ktr.s101.xrea.com/pg6mxOCCxnM.flv
つか、初めて YouTube に動画をうpってみたのですが、画質が激しく劣化するんですな。。。↑のプレイヤじゃぁ小さ過ぎて、なにをやってるのかよくわかんないかも。詳しくは、リンク先の YouTube にてご覧ください(それでもなんかばっちい画質になっちゃってるけど……)。
見ればおおむねわかると思うけど、デモ動画の流れを順を追って説明します。

  1. YouTube で「中川翔子」を検索
  2. 中川翔子の検索結果が表示される
  3. 検索語入力欄の左に feed アイコンが表示されているのが確認できる
  4. feed をブラウザで表示、ブックマークレットにより、その feed を LDR に登録
  5. LDR に画面が遷移
  6. とりあえずデモなので、上で登録した feed だけ表示されるように、条件絞り込み欄に「中川翔子」と入力
  7. YouTube :: Tag // 中川翔子」が表示される
  8. ショートカット “y” キー押下により、ブーンをやっている映像がその場で YouTube のプレイヤーにより表示される
  9. ブーン閉じる
  10. 次のエントリへ移動
  11. 「Brilliant Dream PV (試聴バージョン)」を開く
  12. 気に入ったので、動画を観ながらショートカット “b” キーを押下し、はてなブックマークにぶくまする
  13. PV 閉じる
  14. 終了

ここでは YouTube の feed を見ている時にその場で動画を観るデモを見せましたが、エントリの URL が YouTube のものでありさえすればいいので、たとえばはてなブックマーク等でブックマークした YouTube 動画等も観ることができます。
なんか緊張してとちったりしてるところがあって、いまいち速い感じを演出できなかったのですが、まぁなかなか快適です。LDR 内で feed をチェックしながら YouTube のプレイヤを表示、動画を観られるようにする greasemonkey スクリプトは以下からインストールできます。使い方は、フォーカスされているエントリが YouTube の動画である時に、ショートカット “y” キーを押すだけです。どうぞご利用ください。

追記。
このスクリプトは「antipop – Update: LDR で最速動画ウォッチング + YouTube Anywhere」で更新されています。そちらのエントリも合せてご覧ください。

インストール: ldr_youtube_player.user.js

// ==UserScript==
// @name          YouTube Player on LDR
// @namespace     http://antipop.gs/ns/greasemonkey/ldr_youtube_player
// @include       http://reader.livedoor.com/reader*
// ==/UserScript==
(function(){
var w       = unsafeWindow;
var _onload = w.onload;
var onload  = function(){
with (w) {
var playerId = 'GM_youtube_player';
Keybind.add('y', function () {
if ($('overlay')) {
hidePlayer();
}
else {
showPlayer();
}
});
function showPlayer () {
var item = get_active_item(true);
if (item) {
var regexp = new RegExp('^http://(?:www\\.)?youtube\\.com/(?:watch)?\\?.*v=([^&]+).*$', 'i');
if (item.link.match(regexp)) {
var overlay = $N("div", {id : 'overlay'});
var player  = createPlayer(RegExp.$1);
[overlay, player].forEach(function(e){document.body.appendChild(e)});
centering(player.id, 0, 50);
}
}
}
function hidePlayer () {
[playerId, 'overlay'].forEach(function(id){DOM.remove(id);});
}
function createPlayer (videoId) {
var videoSrc = ['http://www.youtube.com/v/', videoId].join('');
var object = $N('object', {
id     : playerId,
width  : 425,
height : 350,
style  : {position : 'absolute'}
});
var param  = $N('param',  {
name   : 'movie',
value  : videoSrc
});
var embed  = $N('embed',  {
width  : 425,
height : 350,
type   : 'application/x-shockwave-flash',
src    : videoSrc
});
[param, embed].forEach(function(e){object.appendChild(e);});
return object;
}
}
};
w.onload = function(){
_onload();
onload();
};
})();

http 記法により YouTube の動画をはてなダイアリーに貼りつける方法

以下のような記法を使って、URLのあとに:movieとつけるだけです。

[http://www.youtube.com/watch?v=YrtQjBT3PXg:movie]

http 記法の拡張について、あるいは、Plagger::Plugin::Publish::HatenaScreenShot のデモ

http 記法拡張によりスクリーンショットを貼れるようになったというわけで、満を持して Plagger::Plugin::Publish::HatenaScreenShot のデモをご覧いただきたいと存じます。
screenshot
screenshot
screenshot
screenshot
screenshot
※ この物語はフィクションです。

© 2020 栗林健太郎

Theme by Anders NorénUp ↑