Hatena::ブログ(Diary)

winplusの日記 このページをアンテナに追加 RSSフィード

2010-05-31

はじめてのグリモン

あまぺたからデータをとってきてアマゾンのページに表示させたいので、はじめてGreasemonkeyのユーザスクリプトを書いた。


// ==UserScript==
// @name         amapeta
// @namespace    http://amapeta.appspot.com
// @description  amapeta on amazon.co.jp
// @include		 http://www.amazon.co.jp/*
// @include		 http://amazon.co.jp/*
// ==/UserScript==

var userid = xxxxxxx;
    
createAddPoint();
var url = 'http://amapeta.appspot.com/users/' + userid + '/stickies/' + getAsbn() + '/tags';
viewSticky(url);
	
//ASINを取得
function getAsbn() {
    uri = document.location.href;
    asin = uri.match(/\/[A-Za-z0-9]{10}/);
    asin = new String(asin);
   	asin = asin.substr( 1, 10);
    return asin;
}

//追加する場所を用意する
function createAddPoint() {
    var addpoint = document.getElementById('handleBuy');
    if (addpoint) {
    	newElement = document.createElement('div');
		newElement.innerHTML = '<hr />' + 
			'<span id="amapeta-index">あまぺた : </span>' +
			'<span id="amapeta-result">loding ...</span>' + 
			'<div id="amapeta-sticiky"></div>' + 
			'<div id="amapeta-input"></div>';
		addpoint.parentNode.insertBefore(newElement, addpoint.nextSibling);
	}
}

//Stickyを検索・表示する
function viewSticky(url) {
	GM_xmlhttpRequest({
		method:"GET", 
		url:url,
		headers:{"Accept":"application/json"},
		onload:function(x){
			tags = "";
			if (x.status == 404){
				printResult("Not Found");
			}
			if (x.status == 200){
				entry = eval("(" + x.responseText + ")");
				printResult("Found");
				tags = entry.tags;
				printSticky(tags);
			}
			printForm(url, tags);
		}
	});
}

//結果を表示する
function printResult(result) {
    addpoint = document.getElementById('amapeta-result');
    if (addpoint) {
    	newElement = document.createElement('span');
    	newElement.id = 'amapeta-result';
		newElement.innerHTML = result;
		addpoint.parentNode.replaceChild(newElement, addpoint);
	}
}

//Stickyを表示する
function printSticky(tags) {
    addpoint = document.getElementById('amapeta-sticiky');
    if (addpoint) {
    	newElement = document.createElement('div');
    	newElement.id = 'amapeta-sticiky';
		newElement.innerHTML = tags;
		addpoint.parentNode.replaceChild(newElement, addpoint);
	}
}

//登録欄を表示する
function printForm(url, tags) {
	inputForm = '<form method="POST" action="' + url + '?nocontent=true" accept-charset="UTF-8">' + 
		'<div><input type="text" name="tags" value="' + tags +'">' +
		'<input type="submit" value="peta !" onclick="false;"></div>' +
		'</form>';
    addpoint = document.getElementById('amapeta-input');
    if (addpoint) {
    	newElement = document.createElement('div');
    	newElement.id = 'amapeta-input';
		newElement.innerHTML = inputForm;
		addpoint.parentNode.replaceChild(newElement, addpoint);
	}
}

データ登録はrubyで

JAX-RSのおかげで、データの登録もrubyからXMLを投げるだけで済んだ。バックアップが不十分で最近のものは登録できていないのが残念。

# coding: utf-8

require 'net/http'
Net::HTTP.version_1_2

userid = 'xxxxxxxxxx'
data = '<sticky><tags>持ってる</tags></sticky>'

def putSticky(userid, asin, data)
    response = ''
    http = Net::HTTP.new('amapeta.appspot.com')
    request = Net::HTTP::Put.new("/users/#{userid}/stickies/#{asin}/tags")
    request['content-type'] = 'application/xml'
    request['accept'] = 'application/xml'
    request.basic_auth("xxxxxxxxxx", "xxxxxxxxxx")
    http.start do |http|
        response =  http.request(request, data)
    end
    p "#{asin}:#{response.code}"
end

File.open("download.csv") do |doc|
    doc.readlines.each do |line|
        asin = line.split(',')[0]
        case asin.length
        when 12
            putSticky(userid, asin[1..10], data) 
        when 10
            putSticky(userid, asin, data) 
        end
        sleep 1
    end
end