<?xml version="1.0" encoding="UTF-8" ?>
<entry
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
	xml:lang="ja-JP"
>
	<title>はてブのAtomAPIからまとめてブクマ</title>
	<id>tag:txqz.net,2008-06-06:blog/2008/06/06/1554</id>
	<link rel="self" href="http://txqz.net/blog/2008/06/06/1554.atom"/>
	<link rel="alternate" type="application/rss+xml" href="http://txqz.net/blog/2008/06/06/1554.rdf"/>
	<link rel="alternate" type="application/xhtml+xml" href="http://txqz.net/blog/2008/06/06/1554.xhtml"/>
	<link rel="alternate" type="text/html" href="http://txqz.net/blog/2008/06/06/1554.html"/>
	<link rel="contents" href="http://txqz.net/blog/2008/06/06/.atom" title="2008年6月6日"/>
	<link rel="first" href="http://txqz.net/blog/2001/08/04/0001.atom" title="地球空冷化"/>
	<link rel="prev" href="http://txqz.net/blog/2008/06/06/1033.atom" title="一文字.laドメイン更新凍結でべっかんこ移転"/>
	<link rel="next" href="http://txqz.net/blog/2008/06/09/2105.atom" title="ホムペ作ったー＼(^o^)／"/>
	<link rel="last" href="http://txqz.net/blog/2008/12/19/2152.atom" title="浜松市街地を通り抜けて、ムーンライトながら～の思い出"/>
	<author>
		<name>陽坂智佐</name>
		<email>spambasket@txqz.net</email>
	</author>
	<content type="xhtml">
		<div xmlns="http://www.w3.org/1999/xhtml">
<p>はてブはたまにどうしようもなく重いときがあり、タブが30とかあるのにこれ全部ブクマするまでどれだけ待たせるのか不明だし何か手元のOperaだとJavaScriptが重くてそもそもコメントがかけるようになるまで30秒くらい待ち続ける必要があったりしたので<a href="http://txqz.net/blog/2006/02/02/1125" title="はてなブックマークAtomAPIだのWSSEだの">2006年に書いたやつ</a>のJava版を作った。</p>
<pre><code class="java">package net.txqz.client;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;

public class HatebClient {
  private HttpClient client;
  private String user;
  private String pass;
  
  public HatebClient(String user, String pass) {
    client = new HttpClient();
    this.user = user;
    this.pass = pass;
  }
  
  public void post(String fileName) throws IOException {
    String format = "&lt;entry xmlns=\"http://purl.org/atom/ns#\"&gt;&lt;title&gt;dummy&lt;/title&gt;&lt;link rel=\"related\" type=\"text/html\" href=\"%s\" /&gt;&lt;summary type=\"text/plain\"&gt;%s&lt;/summary&gt;&lt;/entry&gt;\n";
    String url = "http://b.hatena.ne.jp/atom/post";
    String contentType = "application/x.atom+xml";
    String encode = "UTF-8";
    
    BufferedReader in = new BufferedReader(new FileReader(fileName));
    String line;
    while((line = in.readLine()) != null) {
      if(!line.startsWith("http")) continue;
      PostMethod post = new PostMethod(url);
      post.setRequestHeader("Content-Type", contentType);
      post.addRequestHeader("X-WSSE", getWsseHeaderValue(user, pass));
      Object[] args = line.split(" ", 2);
      String request = args.length == 2
                     ? String.format(format, args)
                     : String.format(format, args[0], " ");
      
      post.getParams().setContentCharset(encode);
      post.setRequestEntity(new StringRequestEntity(request, contentType, encode));
      int status = client.executeMethod(post);
      System.out.println(status);
    }
  }
  
  protected final String getWsseHeaderValue(String username, String password) {
    // 省略。<a href="http://yohei-y.blogspot.com/2005/04/java-atomapi.html" title="yohei-y:weblog: Java からはてなフォトライフAtomAPIを使う">Java からはてなフォトライフAtomAPIを使う</a> からコピペ。
  }

  public static void main(String[] args) {
    HatebClient client = new HatebClient("aidhi", "pasuwa-do");
    String file = "path/to/filename";
    try {
      client.post(file);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}</code></pre>
<p>どこかのファイルに</p>
<pre>http://example.com/bukuma_suru_URI [tag][tagu]comment
http://example.com/bukuma_subeki_URI [tag][tagu]komento</pre>
<p>みたいな感じに書いてスクリプトを実行させればおｋで、何をブクマしたかの情報がローカルにも残って一石二鳥ですね。</p>
		</div>
	</content>
	<category term="はてなブックマーク"/>
	<category term="AtomPP"/>
	<category term="API"/>
	<category term="Java"/>
	<trackback:ping>http://txqz.net/blog/2008/06/06/1554/tb</trackback:ping>
	<published>2008-06-11T12:40:25+09:00</published>
	<updated>2008-06-11T12:41:21+09:00</updated>
	<rights>Attribution-Noncommercial-Share Alike 3.0 Unported</rights>
</entry>