wildcatsの日記

赤羽在住でIT関係の会社の社長やってます。

JavaではてなブックマークAtomAPIでpostするサンプル

とりあえずこんな感じ。実際に使う場合は例外処理をもうちょっときっちりしないとダメだと思う。
dom4j+HttpClientを使ってます。
WSSEヘッダを作る部分はこちらのソースをそのままいただきました。


public class Main {

public static void main(String[] args) throws Exception {
HttpClient httpclient = new HttpClient();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLWriter writer = new XMLWriter(baos);
writer.write(createDocument());
writer.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
baos.close();
PostMethod post = new PostMethod("http://b.hatena.ne.jp/atom/post");
post.addRequestHeader("Accept", "application/xml");
post.addRequestHeader("X-WSSE", getWSSEHeader("******", "*****"));
post.addRequestHeader("User-Agent", "Sun Java/1.5");
RequestEntity entity = new InputStreamRequestEntity(bais,
"application/xml");
post.setRequestEntity(entity);
int executeMethod = httpclient.executeMethod(post);
System.out.println(executeMethod);
bais.close();
}

public static Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("entry");
root.addAttribute("xmlns", "http://purl.org/atom/ns#");
root.addElement("title").addText("dummy");
root.addElement("link").addAttribute("rel", "related").addAttribute(
"type", "text/html").addAttribute("href",
"http://www.example.com/");
root.addElement("summary").addAttribute("type", "text/plain").addText(
"はてなブックマークAtomAPI さんぷるだよん");
return document;
}

private static String getWSSEHeader(String username, String password)
throws Exception {

byte[] nonceB = generateNonce();
String nonce = base64Encode(nonceB);

String created = generateTimestamp();

String password64 = getBase64Digest(nonceB, created.getBytes("UTF-8"),
password.getBytes("UTF-8"));
StringBuffer header = new StringBuffer("UsernameToken Username=\"");
header.append(username);
header.append("\", ");
header.append("PasswordDigest=\"");
header.append(password64);
header.append("\", ");
header.append("Nonce=\"");
header.append(nonce);
header.append("\", ");
header.append("Created=\"");
header.append(created);
header.append("\"");
return header.toString();
}

private static byte[] generateNonce() {
String nonce = Long.toString(new Date().getTime());
return nonce.getBytes();
}

private static String generateTimestamp() {
SimpleDateFormat dateFormatter = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss'Z'");
return dateFormatter.format(new Date());
}

private static synchronized String getBase64Digest(byte[] nonce,
byte[] created, byte[] password) {
try {
MessageDigest messageDigester = MessageDigest.getInstance("SHA-1");
messageDigester.reset();
messageDigester.update(nonce);
messageDigester.update(created);
messageDigester.update(password);
return base64Encode(messageDigester.digest());
} catch (java.security.NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}

private static String base64Encode(byte[] bytes) {
return new sun.misc.BASE64Encoder().encode(bytes);
}
}