読者です 読者をやめる 読者になる 読者になる

yaotti's diary

QiitaやKobito、Qiita:Teamを作っています。Software is Eating the World

はてダラ+simple-hatena-modeで複数ブログ投稿&Twitter通知する

hatena

hw.plとsimple-hatena-mode.elに以下のパッチを当てれば複数ブログ(ACCOUNT+NAMEというidとして作る)とTwitter通知ができます.Twitter通知のprefixは設定しなければ毎回聞いてきます.ディレクトリ構造とかは適宜読み替えて当ててください.

あとsimple-hatena-modeで編集するファイルがUTF-8じゃない場合はhw.plのUTF-8決め打ちの部分を変えてみてください(twitter通知のprefixがeuc-jpじゃないと文字化けする…)

バグってたのでhw.pl修正
追記
一応patchの当て方を.

  1. 以下のデータをコピーして,適当なファイル名でsimple-hatena-mode.elのあるディレクトリに保存する(例えばshm.patch)
  2. patch -p2 < shm.patch を実行

hw.plのほうはp2じゃなくてp1で実行するといいはず.

さらに追記
hw.plはgithubで管理されていたのでforkしてcommitしました.yaotti/hatena-diary-writer · GitHub
simple-hatena-mode.elの更新は 404 · GitHubを見てください.

simple-hatena-mode.el

diff --git a/hatena/simple-hatena-mode.el b/hatena/simple-hatena-mode.el
index 03423cf..4768043 100644
--- a/hatena/simple-hatena-mode.el
+++ b/hatena/simple-hatena-mode.el
@@ -133,6 +133,14 @@ simple-hatena-toggle-debug-modeを実行する。"
   :type 'boolean
   :group 'simple-hatena)
 
+(defcustom simple-hatena-option-notify-to-twitter nil
+  "*ダイアリーに投稿した記事をTwitterに通知する時に付けるprefix。nilならtwitterに通知しない。
+
+実行時に、-wオプションとして使われる。"
+  :type 'string
+  :group 'simple-hatena)
+
+
 (defcustom simple-hatena-process-buffer-name "*SimpleHatena*"
   "*はてダラを実行するプロセスのバッファ名。"
   :type 'string
@@ -228,8 +236,9 @@ simple-hatena-toggle-debug-modeを実行する。"
 ;; > 大文字あるいは小文字のアルファベット・0-9の数字・「-」・「_」(いずれも
 ;; 半角)のいずれかを3-32文字並べたもの(ただし最初の文字はアルファベットで
 ;; あること)から成る。
+;; 10/05/27 複数ブログのために+を許容
 (defconst simple-hatena-id-regex
-  "^[A-z][\-_A-z0-9]+[A-z0-9]$"
+  "^[A-z][\-_A-z0-9]+[A-z0-9]\\(\\+[\-_A-z0-9]+\\)?$"
   "")
 
 ;; はてなグループ名の正規表現
@@ -705,9 +714,15 @@ dirが存在しない場合は`simple-hatena-setup'を呼ぶ。"
 
 (defun simple-hatena-internal-build-command (flag)
   "実行可能なコマンド文字列を作成する。"
-  (let ((flag-list (list flag)))
+  (let ((flag-list (list flag))
+        (twitter-prefix-onetime nil))
     (if simple-hatena-option-debug-flag  (setq flag-list (cons "-d" flag-list)))
     (if simple-hatena-option-cookie-flag (setq flag-list (cons "-c" flag-list)))
+    (if (or (setq twitter-prefix-onetime simple-hatena-option-notify-to-twitter)
+            (and (setq twitter-prefix-onetime
+                       (read-string "Twitter notification prefix (sth or \"n\"): "))
+                 (not (string= "n" twitter-prefix-onetime))))
+        (setq flag-list (cons (format "-w %s" twitter-prefix-onetime) flag-list)))
     (simple-hatena-internal-join
      " "
      (cons simple-hatena-bin

hw.pl

diff --git a/hw.pl b/hw.pl
index 67cba6e..5716738 100755
--- a/hw.pl
+++ b/hw.pl
@@ -66,6 +66,10 @@ my $filter_command = '';
 # Proxy setting.
 my $http_proxy = '';
 
+# Notification prefix to Twitter.
+my $twitter_notification_prefix = undef;
+
+
 # Directory for "YYYY-MM-DD.txt".
 my $txt_dir = ".";
 
@@ -112,10 +116,11 @@ my %cmd_opt = (
     'M' => 0,   # "no timestamp" flag.
     'n' => "",  # "config file" option.
     'S' => 1,   # "SSL" option. This is always 1. Set 0 to login older hatena server.
+    'w' => undef,   # Twitter notification prefix
 );
 
 $Getopt::Std::STANDARD_HELP_VERSION = 1;
-getopts("tdu:p:a:T:cg:f:Mn:", \%cmd_opt) or error_exit("Unknown option.");
+getopts("tdu:p:a:T:cg:f:Mn:w:", \%cmd_opt) or error_exit("Unknown option.");
 
 if ($cmd_opt{d}) {
     print_debug("Debug flag on.");
@@ -133,6 +138,8 @@ load_config() if -e($config_file);
 # Override global vars with command-line options.
 $username = $cmd_opt{u} if $cmd_opt{u};
 $password = $cmd_opt{p} if $cmd_opt{p};
+$twitter_notification_prefix = $cmd_opt{w} if defined $cmd_opt{w};
+warn 'twitter prefix: ' . $twitter_notification_prefix;
 $groupname = $cmd_opt{g} if $cmd_opt{g};
 $ua_option{agent} = $cmd_opt{a} if $cmd_opt{a};
 $ua_option{timeout} = $cmd_opt{T} if $cmd_opt{T};
@@ -262,7 +269,7 @@ sub login() {
     }
 
     my %form;
-    $form{name} = $username;
+    $form{name} = (split /\+/, $username)[0];
     $form{password} = $password;
 
     my $r; # Response.
@@ -331,7 +338,7 @@ sub logout() {
     }
 
     my %form;
-    $form{name} = $username;
+    $form{name} = (split /\+/, $username)[0];
     $form{password} = $password;
 
     print_message("Logout from $hatena_url as $form{name}.");
@@ -488,7 +494,11 @@ sub post_it($$$$$$) {
     print_debug("post_it: $year-$month-$day.");
 
     $user_agent->cookie_jar($cookie_jar);
-
+    # XXX: twitter prefix must be EUC-JP...
+    if ($enable_encode && $twitter_notification_prefix) {
+        $client_encoding ||= 'UTF-8';
+        Encode::from_to($twitter_notification_prefix, $client_encoding, 'EUC-JP');
+    }
     my $r = $user_agent->simple_request(
         HTTP::Request::Common::POST("$hatena_url/$username/edit",
             Content_Type => 'form-data',
@@ -501,6 +511,8 @@ sub post_it($$$$$$) {
                 title => $title,
                 trivial => $cmd_opt{t},
                 rkm => $rkm,
+                twitter_notification_enabled => defined $twitter_notification_prefix,
+                twitter_notification_prefix => $twitter_notification_prefix,
 
                 # Important:
                 # This entry must already exist.
@@ -696,7 +708,7 @@ sub load_config() {
             # skip comment.
         } elsif (/^$/) {
             # skip blank line.
-        } elsif (/^id:([^:]+)$/) {
+        } elsif (/^id:([^:+]+)$/) {
             $username = $1;
             print_debug("load_config: id:$username");
         } elsif (/^g:([^:]+)$/) {