Hatena::Groupnadesiko

そっとなでしこ RSSフィード


メインのブログに書くまでもない、なでしこ学習帳【記事一覧】 【このブログは何?】


特設!→【目次】なでしこ用Twitter 連携ライブラリ「なこったー」で遊ぶ


2010-06-27

twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト

| twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト - そっとなでしこ を含むブックマーク はてなブックマーク - twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト - そっとなでしこ

 とりあえず、当初の目標であるtwitter、はてなハイク、はてなブックマークという3つのつぶやきサービスからつぶやきを引用するHTMLを生成するスクリプトが形になりました(やっぱり色々不具合が残っている悪寒がしますが…)。

■使い方

 スクリプトを起動すると表示されるメモ欄に、引用したいtwitterや、はてなハイクのステータスURLを改行区切りで入力して「決定」ボタンを押します。

 例えば、以下のURLを入力すると、

http://twitter.com/mametanuki/status/16340857818

http://h.hatena.ne.jp/mame-tanuki/9236538674340364601

http://b.hatena.ne.jp/mame-tanuki/20100529#bookmark-21909447

下のような表示をするHTML文が出力されます。

  


mametanuki

はてなのサービスが盛大に落ちまくってる。メンテナンスの犬画面すら出ず、「Internal Server Error」になるのは久々に見た http://i.hatena.ne.jp/idea/27496
(2010/06/17 07:41:35)

link


mame-tanuki

三文字

(2007/12/21 21:29:44)

link


mame-tanuki

/
サンプル→b:id:entry:21909451
(2010/05/29 )

link

■ソースコード

#-----------------------------------------------------------------------
# 出力HTMLテンプレート
#-----------------------------------------------------------------------
テンプレートヘッダーは「<table border="1" bgcolor="#FFFFFF">」。
テンプレートは「<tr>
<td width="32" height="32">
★ファビコン★<img src="★ユーザーアイコン★" width="32" height="32">
</td>
<td><a href="★サービスURL★★id★">★id★</a></td>
<td>
★コメント★
</td>
<td><a href="★つぶやきURL★">link</a></td>
</tr>」。
#-----------------------------------------------------------------------
# メイン処理
#-----------------------------------------------------------------------

「」をメモ記入して、取得URLSに代入。

もし取得URLSが「」でないならば
  出力HTMLは「」。
  取得URLSを反復
    取得URLはそれ。
    取得URLをつぶやき仕分けして、つぶやきに代入。
    もし、つぶやき→サービス名が「対象外サービス」でないならば
      つぶやきをつぶやき整形出力。
      出力HTMLは、「{出力HTML}{それ}{改行}」。
    ここまで。
  ここまで
  出力HTMLは、「{テンプレートヘッダー}
  {出力HTML}</table>」
  出力HTMLをメモ記入。
ここまで
母艦を閉じる。

出力TXTをメモ記入。
#-----------------------------------------------------------------------
# グループ定義
#-----------------------------------------------------------------------
■対象外サービスとは
  ・サービス名
  ・URL
  ・作る~
    サービス名は「対象外サービス」
#-----------------------------------------------------------------------
■ツイッターとは
  ・{非公開}FURL
  ・サービス名
  ・サービスURL
  ・ファビコン
  ・ユーザーID
  ・ユーザーアイコン
  ・ステータスID
  ・データ文字列
  ・リプライ
  ・タグ
  ・コメント
  ・タイムスタンプ

  ・URL取得~それはFURL
  ・URL設定(V)~
    FURL=V。
    自身→初期設定。
  ・初期設定~
    自身→ステータスID設定。
    自身→データ文字列設定。
    自身→ユーザーID設定。
    自身→ユーザーアイコン設定。
    自身→コメント設定。
    自身→タイムスタンプ設定。
  ・ステータスID設定~
    自身→URLからURLファイル名抽出して、自身→ステータスIDに代入。
  ・作る~
    サービス名=「twitter」。
    ファビコン=「http://a1.twimg.com/a/1276896641/images/favicon.ico」。
    サービスURL=「http://twitter.com/」。
    APIURL=「http://twitter.com/statuses/show/」
  ・ユーザーID設定~
    自身→データ文字列から「user/screen_name」を階層タグ切り出してタグ削除。
    それを自身→ユーザーIDに代入。
  ・ユーザーアイコン設定~
    自身→データ文字列から「user/profile_image_url」を階層タグ切り出してタグ削除。
    それ[0]を自身→ユーザーアイコンに代入。
  ・復号処理~システム:HTMLエンティティ復号
  ・リプライ抽出(抽出対象)~
    自身→リプライは、抽出対象から「replies」をタグ切り出し。
    抽出対象の「{自身→リプライ}」を「」に置換。
    それで戻る。
  ・データ文字列設定~
    問合せURL=「{APIURL}{ステータスID}.xml」
    問合せURLからHTTPデータ取得して自身→復号処理。
    リプライ抽出(それ)。
    それを自身→データ文字列に代入。
  ・タグ抽出処理(抽出対象)~
    #ハッシュタグ抽出機能を実装予定
    抽出対象で戻る。
  ・特殊記法置換(置換対象)~
    置換対象の「@([a-zA-Z0-9_-]+)」を「<a href="{サービスURL}$1">@$1</a>」へ正規表現置換。
    それで戻る。
  ・コメント設定~
    自身→データ文字列から「status/text」を階層タグ切り出してタグ削除。
    自身→タグ抽出処理(それ)。
    自身→特殊記法置換(それ)。
    #IDコール抑止
    それの「id:([a-zA-Z][a-zA-Z0-9_-]{波カッコ}1,30{波カッコ閉じ}[a-zA-Z0-9])」を「<a href="http://b.hatena.ne.jp/$1">id:$1</a>」へ正規表現置換。
    それを自身→コメントに代入。
  ・地域標準時変換(UTC日付、UTC時刻、加減算演算子、加減算時間)~
    加減算日数は0。
    地域標準時刻は、UTC時刻に「{加減算演算子}{加減算時間}」を時間加算。
    UTC時刻を「:」で区切り、UTC時刻配列に代入。
    加減算時間を「:」で区切り、加減算時間配列に代入。
    もし、加減算演算子が「+」ならば
      秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))+
      ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
      もし、秒換算が(24×60×60)以上ならば
        加減算日数は1。
    違えば
      秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))-
      ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
      もし、秒換算が0未満ならば
        加減算日数は1。
    地域標準日時は、UTC日付に「{加減算演算子}0/0/{加減算日数}」を日付加算。
    「{地域標準日時} {地域標準時刻}」で戻る。
  ・タイムスタンプ設定~
    英語月@「Jan」=「01」
    英語月@「Feb」=「02」
    英語月@「Mar」=「03」
    英語月@「Apr」=「04」
    英語月@「May」=「05」
    英語月@「Jun」=「06」
    英語月@「Jul」=「07」
    英語月@「Aug」=「08」
    英語月@「Sep」=「09」
    英語月@「Oct」=「10」
    英語月@「Nov」=「11」
    英語月@「Dec」=「12」
    自身→データ文字列から「status/created_at」を階層タグ切り出してタグ削除。
    取得日時はそれ[0]を「 」で区切る。
    英語月@「{取得日時[1]}」を取得月に代入する。
    取得JST日付は「{取得日時[5]}/{取得月}/{取得日時[2]}」。
    自身→地域標準時変換(取得JST日付、取得日時[3]、「+」、「09:00:00」)。
    それをタイムスタンプに代入。

  ・URL  ←URL設定  →URL取得

#-----------------------------------------------------------------------
■Hatenaハイクとは +ツイッター
  ・作る~
    サービス名は「はてなハイク」
    ファビコン=「http://favicon.hatena.ne.jp/?url=http://h.hatena.ne.jp/」。
    サービスURL=「http://h.hatena.ne.jp/」。
    APIURL=「http://h.hatena.ne.jp/api/statuses/show/」
  ・復号処理~システム:SJIS変換
  ・タグ抽出処理(抽出対象)~
    抽出対象を「^.*=」で正規表現マッチ。
    それの「=」を「」に置換してタグTXTに代入。
    「<a href="http://h.hatena.ne.jp/{タグTXTをURLエンコード}">{タグTXT}</a>」を自身→タグに代入。
    抽出対象の「^.*=」を「」へ正規表現置換。
    それで戻る。
  ・特殊記法置換(置換対象)~ 
    正規表現修飾子バックアップは正規表現修飾子。
    正規表現修飾子は正規表現修飾子&「i」。
    置換対象の「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換。
    正規表現修飾子は正規表現修飾子バックアップ。
    それで戻る。
  ・タイムスタンプ設定~
    自身→データ文字列から「status/created_at」を階層タグ切り出してタグ削除。
    タイムスタンプ配列は、それ[0]を「T」で区切る。
    取得JST日付は、タイムスタンプ配列[0]の「-」を「/」に置換。
    取得JST時刻は、タイムスタンプ配列[1]の「Z」を「」に置換。
    「取得JST日付{取得JST日付}取得JST時刻{取得JST時刻}」を表示。
    自身→地域標準時変換(取得JST日付、取得JST時刻、「+」、「09:00:00」)。
    それをタイムスタンプに代入。

#-----------------------------------------------------------------------
■Hatenaブックマークとは +ツイッター
  ・作る~
    サービス名は「はてなブックマーク」
    ファビコン=「http://favicon.hatena.ne.jp/?url=http://b.hatena.ne.jp/」。
    サービスURL=「http://b.hatena.ne.jp/」。
  ・初期設定~
    自身→ステータスID設定。
    自身→ユーザーID設定。 #はてブ独特
    自身→データ文字列設定。
    自身→ユーザーアイコン設定。
    自身→コメント設定。
    自身→タグ抽出処理。
    自身→タイムスタンプ設定。
  ・ステータスID設定~
    自身→URLを「#bookmark-(\d+)」で正規表現マッチ。
    自身→ステータスIDは抽出文字列[0]。
  ・ユーザーID設定~
    自身→URLからURL基本パス抽出。
    それの「{自身→URLからURLドメイン名抽出}」を「」に置換。
    それの「/」を「」に置換。
    それの「http:」を「」に置換。
    自身→ユーザーIDは、それ。
  ・ユーザーアイコン設定~
    id頭2桁は、自身→ユーザーIDから2文字左部分。
    自身→ユーザーアイコンは、「http://www.st-hatena.com/users/{id頭2桁}/{自身→ユーザーID}/profile.gif」
  ・復号処理~システム:SJIS変換
  ・データ文字列設定~
    検索文字列は、自身→URLからHTTPデータ取得して自身→復号処理。
    正規表現命令文は「<a class="username" href="/{自身→ユーザーID}/{自身→URLからURLファイル名抽出}">.*[\r\n]+(.*[\r\n]+){波カッコ}1,4{波カッコ閉じ}」。
    検索文字列を正規表現命令文で正規表現マッチ。
    自身→データ文字列は、それ。
  ・タグ抽出処理~
    自身→データ文字列を「<span class="tags">.*」で正規表現マッチ。
    それから「span/a」の階層タグ切り出す。
    それの「href="」を「href="http://b.hatena.ne.jp」に置換。
    それの「{改行}」を「/」に置換。
    自身→タグは、それ。
  ・特殊記法置換(置換対象)~
    それの「((b:)*?)id:entry:([0-9]+)」を「<a href="http://b.hatena.ne.jp/entry/$3">$2id:entry:$3</a>」へ正規表現置換。
    それで戻る。
  ・コメント設定~
    自身→データ文字列を「<span class="comment">.*」で正規表現マッチしてタグ削除。
    自身→特殊記法置換(それ)。
    #IDコール抑止
    それの「id:([a-zA-Z][a-zA-Z0-9_-]{波カッコ}1,30{波カッコ閉じ}[a-zA-Z0-9])」を「<a href="http://b.hatena.ne.jp/$1">id:$1</a>」へ正規表現置換。
    自身→コメントは、それ。
  ・タイムスタンプ設定~
    自身→データ文字列を「<span class="timestamp">.*」で正規表現マッチしてタグ削除。
    自身→タイムスタンプは、それ。

#-----------------------------------------------------------------------
# 関数定義
#-----------------------------------------------------------------------
●つぶやき仕分け(URLを)
  URLからURLドメイン名抽出して、取得ドメインに代入。
  取得ドメインで条件分岐
    「twitter.com」ならば
      生成グループをツイッターとして作成。
    「h.hatena.ne.jp」ならば
      生成グループをHatenaハイクとして作成。
    「b.hatena.ne.jp」ならば
      生成グループをHatenaブックマークとして作成。
    違えば
      生成グループを対象外サービスとして作成。
  ここまで
  生成グループ→URLはURL。
  生成グループで戻る。

●つぶやき整形出力({グループ}対象グループを)
  ファビコンリンク=「<a href="{対象グループ→サービスURL}">
<img src="{対象グループ→ファビコン}">
</a><br>」。
  ファビコンリンクは、ファビコンリンクの「{改行}」を「」に置換。
  
  タグリンク=「」。
  もし対象グループ→タグが「」でないならば
    タグリンク=「<span style="font-style:italic;">{対象グループ→タグ}</span><br>」。
  出力TXTは、テンプレートの「★id★」を「{対象グループ→ユーザーID}」に置換。
  出力TXTは、出力TXTの「★ファビコン★」をファビコンリンクに置換。

  出力TXTは、出力TXTの「★ユーザーアイコン★」を「{対象グループ→ユーザーアイコン}」に置換。
  コメント=「{タグリンク}{対象グループ→コメント}<br>({対象グループ→タイムスタンプ})」。
  出力TXTは、出力TXTの「★コメント★」をコメントに置換。
  出力TXTは、出力TXTの「★つぶやきURL★」を「{対象グループ→URL}」に置換。
  出力TXTは、出力TXTの「★サービスURL★」を「{対象グループ→サービスURL}」に置換。
  出力TXTで戻る。

■ちょっとコメント

 ツールを書いてみて実感したけれど、twitterAPI互換な はてなハイクAPIは、もっと評価されても良い気がする。

 と言うか、いっそのこと、はてなブックマークAPIも、twitterAPI互換なヤツを作っちゃいなよ、長いものには巻かれちまえよ、はてな!とか思ったりw

 …ということで、上記ソースで「Hatenaブックマーク」グループの定義でやや強引に「twitter」グループをミックスしているのは、まぁ、そういう願いを込めてです。

■現在分かっている問題点

 基本的に自分が使う個人ツールとして書いたので、自分が使わない機能や許容できる問題点については投げっぱなし感が…

  • エラー処理系
    • 入力されたステータスURLのチェック
    • twitterのサービスが過負荷で、クジラの絵の「Over capacity」画面が表示された場合に、なでしこの実行エラーに
      • たぶん、はてなハイク/ブックマークが犬絵の「メンテナンス中」画面が表示された場合も、恐らく実行エラーに
  • 一部はてな記法がHTML化できていない
    • URL(http:~)のリンク化(←自分が、はてなダイアリーに貼り付ける使い方なので必要性を感じなかった)
    • 商品(asin:~)のリンク化(←同上)
    • YouTube/ニコニコ動画のプレイヤー表示
  • 一部twitter記法がHTML化できていない
    • ハッシュタグのリンク化


【関連記事】これまでの道のり