├── .rspec ├── Gemfile ├── lib ├── tumblife │ ├── version.rb │ ├── response.rb │ ├── response │ │ ├── parse_json.rb │ │ ├── raise_server_error.rb │ │ └── raise_client_error.rb │ ├── error.rb │ ├── client.rb │ ├── request.rb │ ├── connection.rb │ ├── configuration.rb │ └── client │ │ ├── user.rb │ │ ├── blog.rb │ │ └── post.rb └── tumblife.rb ├── .yardopts ├── spec ├── fixtures │ ├── follow.json │ ├── like.json │ ├── unlike.json │ ├── unfollow.json │ ├── post.json │ ├── draft.json │ ├── queue.json │ ├── submission.json │ ├── likes.json │ ├── avatar.json │ ├── followers.json │ ├── following.json │ ├── blog_info.json │ ├── info.json │ ├── mmtki.json │ ├── mitukiii.json │ ├── dashboard.json │ └── posts.json ├── spec_helper.rb ├── faraday │ └── response_spec.rb ├── tumblife │ ├── client_spec.rb │ └── client │ │ ├── user_spec.rb │ │ ├── blog_spec.rb │ │ └── post_spec.rb └── tumblife_spec.rb ├── .travis.yml ├── Rakefile ├── .gitignore ├── LICENSE.md ├── tumblife.gemspec └── README.md /.rspec: -------------------------------------------------------------------------------- 1 | --color 2 | --format progress 3 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gemspec 4 | -------------------------------------------------------------------------------- /lib/tumblife/version.rb: -------------------------------------------------------------------------------- 1 | module Tumblife 2 | VERSION = '2.1.0' 3 | end 4 | -------------------------------------------------------------------------------- /.yardopts: -------------------------------------------------------------------------------- 1 | --no-private 2 | --tag authentication:"Requires Authentication?" 3 | --markup markdown 4 | - 5 | LICENSE.md 6 | -------------------------------------------------------------------------------- /spec/fixtures/follow.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": [ 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /spec/fixtures/like.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": [ 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /spec/fixtures/unlike.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": [ 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /spec/fixtures/unfollow.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": [ 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /spec/fixtures/post.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "id": 23662209835 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /spec/fixtures/draft.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "posts": [ 8 | 9 | ] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /spec/fixtures/queue.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "posts": [ 8 | 9 | ] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /spec/fixtures/submission.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "posts": [ 8 | 9 | ] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 1.9.3 4 | - 2.0.0 5 | - 2.1.0 6 | notifications: 7 | webhooks: 8 | - https://idobata.io/hook/f7467f11-26df-4e55-9bf0-47f5275d0c76 9 | -------------------------------------------------------------------------------- /spec/fixtures/likes.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "liked_posts": [ 8 | 9 | ], 10 | "liked_count": 0 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /spec/fixtures/avatar.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "avatar_url": "http://25.media.tumblr.com/avatar_0ade4b983345_64.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler' 2 | Bundler::GemHelper.install_tasks 3 | 4 | require 'rspec/core/rake_task' 5 | RSpec::Core::RakeTask.new(:spec) 6 | 7 | task :default => :spec 8 | 9 | require 'yard' 10 | YARD::Rake::YardocTask.new 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.rbc 3 | .bundle 4 | .config 5 | .yardoc 6 | Gemfile.lock 7 | InstalledFiles 8 | _yardoc 9 | coverage 10 | doc/ 11 | lib/bundler/man 12 | pkg 13 | rdoc 14 | spec/reports 15 | test/tmp 16 | test/version_tmp 17 | tmp 18 | -------------------------------------------------------------------------------- /spec/fixtures/followers.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "total_blogs": 1, 8 | "blogs": [ 9 | { 10 | "name": "mitukiii", 11 | "url": "http://mitukiii.tumblr.com", 12 | "updated": 1337426369 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /spec/fixtures/following.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "total_blogs": 1, 8 | "blogs": [ 9 | { 10 | "name": "mitukiii", 11 | "url": "http://mitukiii.tumblr.com", 12 | "updated": 1337426369 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /spec/fixtures/blog_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "blog": { 8 | "title": "Blue Planet", 9 | "posts": 6505, 10 | "name": "mmtki", 11 | "url": "http://mmtki.tumblr.com/", 12 | "updated": 1337455819, 13 | "description": "", 14 | "ask": false 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/tumblife/response.rb: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | require 'tumblife/response/parse_json' 3 | require 'tumblife/response/raise_client_error' 4 | require 'tumblife/response/raise_server_error' 5 | 6 | Faraday.register_middleware :response, 7 | :json => lambda { Tumblife::Response::ParseJson }, 8 | :raise_client_error => lambda { Tumblife::Response::RaiseClientError }, 9 | :raise_server_error => lambda { Tumblife::Response::RaiseServerError } 10 | -------------------------------------------------------------------------------- /lib/tumblife/response/parse_json.rb: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | require 'multi_json' 3 | 4 | module Tumblife 5 | module Response 6 | class ParseJson < Faraday::Response::Middleware 7 | def on_complete(env) 8 | env[:body] = parse_body(env[:body]) 9 | end 10 | 11 | def parse_body(body) 12 | if body.nil? 13 | nil 14 | else 15 | MultiJson.load(body) 16 | end 17 | end 18 | end 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /lib/tumblife/error.rb: -------------------------------------------------------------------------------- 1 | module Tumblife 2 | # Custom error class for rescuing from all Tumblr errors 3 | class Error < StandardError 4 | end 5 | 6 | # Raised when Tumblr returns the HTTP status code 4xx 7 | class BadRequest < Error 8 | end 9 | 10 | # Raised when Tumblr returns the HTTP status code 401 11 | class NotAuthorized < Error 12 | end 13 | 14 | # Raised when Tumblr returns the HTTP status code 404 15 | class NotFound < Error 16 | end 17 | 18 | # Raised when Tumblr returns the HTTP status code 5xx 19 | class InternalServerError < Error 20 | end 21 | 22 | # Raised when Tumblr returns the HTTP status code 503 23 | class ServiceUnavailable < Error 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /lib/tumblife/client.rb: -------------------------------------------------------------------------------- 1 | require 'tumblife/connection' 2 | require 'tumblife/request' 3 | require 'tumblife/client/blog' 4 | require 'tumblife/client/post' 5 | require 'tumblife/client/user' 6 | 7 | module Tumblife 8 | # Wrapper for the Tumblr REST API 9 | class Client 10 | include Connection 11 | include Request 12 | include Blog 13 | include Post 14 | include User 15 | 16 | # @private 17 | attr_accessor *Configuration::VALID_OPTIONS_KEYS 18 | 19 | # Creates a new API 20 | def initialize(options = {}) 21 | options = Tumblife.options.merge(options) 22 | Configuration::VALID_OPTIONS_KEYS.each do |key| 23 | send("#{key}=", options[key]) 24 | end 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /lib/tumblife.rb: -------------------------------------------------------------------------------- 1 | require 'tumblife/version' 2 | require 'tumblife/error' 3 | require 'tumblife/configuration' 4 | require 'tumblife/client' 5 | 6 | module Tumblife 7 | extend Configuration 8 | 9 | # Alias for Tumblife::Client.new 10 | # 11 | # @return [Tumblife::Client] 12 | def self.client(options = {}) 13 | Tumblife::Client.new(options) 14 | end 15 | 16 | # Delegate to {Tumblife::Client} 17 | def self.method_missing(method_name, *args, &block) 18 | return super unless client.respond_to?(method_name) 19 | client.send(method_name, *args, &block) 20 | end 21 | 22 | # Delegate to {Tumblife::Client} 23 | def self.respond_to?(method_name, include_private = false) 24 | return client.respond_to?(method_name, include_private) || super 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /lib/tumblife/request.rb: -------------------------------------------------------------------------------- 1 | module Tumblife 2 | module Request 3 | # Perform an HTTP GET request 4 | def get(path, params = {}) 5 | request(:get, path, params) 6 | end 7 | 8 | # Perform an HTTP POST request 9 | def post(path, params = {}) 10 | request(:post, path, params) 11 | end 12 | 13 | # Perform an HTTP request 14 | def request(http_method, path, params = {}) 15 | response = connection.send(http_method) do |request| 16 | case http_method 17 | when :get, :delete 18 | request.url(path, params) 19 | when :post, :put 20 | request.path = path 21 | request.body = params unless params.empty? 22 | end 23 | end 24 | 25 | response.body['response'] 26 | end 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | unless ENV['CI'] 2 | require 'simplecov' 3 | SimpleCov.start do 4 | add_filter 'spec' 5 | end 6 | end 7 | 8 | require 'tumblife' 9 | require 'rspec' 10 | require 'webmock/rspec' 11 | 12 | def a_get(path, endpoint = Tumblife.endpoint) 13 | a_request(:get, endpoint + path) 14 | end 15 | 16 | def a_post(path, endpoint = Tumblife.endpoint) 17 | a_request(:post, endpoint + path) 18 | end 19 | 20 | def stub_get(path, endpoint = Tumblife.endpoint) 21 | stub_request(:get, endpoint + path) 22 | end 23 | 24 | def stub_post(path, endpoint = Tumblife.endpoint) 25 | stub_request(:post, endpoint + path) 26 | end 27 | 28 | def fixture_path 29 | File.expand_path("../fixtures", __FILE__) 30 | end 31 | 32 | def fixture(file) 33 | File.new(fixture_path + '/' + file) 34 | end 35 | -------------------------------------------------------------------------------- /spec/fixtures/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "user": { 8 | "name": "mmtki", 9 | "likes": 0, 10 | "following": 99, 11 | "default_post_format": "html", 12 | "blogs": [ 13 | { 14 | "name": "mmtki", 15 | "url": "http://mmtki.tumblr.com/", 16 | "followers": 98, 17 | "primary": true, 18 | "title": "Blue Planet", 19 | "description": "", 20 | "admin": true, 21 | "updated": 1337454025, 22 | "posts": 6505, 23 | "drafts": 0, 24 | "messages": 0, 25 | "queue": 0, 26 | "ask": false, 27 | "tweet": "N", 28 | "facebook_opengraph_enabled": "N", 29 | "type": "public" 30 | } 31 | ] 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /spec/faraday/response_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Faraday::Response do 4 | let(:client) { Tumblife.client } 5 | 6 | { 7 | 400 => Tumblife::BadRequest, 8 | 401 => Tumblife::NotAuthorized, 9 | 404 => Tumblife::NotFound, 10 | 499 => Tumblife::BadRequest, 11 | 500 => Tumblife::InternalServerError, 12 | 503 => Tumblife::ServiceUnavailable, 13 | 599 => Tumblife::InternalServerError, 14 | }.each do |status, exception| 15 | context "when HTTP status is #{status}" do 16 | before do 17 | stub_get('/v2/user/dashboard'). 18 | to_return(:status => status, :body => '{"meta":{"msg":"test"}}') 19 | end 20 | 21 | it "should raise #{exception.name} error" do 22 | expect { 23 | client.dashboard 24 | }.to raise_error(exception) 25 | end 26 | end 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /spec/fixtures/mmtki.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "user": { 8 | "name": "mmtki", 9 | "likes": 0, 10 | "following": 99, 11 | "default_post_format": "html", 12 | "blogs": [ 13 | { 14 | "name": "mmtki", 15 | "url": "http://mmtki.tumblr.com/", 16 | "followers": 98, 17 | "primary": true, 18 | "title": "Blue Planet", 19 | "description": "", 20 | "admin": true, 21 | "updated": 1337454025, 22 | "posts": 6505, 23 | "drafts": 0, 24 | "messages": 0, 25 | "queue": 0, 26 | "ask": false, 27 | "tweet": "N", 28 | "facebook_opengraph_enabled": "N", 29 | "type": "public" 30 | } 31 | ] 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /spec/fixtures/mitukiii.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "user": { 8 | "name": "mitukiii", 9 | "likes": 768, 10 | "following": 307, 11 | "default_post_format": "html", 12 | "blogs": [ 13 | { 14 | "name": "mitukiii", 15 | "url": "http://mitukiii.tumblr.com/", 16 | "followers": 1013, 17 | "primary": true, 18 | "title": "Say Hello to Sunshine", 19 | "description": "良いものは良い", 20 | "admin": true, 21 | "updated": 1337838702, 22 | "posts": 60657, 23 | "drafts": 0, 24 | "messages": 0, 25 | "queue": 0, 26 | "ask": false, 27 | "tweet": "N", 28 | "facebook_opengraph_enabled": "N", 29 | "type": "public" 30 | } 31 | ] 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/tumblife/response/raise_server_error.rb: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | require 'tumblife/error' 3 | 4 | module Tumblife 5 | module Response 6 | class RaiseServerError < Faraday::Response::Middleware 7 | def on_complete(env) 8 | case env[:status].to_i 9 | when 500 10 | raise Tumblife::InternalServerError.new(error_message(env)) 11 | when 503 12 | raise Tumblife::ServiceUnavailable.new(error_message(env)) 13 | when 500...600 14 | raise Tumblife::InternalServerError.new(error_message(env)) 15 | end 16 | end 17 | 18 | private 19 | def error_message(env) 20 | [ 21 | env[:method].to_s.upcase, 22 | env[:url].to_s, 23 | env[:status], 24 | error_body(env[:body]) 25 | ].join(': ') 26 | end 27 | 28 | def error_body(body) 29 | if body.nil? 30 | nil 31 | elsif body['meta'] && body['meta']['msg'] 32 | body['meta']['msg'] 33 | end 34 | end 35 | end 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Kazuya Takeshima 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /lib/tumblife/response/raise_client_error.rb: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | require 'tumblife/error' 3 | 4 | module Tumblife 5 | module Response 6 | class RaiseClientError < Faraday::Response::Middleware 7 | def on_complete(env) 8 | case env[:status].to_i 9 | when 400 10 | raise Tumblife::BadRequest.new(error_message(env)) 11 | when 401 12 | raise Tumblife::NotAuthorized.new(error_message(env)) 13 | when 404 14 | raise Tumblife::NotFound.new(error_message(env)) 15 | when 400...500 16 | raise Tumblife::BadRequest.new(error_message(env)) 17 | end 18 | end 19 | 20 | private 21 | def error_message(env) 22 | [ 23 | env[:method].to_s.upcase, 24 | env[:url].to_s, 25 | env[:status], 26 | error_body(env[:body]) 27 | ].join(': ') 28 | end 29 | 30 | def error_body(body) 31 | if body.nil? 32 | nil 33 | elsif body['meta'] && body['meta']['msg'] 34 | body['meta']['msg'] 35 | end 36 | end 37 | end 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /lib/tumblife/connection.rb: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | require 'faraday_middleware' 3 | require 'tumblife/response' 4 | 5 | module Tumblife 6 | module Connection 7 | # Returns a Faraday::Connection object 8 | def connection 9 | options = { 10 | :headers => { 11 | :accept => 'application/json', 12 | :user_agent => user_agent 13 | }, 14 | :proxy => proxy, 15 | :ssl => { 16 | :verify => false 17 | }, 18 | :url => endpoint 19 | } 20 | 21 | Faraday.new(options) do |connection| 22 | connection.response :raise_server_error 23 | connection.response :raise_client_error 24 | connection.response :mashify 25 | connection.response :json 26 | connection.request :oauth, credentials 27 | connection.request :multipart 28 | connection.request :url_encoded 29 | connection.adapter adapter 30 | end 31 | end 32 | 33 | private 34 | def credentials 35 | { 36 | :consumer_key => consumer_key, 37 | :consumer_secret => consumer_secret, 38 | :token => oauth_token, 39 | :token_secret => oauth_token_secret 40 | } 41 | end 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /tumblife.gemspec: -------------------------------------------------------------------------------- 1 | lib = File.expand_path('../lib', __FILE__) 2 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 3 | require 'tumblife/version' 4 | 5 | Gem::Specification.new do |spec| 6 | spec.name = 'tumblife' 7 | spec.version = Tumblife::VERSION 8 | spec.authors = ['Kazuya Takeshima'] 9 | spec.email = ['mail@mitukiii.jp'] 10 | spec.summary = %q{A Ruby wrapper for the Tumblr API v2.} 11 | spec.homepage = 'https://github.com/mitukiii/tumblife-for-ruby' 12 | spec.license = 'MIT' 13 | 14 | spec.files = `git ls-files`.split($/) 15 | spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } 16 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 17 | spec.require_paths = ['lib'] 18 | 19 | spec.add_runtime_dependency 'faraday', '~> 0.8.9' 20 | spec.add_runtime_dependency 'faraday_middleware', '~> 0.9.0' 21 | spec.add_runtime_dependency 'hashie', '~> 2.0.5' 22 | spec.add_runtime_dependency 'multi_json', '~> 1.9.0' 23 | spec.add_runtime_dependency 'simple_oauth', '~> 0.2.0' 24 | 25 | spec.add_development_dependency 'bundler', '~> 1.5' 26 | spec.add_development_dependency 'rake' 27 | spec.add_development_dependency 'rspec' 28 | spec.add_development_dependency 'simplecov' 29 | spec.add_development_dependency 'webmock' 30 | spec.add_development_dependency 'yard' 31 | end 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tumblife 2 | 3 | [![Build Status](https://travis-ci.org/mitukiii/tumblife-for-ruby.png?branch=master)][travis] 4 | [![Code Climate](https://codeclimate.com/github/mitukiii/tumblife-for-ruby.png)][codeclimate] 5 | [![Dependency Status](https://gemnasium.com/mitukiii/tumblife-for-ruby.png?travis)][gemnasium] 6 | 7 | [travis]: https://travis-ci.org/mitukiii/tumblife-for-ruby 8 | [codeclimate]: https://codeclimate.com/github/mitukiii/tumblife-for-ruby 9 | [gemnasium]: https://gemnasium.com/mitukiii/tumblife-for-ruby 10 | 11 | A Ruby wrapper for the Tumblr API v2. 12 | 13 | ## Installation 14 | 15 | Add this line to your application's Gemfile: 16 | 17 | gem 'tumblife' 18 | 19 | And then execute: 20 | 21 | $ bundle 22 | 23 | Or install it yourself as: 24 | 25 | $ gem install tumblife 26 | 27 | ## Usage 28 | 29 | ```ruby 30 | require 'tumblife' 31 | 32 | Tumblife.configure do |config| 33 | config.consumer_key = YOUR_CONSUMER_KEY 34 | config.consumer_secret = YOUR_CONSUMER_SECRET 35 | config.oauth_token = YOUR_OAUTH_TOKEN 36 | config.oauth_token_secret = YOUR_OAUTH_TOKEN_SECRET 37 | end 38 | 39 | client = Tumblife.client 40 | 41 | avatar = client.avatar('mitukiii.tumblr.com') 42 | avatar.avatar_url # => http://24.media.tumblr.com/avatar_87fdfd3ea0e3_64.png 43 | 44 | info = client.blog_info('mitukiii.tumblr.com') 45 | info.blog.name # => mitukiii 46 | info.blog.url # => http://mitukiii.tumblr.com/ 47 | 48 | dashboard = client.dashboard 49 | dashboard.posts.each do |post| 50 | # ... do something 51 | end 52 | 53 | client.text('mitukiii.tumblr.com', :body => 'Hello, Tumblr!') 54 | client.photo('mitukiii.tumblr.com', :data => Faraday::UploadIO.new('/path/to/image.png', 'image/png')) 55 | ``` 56 | 57 | ## TODO 58 | 59 | * better post support 60 | 61 | ## Contributing 62 | 63 | 1. Fork it 64 | 2. Create your feature branch (`git checkout -b my-new-feature`) 65 | 3. Commit your changes (`git commit -am 'Add some feature'`) 66 | 4. Push to the branch (`git push origin my-new-feature`) 67 | 5. Create new Pull Request 68 | 69 | ## Copyright 70 | 71 | Copyright (c) 2012 [Kazuya Takeshima](mailto:mail@mitukiii.jp). See [LICENSE][license] for details. 72 | 73 | [license]: LICENSE.md 74 | -------------------------------------------------------------------------------- /spec/tumblife/client_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Tumblife::Client do 4 | before do 5 | @keys = Tumblife::Configuration::VALID_OPTIONS_KEYS 6 | end 7 | 8 | context 'with module configuration' do 9 | before do 10 | Tumblife.configure do |config| 11 | @keys.each do |key| 12 | config.send("#{key}=", key) 13 | end 14 | end 15 | end 16 | 17 | after do 18 | Tumblife.reset 19 | end 20 | 21 | it 'should inherit module configuration' do 22 | api = Tumblife::Client.new 23 | @keys.each do |key| 24 | expect(api.send(key)).to eq(key) 25 | end 26 | end 27 | 28 | context 'with class configuration' do 29 | before do 30 | @configuration = { 31 | :adapter => :typhoeus, 32 | :consumer_key => 'CK', 33 | :consumer_secret => 'CS', 34 | :oauth_token => 'OT', 35 | :oauth_token_secret => 'OS', 36 | :endpoint => 'https://api.twitter.com', 37 | :proxy => 'http://mitukiii:secret@proxy.example.com:8080', 38 | :user_agent => 'Custom User Agent' 39 | } 40 | end 41 | 42 | context 'during initialization' do 43 | it 'should override module configuration' do 44 | api = Tumblife::Client.new(@configuration) 45 | @keys.each do |key| 46 | expect(api.send(key)).to eq(@configuration[key]) 47 | end 48 | end 49 | end 50 | 51 | context 'after initilization' do 52 | it 'should override module configuration after initialization' do 53 | api = Tumblife::Client.new 54 | @configuration.each do |key, value| 55 | api.send("#{key}=", value) 56 | end 57 | @keys.each do |key| 58 | expect(api.send(key)).to eq(@configuration[key]) 59 | end 60 | end 61 | end 62 | end 63 | end 64 | 65 | it 'should not cache the user name across clients' do 66 | stub_get('/v2/user/info'). 67 | to_return(:body => fixture('mmtki.json')) 68 | client1 = Tumblife.client 69 | expect(client1.info.user.name).to eq('mmtki') 70 | 71 | stub_get('/v2/user/info'). 72 | to_return(:body => fixture('mitukiii.json')) 73 | client2 = Tumblife.client 74 | expect(client2.info.user.name).to eq('mitukiii') 75 | end 76 | end 77 | -------------------------------------------------------------------------------- /spec/tumblife_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Tumblife do 4 | after do 5 | Tumblife.reset 6 | end 7 | 8 | context 'when delegating to a client' do 9 | before do 10 | stub_get('/v2/user/info'). 11 | to_return(:body => fixture('info.json')) 12 | end 13 | 14 | it 'should request the correct resource' do 15 | Tumblife.info 16 | expect(stub_get('/v2/user/info')). 17 | to have_been_made 18 | end 19 | 20 | it 'should return the same results as a client' do 21 | expect(Tumblife.info).to eq(Tumblife::Client.new.info) 22 | end 23 | end 24 | 25 | describe '.client' do 26 | it 'should return a Tumblife::Client' do 27 | expect(Tumblife.client).to be_a Tumblife::Client 28 | end 29 | end 30 | 31 | describe '.respond_to?' do 32 | it 'should take an optional argument' do 33 | expect(Tumblife.respond_to?(:client, true)).to be_true 34 | end 35 | end 36 | 37 | describe '.adapter' do 38 | it 'should return the default adapter' do 39 | expect(Tumblife.adapter).to eq(Tumblife::Configuration::DEFAULT_ADAPTER) 40 | end 41 | end 42 | 43 | describe '.adapter=' do 44 | it 'should set the adapter' do 45 | Tumblife.adapter = :typhoeus 46 | expect(Tumblife.adapter).to eq(:typhoeus) 47 | end 48 | end 49 | 50 | describe '.endpoint' do 51 | it 'should return the default endpoint' do 52 | expect(Tumblife.endpoint).to eq(Tumblife::Configuration::DEFAULT_ENDPOINT) 53 | end 54 | end 55 | 56 | describe '.endpoint=' do 57 | it 'should set the endpoint' do 58 | Tumblife.endpoint = 'https://api.twitter.com/' 59 | expect(Tumblife.endpoint).to eq('https://api.twitter.com/') 60 | end 61 | end 62 | 63 | describe '.user_agent' do 64 | it 'should return the default user agent' do 65 | expect(Tumblife.user_agent).to eq(Tumblife::Configuration::DEFAULT_USER_AGENT) 66 | end 67 | end 68 | 69 | describe '.user_agent=' do 70 | it 'should set the user_agent' do 71 | Tumblife.endpoint = 'Custom User Agent' 72 | expect(Tumblife.endpoint).to eq('Custom User Agent') 73 | end 74 | end 75 | 76 | describe '.configure' do 77 | Tumblife::Configuration::VALID_OPTIONS_KEYS.each do |key| 78 | it "should set the #{key}" do 79 | Tumblife.configure do |config| 80 | config.send("#{key}=", key) 81 | expect(Tumblife.send(key)).to eq(key) 82 | end 83 | end 84 | end 85 | end 86 | 87 | end 88 | -------------------------------------------------------------------------------- /lib/tumblife/configuration.rb: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | 3 | module Tumblife 4 | # Defines constants and methods related to configuration 5 | module Configuration 6 | # An array of keys in the options hash when configuring a {Tumblife::Client} 7 | VALID_OPTIONS_KEYS = [ 8 | :adapter, 9 | :consumer_key, 10 | :consumer_secret, 11 | :oauth_token, 12 | :oauth_token_secret, 13 | :endpoint, 14 | :proxy, 15 | :user_agent, 16 | ].freeze 17 | 18 | # The adapter that will be used to connect if none is set 19 | # 20 | # @note The default faraday adapter is Net::HTTP. 21 | DEFAULT_ADAPTER = Faraday.default_adapter 22 | 23 | # By default, don't set a consumer key 24 | DEFAULT_CONSUMER_KEY = nil 25 | 26 | # By default, don't set a consumer secret 27 | DEFAULT_CONSUMER_SECRET = nil 28 | 29 | # By default, don't set an oauth token 30 | DEFAULT_OAUTH_TOKEN = nil 31 | 32 | # By default, don't set an oauth token secret 33 | DEFAULT_OAUTH_TOKEN_SECRET = nil 34 | 35 | # The endpoint that will be used to connect if none is set 36 | # 37 | # @note There is no reason to use any other endpoint at this time 38 | DEFAULT_ENDPOINT = 'http://api.tumblr.com'.freeze 39 | 40 | # By default, don't use a proxy server 41 | DEFAULT_PROXY = nil 42 | 43 | # The user agent that will be sent to the API endpoint if none is set 44 | DEFAULT_USER_AGENT = "Tumblife/#{VERSION} (http://github.com/mitukiii/tumblife-for-ruby)".freeze 45 | 46 | # @private 47 | attr_accessor *VALID_OPTIONS_KEYS 48 | 49 | # When this module is extended, set all configuration options to their default values 50 | def self.extended(base) 51 | base.reset 52 | end 53 | 54 | # Convenience method to allow configuration options to be set in a block 55 | def configure 56 | yield self 57 | self 58 | end 59 | 60 | # Create a hash of options and their values 61 | def options 62 | VALID_OPTIONS_KEYS.inject({}) do |options, key| 63 | options.merge!(key => send(key)) 64 | end 65 | end 66 | 67 | # Reset all configuration options to defaults 68 | def reset 69 | self.adapter = DEFAULT_ADAPTER 70 | self.consumer_key = DEFAULT_CONSUMER_KEY 71 | self.consumer_secret = DEFAULT_CONSUMER_SECRET 72 | self.oauth_token = DEFAULT_OAUTH_TOKEN 73 | self.oauth_token_secret = DEFAULT_OAUTH_TOKEN_SECRET 74 | self.endpoint = DEFAULT_ENDPOINT 75 | self.proxy = DEFAULT_PROXY 76 | self.user_agent = DEFAULT_USER_AGENT 77 | self 78 | end 79 | end 80 | end 81 | -------------------------------------------------------------------------------- /lib/tumblife/client/user.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | module Tumblife 4 | class Client 5 | module User 6 | # Get a User's Information 7 | # 8 | # @see http://www.tumblr.com/docs/en/api/v2#m-up-info 9 | # @authentication OAuth 10 | # @return [Hashie::Mash] 11 | def info 12 | get('/v2/user/info') 13 | end 14 | 15 | # Retrieve a User's Dashboard 16 | # 17 | # @see http://www.tumblr.com/docs/en/api/v2#m-ug-dashboard 18 | # @authentication OAuth 19 | # @param options [Hash] An optional options hash 20 | # @option options [Integer] :limit (20) The number of results to return: 1–20, inclusive 21 | # @option options [Integer] :offset (0) Post number to start at 22 | # @option options [String] :type (nil) The type of post to return. Specify one of the following: text, photo, quote, link, chat, audio, video, answer 23 | # @option options [Integer] :since_id (0) Return posts that have appeared after this ID (Use this parameter to page through the results: first get a set of posts, and then get posts since the last ID of the previous set.) 24 | # @option options [Boolean] :reblog_info (false) Indicates whether to return reblog information (specify true or false). Returns the various reblogged_ fields. 25 | # @option options [Boolean] :notes_info (false) Indicates whether to return notes information (specify true or false). Returns note count and note metadata. 26 | # @return [Hashie::Mash] 27 | def dashboard(options = {}) 28 | get('/v2/user/dashboard', options) 29 | end 30 | 31 | # Retrieve a User's Likes 32 | # 33 | # @see http://www.tumblr.com/docs/en/api/v2#m-ug-likes 34 | # @authentication OAuth 35 | # @param offset [Integer] Liked post number to start at 36 | # @param limit [Integer] The number of results to return: 1–20, inclusive 37 | # @return [Hashie::Mash] 38 | def likes(offset = 0, limit = 20) 39 | get('/v2/user/likes', :offset => offset, :limit => limit) 40 | end 41 | 42 | # Retrieve the Blogs a User Is Following 43 | # 44 | # @see http://www.tumblr.com/docs/en/api/v2#m-ug-following 45 | # @authentication OAuth 46 | # @param offset [Integer] Result number to start at 47 | # @param limit [Integer] The number of results to return: 1–20, inclusive 48 | # @return [Hashie::Mash] 49 | def following(offset = 0, limit = 20) 50 | get('/v2/user/following', :offset => offset, :limit => limit) 51 | end 52 | 53 | # Like a Post 54 | # 55 | # @see http://www.tumblr.com/docs/en/api/v2#m-up-like 56 | # @authentication OAuth 57 | # @param id [Integer] The ID of the post to like 58 | # @param reblog_key [String] The reblog key for the post id 59 | # @return [Hashie::Mash] 60 | def like(id, reblog_key) 61 | post('/v2/user/like', :id => id, :reblog_key => reblog_key) 62 | end 63 | 64 | # Unlike a Post 65 | # 66 | # @see http://www.tumblr.com/docs/en/api/v2#m-up-unlike 67 | # @authentication OAuth 68 | # @param id [Integer] The ID of the post to unlike 69 | # @param reblog_key [String] The reblog key for the post id 70 | # @return [Hashie::Mash] 71 | def unlike(id, reblog_key) 72 | post('/v2/user/unlike', :id => id, :reblog_key => reblog_key) 73 | end 74 | 75 | # Follow a blog 76 | # 77 | # @see http://www.tumblr.com/docs/en/api/v2#m-up-follow 78 | # @authentication OAuth 79 | # @param url [String] The URL of the blog to follow 80 | # @return [Hashie::Mash] 81 | def follow(url) 82 | post('/v2/user/follow', :url => url) 83 | end 84 | 85 | # Unfollow a blog 86 | # 87 | # @see http://www.tumblr.com/docs/en/api/v2#m-up-unfollow 88 | # @authentication OAuth 89 | # @param url [String] The URL of the blog to unfollow 90 | # @return [Hashie::Mash] 91 | def unfollow(url) 92 | post('/v2/user/unfollow', :url => url) 93 | end 94 | end 95 | end 96 | end 97 | -------------------------------------------------------------------------------- /lib/tumblife/client/blog.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | module Tumblife 4 | class Client 5 | module Blog 6 | # Retrieve Blog Info 7 | # 8 | # @see http://www.tumblr.com/docs/en/api/v2#blog-info 9 | # @authentication API Key 10 | # @param blog [String] The standard or custom blog hostname 11 | # @return [Hashie::Mash] 12 | def blog_info(blog) 13 | get("/v2/blog/#{blog}/info", :api_key => consumer_key) 14 | end 15 | 16 | # Retrieve a Blog Avatar 17 | # 18 | # @see http://www.tumblr.com/docs/en/api/v2#blog-avatar 19 | # @authentication None 20 | # @param blog [String] The standard or custom blog hostname 21 | # @param size [Integer] The size of the avatar (square, one value for both length and width). Must be one of the values: 16, 24, 30, 40, 48, 64, 96, 128, 512 22 | # @return [Hashie::Mash] 23 | def avatar(blog, size = 64) 24 | get("/v2/blog/#{blog}/avatar", :size => size) 25 | end 26 | 27 | # Retrieve a Blog's Followers 28 | # 29 | # @see http://www.tumblr.com/docs/en/api/v2#blog-followers 30 | # @authentication OAuth 31 | # @param blog [String] The standard or custom blog hostname 32 | # @param options [Hash] An optional options hash 33 | # @option options [Integer] :limit (20) The number of results to return: 1–20, inclusive 34 | # @option options [Integer] :offset (0) Result to start at 35 | # @return [Hashie::Mash] 36 | def followers(blog, options = {}) 37 | get("/v2/blog/#{blog}/followers", options) 38 | end 39 | 40 | # Retrieve Published Posts 41 | # 42 | # @see http://www.tumblr.com/docs/en/api/v2#posts 43 | # @authentication API Key 44 | # @param blog [String] The standard or custom blog hostname 45 | # @param options [Hash] An optional options hash 46 | # @option options [String] :type (nil) The type of post to return. Specify one of the following: text, quote, link, answer, video, audio, photo, chat 47 | # @option options [Integer] :id (nil) A specific post ID. Returns the single post specified or (if not found) a 404 error. 48 | # @option options [String] :tag (nil) Limits the response to posts with the specified tag 49 | # @option options [Integer] :limit (20) The number of posts to return: 1–20, inclusive 50 | # @option options [Integer] :offset (0) Post number to start at 51 | # @option options [Boolean] :reblog_info (false) Indicates whether to return reblog information (specify true or false). Returns the various reblogged_ fields. 52 | # @option options [Boolean] :notes_info (false) Indicates whether to return notes information (specify true or false). Returns note count and note metadata. 53 | # @option options [String] :filter (nil) Specifies the post format to return, other than HTML: text – (Plain text, no HTML), raw – (As entered by the user (no post-processing); if the user writes in Markdown, the Markdown will be returned rather than HTML) 54 | # @return [Hashie::Mash] 55 | def posts(blog, options = {}) 56 | options[:api_key] = consumer_key 57 | get("/v2/blog/#{blog}/posts", options) 58 | end 59 | 60 | # Retrieve Queued Posts 61 | # 62 | # @see http://www.tumblr.com/docs/en/api/v2#blog-queue 63 | # @authentication OAuth 64 | # @param blog [String] The standard or custom blog hostname 65 | # @return [Hashie::Mash] 66 | def queue(blog) 67 | get("/v2/blog/#{blog}/posts/queue") 68 | end 69 | 70 | # Retrieve Draft Posts 71 | # 72 | # @see http://www.tumblr.com/docs/en/api/v2#blog-drafts 73 | # @authentication OAuth 74 | # @param blog [String] The standard or custom blog hostname 75 | # @return [Hashie::Mash] 76 | def draft(blog) 77 | get("/v2/blog/#{blog}/posts/draft") 78 | end 79 | 80 | # Retrieve Submission Posts 81 | # 82 | # @see http://www.tumblr.com/docs/en/api/v2#blog-submissions 83 | # @authentication OAuth 84 | # @param blog [String] The standard or custom blog hostname 85 | # @return [Hashie::Mash] 86 | def submission(blog) 87 | get("/v2/blog/#{blog}/posts/submission") 88 | end 89 | end 90 | end 91 | end 92 | -------------------------------------------------------------------------------- /spec/tumblife/client/user_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Tumblife::Client do 4 | let(:client) { Tumblife.client } 5 | 6 | describe '.info' do 7 | before do 8 | stub_get('/v2/user/info'). 9 | to_return(:body => fixture('info.json')) 10 | end 11 | it 'should request the correct resource' do 12 | client.info 13 | expect(a_get('/v2/user/info')). 14 | to have_been_made 15 | end 16 | it 'should return user info' do 17 | info = client.info 18 | expect(info.user.name).to eq('mmtki') 19 | expect(info.user.blogs).to be_a Array 20 | end 21 | end 22 | 23 | describe '.dashboard' do 24 | before do 25 | stub_get('/v2/user/dashboard'). 26 | to_return(:body => fixture('dashboard.json')) 27 | end 28 | it 'should request the correct resource' do 29 | client.dashboard 30 | expect(a_get('/v2/user/dashboard')). 31 | to have_been_made 32 | end 33 | it 'should return dashboard posts' do 34 | dashboard = client.dashboard 35 | expect(dashboard.posts).to be_a Array 36 | expect(dashboard.posts.size).to eq(20) 37 | dashboard.posts.first.blog_name == 'mmtki' 38 | end 39 | end 40 | 41 | describe '.likes' do 42 | before do 43 | stub_get('/v2/user/likes'). 44 | with(:query => {:offset => '0', :limit => '20'}). 45 | to_return(:body => fixture('likes.json')) 46 | end 47 | it 'should request the correct resource' do 48 | client.likes 49 | expect(a_get('/v2/user/likes'). 50 | with(:query => {:offset => '0', :limit => '20'})). 51 | to have_been_made 52 | end 53 | end 54 | 55 | describe '.following' do 56 | before do 57 | stub_get('/v2/user/following'). 58 | with(:query => {:offset => '0', :limit => '20'}). 59 | to_return(:body => fixture('following.json')) 60 | end 61 | it 'should request the correct resource' do 62 | client.following 63 | expect(a_get('/v2/user/following'). 64 | with(:query => {:offset => '0', :limit => '20'})). 65 | to have_been_made 66 | end 67 | it 'should return following blogs' do 68 | following = client.following 69 | expect(following.blogs).to be_a Array 70 | expect(following.blogs.size).to eq(following.total_blogs) 71 | following.blogs.first.blog_name == 'mitukiii' 72 | end 73 | end 74 | 75 | describe '.like' do 76 | before do 77 | stub_post('/v2/user/like'). 78 | with(:body => {:id => '123456789', :reblog_key => 'abcdef'}). 79 | to_return(:body => fixture('like.json')) 80 | end 81 | it 'should request the correct resource' do 82 | client.like(123456789, 'abcdef') 83 | expect(a_post('/v2/user/like'). 84 | with(:body => {:id => '123456789', :reblog_key => 'abcdef'})). 85 | to have_been_made 86 | end 87 | end 88 | 89 | describe '.unlike' do 90 | before do 91 | stub_post('/v2/user/unlike'). 92 | with(:body => {:id => '123456789', :reblog_key => 'abcdef'}). 93 | to_return(:body => fixture('unlike.json')) 94 | end 95 | it 'should request the correct resource' do 96 | client.unlike(123456789, 'abcdef') 97 | expect(a_post('/v2/user/unlike'). 98 | with(:body => {:id => '123456789', :reblog_key => 'abcdef'})). 99 | to have_been_made 100 | end 101 | end 102 | 103 | describe '.follow' do 104 | before do 105 | stub_post('/v2/user/follow'). 106 | with(:body => {:url => 'mitukiii.tumblr.com'}). 107 | to_return(:body => fixture('follow.json')) 108 | end 109 | it 'should request the correct resource' do 110 | client.follow('mitukiii.tumblr.com') 111 | expect(a_post('/v2/user/follow'). 112 | with(:body => {:url => 'mitukiii.tumblr.com'})). 113 | to have_been_made 114 | end 115 | end 116 | 117 | describe '.unfollow' do 118 | before do 119 | stub_post('/v2/user/unfollow'). 120 | with(:body => {:url => 'mitukiii.tumblr.com'}). 121 | to_return(:body => fixture('unfollow.json')) 122 | end 123 | it 'should request the correct resource' do 124 | client.unfollow('mitukiii.tumblr.com') 125 | expect(a_post('/v2/user/unfollow'). 126 | with(:body => {:url => 'mitukiii.tumblr.com'})). 127 | to have_been_made 128 | end 129 | end 130 | end 131 | -------------------------------------------------------------------------------- /spec/tumblife/client/blog_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Tumblife::Client do 4 | let(:api_key) { 'api_key' } 5 | let(:blog) { 'mmtki.tumblr.com' } 6 | let(:client) do 7 | Tumblife.configure {|config| 8 | config.consumer_key = api_key 9 | }.client 10 | end 11 | 12 | describe '.blog_info' do 13 | before do 14 | stub_get("/v2/blog/#{blog}/info"). 15 | with(:query => {:api_key => api_key}). 16 | to_return(:body => fixture('blog_info.json')) 17 | end 18 | it 'should request the correct resource' do 19 | client.blog_info(blog) 20 | expect(a_get("/v2/blog/#{blog}/info"). 21 | with(:query => {:api_key => api_key})). 22 | to have_been_made 23 | end 24 | it 'should return blog info' do 25 | info = client.blog_info(blog) 26 | info.blog.name == 'mmtki' 27 | end 28 | end 29 | 30 | describe '.avatar' do 31 | before do 32 | stub_get("/v2/blog/#{blog}/avatar"). 33 | with(:query => {:size => 64}). 34 | to_return(:body => fixture('avatar.json')) 35 | end 36 | it 'should request the correct resource' do 37 | client.avatar(blog) 38 | expect(a_get("/v2/blog/#{blog}/avatar"). 39 | with(:query => {:size => 64})). 40 | to have_been_made 41 | end 42 | it 'should return blog avatar' do 43 | avatar = client.avatar(blog) 44 | avatar.avatar_url == 'http://25.media.tumblr.com/avatar_0ade4b983345_64.png' 45 | end 46 | end 47 | 48 | describe '.followers' do 49 | before do 50 | stub_get("/v2/blog/#{blog}/followers"). 51 | to_return(:body => fixture('followers.json')) 52 | end 53 | it 'should request the correct resource' do 54 | client.followers(blog) 55 | expect(a_get("/v2/blog/#{blog}/followers")). 56 | to have_been_made 57 | end 58 | it 'should return blog followers' do 59 | followers = client.followers(blog) 60 | expect(followers.blogs).to be_a Array 61 | expect(followers.blogs.size).to eq(followers.total_blogs) 62 | followers.blogs.first.blog_name == 'mitukiii' 63 | end 64 | end 65 | 66 | describe '.posts' do 67 | before do 68 | stub_get("/v2/blog/#{blog}/posts"). 69 | with(:query => {:api_key => api_key}). 70 | to_return(:body => fixture('posts.json')) 71 | end 72 | it 'should request the correct resource' do 73 | client.posts(blog) 74 | expect(a_get("/v2/blog/#{blog}/posts"). 75 | with(:query => {:api_key => api_key})). 76 | to have_been_made 77 | end 78 | it 'should return blog posts' do 79 | posts = client.posts(blog) 80 | expect(posts.blog.name).to eq('mmtki') 81 | expect(posts.posts).to be_a Array 82 | expect(posts.posts.size).to eq(20) 83 | posts.posts.first.blog_name == 'mmtki' 84 | end 85 | end 86 | 87 | describe '.queue' do 88 | before do 89 | stub_get("/v2/blog/#{blog}/posts/queue"). 90 | to_return(:body => fixture('queue.json')) 91 | end 92 | it 'should request the correct resource' do 93 | client.queue(blog) 94 | expect(a_get("/v2/blog/#{blog}/posts/queue")). 95 | to have_been_made 96 | end 97 | it 'should return blog queue' do 98 | queue = client.queue(blog) 99 | expect(queue.posts).to be_a Array 100 | end 101 | end 102 | 103 | describe '.draft' do 104 | before do 105 | stub_get("/v2/blog/#{blog}/posts/draft"). 106 | to_return(:body => fixture('draft.json')) 107 | end 108 | it 'should request the correct resource' do 109 | client.draft(blog) 110 | expect(a_get("/v2/blog/#{blog}/posts/draft")). 111 | to have_been_made 112 | end 113 | it 'should return blog draft' do 114 | draft = client.draft(blog) 115 | expect(draft.posts).to be_a Array 116 | end 117 | end 118 | 119 | describe '.submission' do 120 | before do 121 | stub_get("/v2/blog/#{blog}/posts/submission"). 122 | to_return(:body => fixture('submission.json')) 123 | end 124 | it 'should request the correct resource' do 125 | client.submission(blog) 126 | expect(a_get("/v2/blog/#{blog}/posts/submission")). 127 | to have_been_made 128 | end 129 | it 'should return blog submission' do 130 | submission = client.submission(blog) 131 | expect(submission.posts).to be_a Array 132 | end 133 | end 134 | end 135 | -------------------------------------------------------------------------------- /spec/tumblife/client/post_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Tumblife::Client do 4 | let(:blog) { 'mmtki.tumblr.com' } 5 | let(:client) { Tumblife.client } 6 | 7 | describe '.text' do 8 | before do 9 | stub_post("/v2/blog/#{blog}/post"). 10 | with(:body => {:type => 'text', :title => 'title', :body => 'text'}). 11 | to_return(:body => fixture('post.json')) 12 | end 13 | it 'should request the correct resource' do 14 | client.text(blog, :title => 'title', :body => 'text') 15 | expect(a_post("/v2/blog/#{blog}/post"). 16 | with(:body => {:type => 'text', :title => 'title', :body => 'text'})). 17 | to have_been_made 18 | end 19 | end 20 | 21 | describe '.photo' do 22 | before do 23 | stub_post("/v2/blog/#{blog}/post"). 24 | with(:body => {:type => 'photo', :caption => 'caption', :source => 'http://example.com/photo.png'}). 25 | to_return(:body => fixture('post.json')) 26 | end 27 | it 'should request the correct resource' do 28 | client.photo(blog, :caption => 'caption', :source => 'http://example.com/photo.png') 29 | expect(a_post("/v2/blog/#{blog}/post"). 30 | with(:body => {:type => 'photo', :caption => 'caption', :source => 'http://example.com/photo.png'})). 31 | to have_been_made 32 | end 33 | end 34 | 35 | describe '.quote' do 36 | before do 37 | stub_post("/v2/blog/#{blog}/post"). 38 | with(:body => {:type => 'quote', :quote => 'quote', :source => 'http://example.com/'}). 39 | to_return(:body => fixture('post.json')) 40 | end 41 | it 'should request the correct resource' do 42 | client.quote(blog, :quote => 'quote', :source => 'http://example.com/') 43 | expect(a_post("/v2/blog/#{blog}/post"). 44 | with(:body => {:type => 'quote', :quote => 'quote', :source => 'http://example.com/'})). 45 | to have_been_made 46 | end 47 | end 48 | 49 | describe '.link' do 50 | before do 51 | stub_post("/v2/blog/#{blog}/post"). 52 | with(:body => {:type => 'link', :title => 'title', :link => 'http://example.com/'}). 53 | to_return(:body => fixture('post.json')) 54 | end 55 | it 'should request the correct resource' do 56 | client.link(blog, :title => 'title', :link => 'http://example.com/') 57 | expect(a_post("/v2/blog/#{blog}/post"). 58 | with(:body => {:type => 'link', :title => 'title', :link => 'http://example.com/'})). 59 | to have_been_made 60 | end 61 | end 62 | 63 | describe '.chat' do 64 | before do 65 | stub_post("/v2/blog/#{blog}/post"). 66 | with(:body => {:type => 'chat', :title => 'title', :conversation => 'conversation'}). 67 | to_return(:body => fixture('post.json')) 68 | end 69 | it 'should request the correct resource' do 70 | client.chat(blog, :title => 'title', :conversation => 'conversation') 71 | expect(a_post("/v2/blog/#{blog}/post"). 72 | with(:body => {:type => 'chat', :title => 'title', :conversation => 'conversation'})). 73 | to have_been_made 74 | end 75 | end 76 | 77 | describe '.audio' do 78 | before do 79 | stub_post("/v2/blog/#{blog}/post"). 80 | with(:body => {:type => 'audio', :caption => 'caption', :external_url => 'http://example.com/audio.mp3'}). 81 | to_return(:body => fixture('post.json')) 82 | end 83 | it 'should request the correct resource' do 84 | client.audio(blog, :caption => 'caption', :external_url => 'http://example.com/audio.mp3') 85 | expect(a_post("/v2/blog/#{blog}/post"). 86 | with(:body => {:type => 'audio', :caption => 'caption', :external_url => 'http://example.com/audio.mp3'})). 87 | to have_been_made 88 | end 89 | end 90 | 91 | describe '.video' do 92 | before do 93 | stub_post("/v2/blog/#{blog}/post"). 94 | with(:body => {:type => 'video', :caption => 'caption', :embed => 'http://example.com/video.mp4'}). 95 | to_return(:body => fixture('post.json')) 96 | end 97 | it 'should request the correct resource' do 98 | client.video(blog, :caption => 'caption', :embed => 'http://example.com/video.mp4') 99 | expect(a_post("/v2/blog/#{blog}/post"). 100 | with(:body => {:type => 'video', :caption => 'caption', :embed => 'http://example.com/video.mp4'})). 101 | to have_been_made 102 | end 103 | end 104 | 105 | describe '.edit' do 106 | before do 107 | stub_post("/v2/blog/#{blog}/post/edit"). 108 | with(:body => {:id => '123456789', :type => 'text', :title => 'new title', :body => 'new text'}). 109 | to_return(:body => fixture('post.json')) 110 | end 111 | it 'should request the correct resource' do 112 | client.edit(blog, 123456789, :type => 'text', :title => 'new title', :body => 'new text') 113 | expect(a_post("/v2/blog/#{blog}/post/edit"). 114 | with(:body => {:id => '123456789', :type => 'text', :title => 'new title', :body => 'new text'})). 115 | to have_been_made 116 | end 117 | end 118 | 119 | describe '.reblog' do 120 | before do 121 | stub_post("/v2/blog/#{blog}/post/reblog"). 122 | with(:body => {:id => '123456789', :reblog_key => 'abcdef', :comment => 'comment'}). 123 | to_return(:body => fixture('post.json')) 124 | end 125 | it 'should request the correct resource' do 126 | client.reblog(blog, 123456789, 'abcdef', 'comment') 127 | expect(a_post("/v2/blog/#{blog}/post/reblog"). 128 | with(:body => {:id => '123456789', :reblog_key => 'abcdef', :comment => 'comment'})). 129 | to have_been_made 130 | end 131 | end 132 | 133 | describe '.delete' do 134 | before do 135 | stub_post("/v2/blog/#{blog}/post/delete"). 136 | with(:body => {:id => '123456789'}). 137 | to_return(:body => fixture('post.json')) 138 | end 139 | it 'should request the correct resource' do 140 | client.delete(blog, 123456789) 141 | expect(a_post("/v2/blog/#{blog}/post/delete"). 142 | with(:body => {:id => '123456789'})). 143 | to have_been_made 144 | end 145 | end 146 | end 147 | -------------------------------------------------------------------------------- /lib/tumblife/client/post.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | module Tumblife 4 | class Client 5 | module Post 6 | # Create a New Blog Post 7 | # 8 | # @see http://www.tumblr.com/docs/en/api/v2#posting 9 | # @authentication OAuth 10 | # @note These parameters are used for {#text}, {#photo}, {#quote}, {#link}, {#chat}, {#audio}, {#video}, {#edit} and {#reblog} methods. 11 | # @param blog [String] The standard or custom blog hostname 12 | # @param options [Hash] An optional options hash 13 | # @option options [String] :type ('text') The type of post to create. Specify one of the following: text, photo, quote, link, chat, audio, video 14 | # @option options [String] :state ('published') The state of the post. Specify one of the following: published, draft, queue 15 | # @option options [String] :tags (nil) Comma-separated tags for this post 16 | # @option options [String] :tweet (nil) Manages the autotweet (if enabled) for this post: set to off for no tweet, or enter text to override the default tweet 17 | # @option options [String] :date (nil) The GMT date and time of the post, as a string 18 | # @option options [Boolean] :markdown (false) Indicates whether the post uses markdown syntax 19 | # @option options [String] :slug (nil) Add a short text summary to the end of the post URL 20 | # @return [Hashie::Mash] 21 | def create_post(blog, options = {}) 22 | post("/v2/blog/#{blog}/post", options) 23 | end 24 | 25 | # Create a New Text Post 26 | # 27 | # @see http://www.tumblr.com/docs/en/api/v2#ptext-posts 28 | # @authentication OAuth 29 | # @note This parameter is in addition to the common parameters listed under {#create_post} 30 | # @param blog [String] The standard or custom blog hostname 31 | # @param options [Hash] An optional options hash 32 | # @option options [String] :title (nil) The optional title of the post, HTML entities must be escaped 33 | # @option options [String] :body (nil) The full post body, HTML allowed 34 | # @return [Hashie::Mash] 35 | def text(blog, options = {}) 36 | create_post(blog, options.merge(:type => :text)) 37 | end 38 | 39 | # Create a New Photo Post 40 | # 41 | # @see http://www.tumblr.com/docs/en/api/v2#pphoto-posts 42 | # @authentication OAuth 43 | # @note This parameter is in addition to the common parameters listed under {#create_post} 44 | # @param blog [String] The standard or custom blog hostname 45 | # @param options [Hash] An optional options hash 46 | # @option options [String] :caption (nil) The user-supplied caption, HTML allowed 47 | # @option options [String] :link (nil) The "click-through URL" for the photo 48 | # @option options [String] :source (nil) The photo source URL 49 | # @option options [Faraday::UploadIO] :data (nil) One or more image files (submit multiple times to create a slide show) 50 | # @return [Hashie::Mash] 51 | def photo(blog, options = {}) 52 | create_post(blog, options.merge(:type => :photo)) 53 | end 54 | 55 | # Create a New Quote Post 56 | # 57 | # @see http://www.tumblr.com/docs/en/api/v2#pquote-posts 58 | # @authentication OAuth 59 | # @note This parameter is in addition to the common parameters listed under {#create_post} 60 | # @param blog [String] The standard or custom blog hostname 61 | # @param options [Hash] An optional options hash 62 | # @option options [String] :quote (nil) The full text of the quote, HTML entities must be escpaed 63 | # @option options [String] :source (nil) Cited source, HTML allowed 64 | # @return [Hashie::Mash] 65 | def quote(blog, options = {}) 66 | create_post(blog, options.merge(:type => :quote)) 67 | end 68 | 69 | # Create a New Link Post 70 | # 71 | # @see http://www.tumblr.com/docs/en/api/v2#plink-posts 72 | # @authentication OAuth 73 | # @note This parameter is in addition to the common parameters listed under {#create_post} 74 | # @param blog [String] The standard or custom blog hostname 75 | # @param options [Hash] An optional options hash 76 | # @option options [String] :title (nil) The title of the page the link points to, HTML entities should be escaped 77 | # @option options [String] :url (nil) The link 78 | # @option options [String] :description (nil) A user-supplied description, HTML allowed 79 | # @return [Hashie::Mash] 80 | def link(blog, options = {}) 81 | create_post(blog, options.merge(:type => :link)) 82 | end 83 | 84 | # Create a New Chat Post 85 | # 86 | # @see http://www.tumblr.com/docs/en/api/v2#ppt-convo 87 | # @authentication OAuth 88 | # @note This parameter is in addition to the common parameters listed under {#create_post} 89 | # @param blog [String] The standard or custom blog hostname 90 | # @param options [Hash] An optional options hash 91 | # @option options [String] :title (nil) The title of the chat 92 | # @option options [String] :conversation (nil) The text of the conversation/chat, with dialogue labels (no HTML) 93 | # @return [Hashie::Mash] 94 | def chat(blog, options = {}) 95 | create_post(blog, options.merge(:type => :chat)) 96 | end 97 | 98 | # Create a New Audio Post 99 | # 100 | # @see http://www.tumblr.com/docs/en/api/v2#paudio-posts 101 | # @authentication OAuth 102 | # @note This parameter is in addition to the common parameters listed under {#create_post} 103 | # @param blog [String] The standard or custom blog hostname 104 | # @param options [Hash] An optional options hash 105 | # @option options [String] :caption (nil) The user-supplied caption 106 | # @option options [String] :external_url (nil) The URL of the site that hosts the audio file (not tumblr) 107 | # @option options [Faraday::UploadIO] :data (nil) An audio file 108 | # @return [Hashie::Mash] 109 | def audio(blog, options = {}) 110 | create_post(blog, options.merge(:type => :audio)) 111 | end 112 | 113 | # Create a New Video Post 114 | # 115 | # @see http://www.tumblr.com/docs/en/api/v2#pvideo-posts 116 | # @authentication OAuth 117 | # @note This parameter is in addition to the common parameters listed under {#create_post} 118 | # @param blog [String] The standard or custom blog hostname 119 | # @param options [Hash] An optional options hash 120 | # @option options [String] :caption (nil) The user-supplied caption 121 | # @option options [String] :embed (nil) HTML embed code for the video 122 | # @option options [Faraday::UploadIO] :data (nil) A video file 123 | # @return [Hashie::Mash] 124 | def video(blog, options = {}) 125 | create_post(blog, options.merge(:type => :video)) 126 | end 127 | 128 | # Edit a Blog Post 129 | # 130 | # @see http://www.tumblr.com/docs/en/api/v2#editing 131 | # @authentication OAuth 132 | # @note This parameter is in addition to the common parameters listed under {#create_post} 133 | # @param blog [String] The standard or custom blog hostname 134 | # @param id [Integer] The ID of the post to edit 135 | # @return [Hashie::Mash] 136 | def edit(blog, id, options = {}) 137 | post("/v2/blog/#{blog}/post/edit", options.merge(:id => id)) 138 | end 139 | 140 | # Reblog a Post 141 | # 142 | # @see http://www.tumblr.com/docs/en/api/v2#reblogging 143 | # @authentication OAuth 144 | # @note This parameter is in addition to the common parameters listed under {#create_post} 145 | # @param blog [String] The standard or custom blog hostname 146 | # @param id [Integer] The ID of the reblogged post on tumblelog 147 | # @param reblog_key [String] The reblog key for the reblogged post – get the reblog key with a {#posts} request 148 | # @param comment [String] A comment added to the reblogged post 149 | # @return [Hashie::Mash] 150 | def reblog(blog, id, reblog_key, comment = nil) 151 | options = {:id => id, :reblog_key => reblog_key} 152 | options[:comment] = comment if comment 153 | post("/v2/blog/#{blog}/post/reblog", options) 154 | end 155 | 156 | # Delete a Post 157 | # 158 | # @see http://www.tumblr.com/docs/en/api/v2#deleting-posts 159 | # @authentication OAuth 160 | # @param blog [String] The standard or custom blog hostname 161 | # @param id [Integer] The ID of the post to delete 162 | # @return [Hashie::Mash] 163 | def delete(blog, id) 164 | post("/v2/blog/#{blog}/post/delete", :id => id) 165 | end 166 | end 167 | end 168 | end 169 | -------------------------------------------------------------------------------- /spec/fixtures/dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "posts": [ 8 | { 9 | "blog_name": "mmtki", 10 | "id": 23365606981, 11 | "post_url": "http://mmtki.tumblr.com/post/23365606981/suicideblonde-margareth-mad-photographed-by", 12 | "slug": "suicideblonde-margareth-mad-photographed-by", 13 | "type": "photo", 14 | "date": "2012-05-19 19:30:19 GMT", 15 | "timestamp": 1337455819, 16 | "format": "html", 17 | "reblog_key": "ckOf8Mw2", 18 | "tags": [ 19 | 20 | ], 21 | "highlighted": [ 22 | 23 | ], 24 | "liked": false, 25 | "note_count": 682, 26 | "source_url": "http://suicideblonde.tumblr.com", 27 | "source_title": "suicideblonde", 28 | "caption": "

suicideblonde:

\n
\n

Margareth Madè photographed by Vincent Peters

\n
\n\n

2012-04-15

", 29 | "link_url": "http://suicideblonde.tumblr.com", 30 | "photos": [ 31 | { 32 | "caption": "", 33 | "alt_sizes": [ 34 | { 35 | "width": 1280, 36 | "height": 1707, 37 | "url": "http://25.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_1280.jpg" 38 | }, 39 | { 40 | "width": 500, 41 | "height": 667, 42 | "url": "http://25.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_500.jpg" 43 | }, 44 | { 45 | "width": 400, 46 | "height": 533, 47 | "url": "http://25.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_400.jpg" 48 | }, 49 | { 50 | "width": 250, 51 | "height": 333, 52 | "url": "http://24.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_250.jpg" 53 | }, 54 | { 55 | "width": 100, 56 | "height": 133, 57 | "url": "http://24.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_100.jpg" 58 | }, 59 | { 60 | "width": 75, 61 | "height": 75, 62 | "url": "http://24.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_75sq.jpg" 63 | } 64 | ], 65 | "original_size": { 66 | "width": 1280, 67 | "height": 1707, 68 | "url": "http://25.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_1280.jpg" 69 | } 70 | } 71 | ], 72 | "can_reply": false 73 | }, 74 | { 75 | "blog_name": "mmtki", 76 | "id": 23363958388, 77 | "post_url": "http://mmtki.tumblr.com/post/23363958388/2012-01-23", 78 | "slug": "2012-01-23", 79 | "type": "photo", 80 | "date": "2012-05-19 19:00:25 GMT", 81 | "timestamp": 1337454025, 82 | "format": "html", 83 | "reblog_key": "F7EQLHbo", 84 | "tags": [ 85 | 86 | ], 87 | "highlighted": [ 88 | 89 | ], 90 | "liked": false, 91 | "note_count": 8982, 92 | "source_url": "http://dazhahs.tumblr.com/post/15945503860", 93 | "source_title": "dazhahs", 94 | "caption": "

2012-01-23

", 95 | "photos": [ 96 | { 97 | "caption": "", 98 | "alt_sizes": [ 99 | { 100 | "width": 500, 101 | "height": 667, 102 | "url": "http://25.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_500.jpg" 103 | }, 104 | { 105 | "width": 400, 106 | "height": 534, 107 | "url": "http://24.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_400.jpg" 108 | }, 109 | { 110 | "width": 250, 111 | "height": 334, 112 | "url": "http://24.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_250.jpg" 113 | }, 114 | { 115 | "width": 100, 116 | "height": 133, 117 | "url": "http://24.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_100.jpg" 118 | }, 119 | { 120 | "width": 75, 121 | "height": 75, 122 | "url": "http://25.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_75sq.jpg" 123 | } 124 | ], 125 | "original_size": { 126 | "width": 500, 127 | "height": 667, 128 | "url": "http://25.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_500.jpg" 129 | } 130 | } 131 | ], 132 | "can_reply": false 133 | }, 134 | { 135 | "blog_name": "mmtki", 136 | "id": 23357312954, 137 | "post_url": "http://mmtki.tumblr.com/post/23357312954/2011-09-18", 138 | "slug": "2011-09-18", 139 | "type": "photo", 140 | "date": "2012-05-19 17:00:26 GMT", 141 | "timestamp": 1337446826, 142 | "format": "html", 143 | "reblog_key": "TQ54qLM7", 144 | "tags": [ 145 | 146 | ], 147 | "highlighted": [ 148 | 149 | ], 150 | "liked": false, 151 | "note_count": 1565, 152 | "caption": "

2011-09-18

", 153 | "link_url": "http://enesetapp.tumblr.com/post/9258823118", 154 | "photos": [ 155 | { 156 | "caption": "", 157 | "alt_sizes": [ 158 | { 159 | "width": 700, 160 | "height": 506, 161 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_500.jpg" 162 | }, 163 | { 164 | "width": 500, 165 | "height": 361, 166 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_500.jpg" 167 | }, 168 | { 169 | "width": 400, 170 | "height": 289, 171 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_400.jpg" 172 | }, 173 | { 174 | "width": 250, 175 | "height": 181, 176 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_250.jpg" 177 | }, 178 | { 179 | "width": 100, 180 | "height": 72, 181 | "url": "http://25.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_100.jpg" 182 | }, 183 | { 184 | "width": 75, 185 | "height": 75, 186 | "url": "http://25.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_75sq.jpg" 187 | } 188 | ], 189 | "original_size": { 190 | "width": 700, 191 | "height": 506, 192 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_500.jpg" 193 | } 194 | } 195 | ], 196 | "can_reply": false 197 | }, 198 | { 199 | "blog_name": "mmtki", 200 | "id": 23354168264, 201 | "post_url": "http://mmtki.tumblr.com/post/23354168264/126-2009-01-28-07-49-34", 202 | "slug": "126-2009-01-28-07-49-34", 203 | "type": "quote", 204 | "date": "2012-05-19 16:00:25 GMT", 205 | "timestamp": 1337443225, 206 | "format": "html", 207 | "reblog_key": "iQnz6vba", 208 | "tags": [ 209 | 210 | ], 211 | "highlighted": [ 212 | 213 | ], 214 | "liked": false, 215 | "note_count": 959, 216 | "source_url": "http://petapeta.tumblr.com/post/1396987746/126-2009-01-28-07-49-34", 217 | "source_title": "petapeta", 218 | "text": "

126 名刺は切らしておりまして :2009/01/28(水) 07:49:34 ID:6Yqg40sQ

サバイバルはやってみたいな
\n社会が崩壊した時どうやって生き延びることができるのか体験してみたい

130 名刺は切らしておりまして :2009/01/28(水) 07:53:38 ID:WBxw2oDO
»126 
\n最低限水の確保の仕方とコレラ予防さえ知っておけば犬死にすることはない。
\nあとはまあ鉄則中の鉄則だけど、川&海沿い、湖など、とにかく水辺には出ないこと。
\nどうしても自然の水源が欲しいなら沢確保で。

133 名刺は切らしておりまして :2009/01/28(水) 07:57:51 ID:6Yqg40sQ
»130 
\n水辺に出ないってのは何故ですかい?

139 名刺は切らしておりまして :2009/01/28(水) 08:06:37 ID:WBxw2oDO
»133 
\n1.水の確保の仕方を知らないパンピーは100%水場へ群がる。
\n2.衛生状態が悪くなって確実にコレラが流行る。ついでに大腸菌。
\n3.煮沸でもおっつかなくなる、喧嘩が始まる~エスカレート

\n教訓「誰もが思いつく手は最悪よりも悪い手である」
", 219 | "source": "社会が崩壊した時に生き延びる方法:アルファルファモザイクだった (via petapeta)\n\n

2010-10-25

", 220 | "can_reply": false 221 | }, 222 | { 223 | "blog_name": "mmtki", 224 | "id": 23352664376, 225 | "post_url": "http://mmtki.tumblr.com/post/23352664376/2011-07-31", 226 | "slug": "2011-07-31", 227 | "type": "photo", 228 | "date": "2012-05-19 15:30:40 GMT", 229 | "timestamp": 1337441440, 230 | "format": "html", 231 | "reblog_key": "Ya45S7eJ", 232 | "tags": [ 233 | 234 | ], 235 | "highlighted": [ 236 | 237 | ], 238 | "liked": false, 239 | "note_count": 21926, 240 | "source_url": "http://massacra.tumblr.com/", 241 | "source_title": "massacra", 242 | "caption": "

2011-07-31

", 243 | "link_url": "http://massacra.tumblr.com/", 244 | "photos": [ 245 | { 246 | "caption": "", 247 | "alt_sizes": [ 248 | { 249 | "width": 500, 250 | "height": 266, 251 | "url": "http://24.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_500.gif" 252 | }, 253 | { 254 | "width": 400, 255 | "height": 213, 256 | "url": "http://25.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_400.gif" 257 | }, 258 | { 259 | "width": 250, 260 | "height": 133, 261 | "url": "http://24.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_250.gif" 262 | }, 263 | { 264 | "width": 100, 265 | "height": 53, 266 | "url": "http://25.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_100.gif" 267 | }, 268 | { 269 | "width": 75, 270 | "height": 75, 271 | "url": "http://25.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_75sq.gif" 272 | } 273 | ], 274 | "original_size": { 275 | "width": 500, 276 | "height": 266, 277 | "url": "http://24.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_500.gif" 278 | } 279 | } 280 | ], 281 | "can_reply": false 282 | }, 283 | { 284 | "blog_name": "mmtki", 285 | "id": 23351194572, 286 | "post_url": "http://mmtki.tumblr.com/post/23351194572/non117-picapixels", 287 | "slug": "non117-picapixels", 288 | "type": "photo", 289 | "date": "2012-05-19 15:01:29 GMT", 290 | "timestamp": 1337439689, 291 | "format": "html", 292 | "reblog_key": "yFrNiPDD", 293 | "tags": [ 294 | 295 | ], 296 | "highlighted": [ 297 | 298 | ], 299 | "liked": false, 300 | "note_count": 556, 301 | "source_url": "http://picapixels.tumblr.com/post/400518128", 302 | "source_title": "picapixels", 303 | "caption": "

non117:

\n\n

picapixels:

\n
\n

メイド + ニーソ : 《神聖不可侵の聖域》絶対領域の神秘世界《ミニスカ!ニーソ!》

\n
\n\n

2010-02-20

", 304 | "link_url": "http://matome.naver.jp/odai/2125954904574166100/2125954915947483400", 305 | "photos": [ 306 | { 307 | "caption": "", 308 | "alt_sizes": [ 309 | { 310 | "width": 600, 311 | "height": 800, 312 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_1280.jpg" 313 | }, 314 | { 315 | "width": 500, 316 | "height": 667, 317 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_500.jpg" 318 | }, 319 | { 320 | "width": 400, 321 | "height": 533, 322 | "url": "http://24.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_400.jpg" 323 | }, 324 | { 325 | "width": 250, 326 | "height": 333, 327 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_250.jpg" 328 | }, 329 | { 330 | "width": 100, 331 | "height": 133, 332 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_100.jpg" 333 | }, 334 | { 335 | "width": 75, 336 | "height": 75, 337 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_75sq.jpg" 338 | } 339 | ], 340 | "original_size": { 341 | "width": 600, 342 | "height": 800, 343 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_1280.jpg" 344 | } 345 | } 346 | ], 347 | "can_reply": false 348 | }, 349 | { 350 | "blog_name": "mmtki", 351 | "id": 23347274003, 352 | "post_url": "http://mmtki.tumblr.com/post/23347274003/2011-04-24", 353 | "slug": "2011-04-24", 354 | "type": "photo", 355 | "date": "2012-05-19 13:30:19 GMT", 356 | "timestamp": 1337434219, 357 | "format": "html", 358 | "reblog_key": "zS2Y4lUD", 359 | "tags": [ 360 | 361 | ], 362 | "highlighted": [ 363 | 364 | ], 365 | "liked": false, 366 | "note_count": 9663, 367 | "source_url": "http://vivasuvida.tumblr.com/post/4704814644/chanel-nailpolish-love-xx", 368 | "source_title": "vivasuvida", 369 | "caption": "

2011-04-24

", 370 | "link_url": "http://vivasuvida.tumblr.com/post/4704814644", 371 | "photos": [ 372 | { 373 | "caption": "", 374 | "alt_sizes": [ 375 | { 376 | "width": 480, 377 | "height": 374, 378 | "url": "http://24.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_500.gif" 379 | }, 380 | { 381 | "width": 400, 382 | "height": 312, 383 | "url": "http://25.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_400.gif" 384 | }, 385 | { 386 | "width": 250, 387 | "height": 195, 388 | "url": "http://24.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_250.gif" 389 | }, 390 | { 391 | "width": 100, 392 | "height": 78, 393 | "url": "http://25.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_100.gif" 394 | }, 395 | { 396 | "width": 75, 397 | "height": 75, 398 | "url": "http://25.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_75sq.gif" 399 | } 400 | ], 401 | "original_size": { 402 | "width": 480, 403 | "height": 374, 404 | "url": "http://24.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_500.gif" 405 | } 406 | } 407 | ], 408 | "can_reply": false 409 | }, 410 | { 411 | "blog_name": "mmtki", 412 | "id": 23346246679, 413 | "post_url": "http://mmtki.tumblr.com/post/23346246679/nordmeerstrasse", 414 | "slug": "nordmeerstrasse", 415 | "type": "quote", 416 | "date": "2012-05-19 13:00:19 GMT", 417 | "timestamp": 1337432419, 418 | "format": "html", 419 | "reblog_key": "0w6NYoHu", 420 | "tags": [ 421 | 422 | ], 423 | "highlighted": [ 424 | 425 | ], 426 | "liked": false, 427 | "note_count": 631, 428 | "source_url": "http://deutsch.ironsand.net/2011/japanische-praefekturen-auf-deutsche/", 429 | "source_title": "deutsch.ironsand.net", 430 | "text": "

都道府県をドイツ語にしてみた

\n\n

北海道:Nordmeerstraße(ノートメアシュトラーセ)
\n青森:Blauwald(ブラウヴァルト)
\n岩手:Felsenhand(フェルゼンハント)
\n宮城:Palastburg(パラストブルク)
\n秋田:Herbstfeld(ヘァブストフェスト)
\n山形:Bergform(ベルクフォルム)
\n福島:Glückinsel(グリュックスインゼル)
\n茨城:Rosenburg(ローゼンブルグ)
\n栃木:Rosskastanie(ロスカスタニエ)
\n群馬:Pferdeherde(フェアデヘルデ)
\n埼玉:Kapskugel(カップスクーゲル)
\n千葉:Tausendeblätter(タウゼンデブレッダー)
\n東京:Osthauptstadt(オストハウプトシュタット)
\n神奈川 Gottesfluß(ゴッテスフルス)
\n新潟:Neuelagune(ノイエラグーネ)
\n富山:ReichenBerg(ライヘンベルク)
\n石川:Steinfluß(シュタインフルス)
\n福井:Glückesbrunnen(グリュックスブルネン)
\n山梨:Birnenberg(ビルネンべルク)
\n長野:Langenfeld(ランゲンフェルト)
\n岐阜:Gabelunghügel(ガーベルングスヒューゲル)
\n静岡:Stillenhügel(シュティレンヒューゲル)
\n愛知:Liebewissen(リーベヴィッセン)
\n三重:Dreifach(ドライファッハ)
\n滋賀:Nahhaftesfeier(ナーハフテスファイア)
\n京都:Edelhauptstadt(エーデルハウプトシュタット)
\n大阪:Großenhang(グローセンハンク)
\n兵庫:Soldatenlager(ゾルダーテンラーゲー)
\n奈良:Allesgute(アレスグーテ)
\n和歌山:Friedenliedberg(フリーデンリートベルク)
\n鳥取:Vogeljagd(フォーゲルヤクト)
\n島根:InselsWurzel(インゼルスブルツェル)
\n岡山:Hügelberg(ヒューゲルベルク)
\n広島:Großeinsel(グローセインゼル)
\n山口:Bergmund(ベルクムント)
\n徳島:Tugendinsel(トゥーゲントインゼル)
\n香川:Duftenfluß(ドゥフテンフルス)
\n愛媛:Liebesprinzessin(リーベスプリンツェッシン)
\n高知:hochwissen(ホッホヴィッセン)

\n\n

福岡:Glückshügel(グリュックスヒューゲル)
\n佐賀:Hilfenfeier(ヒルフェンファイア)
\n長崎:Langenkap(ランゲンカップ)
\n熊本:Bärgrund(ベアグルント)
\n大分:Großeteilung(グローセタイルング)
\n宮崎:Palastkap(パラストカップ)
\n鹿児島:Hirschlingsinsel(ヒルシュリングスインゼル)
\n沖縄:Meerseile(メアザイレ)

\n\n

和歌山はわざと曲解してます。

", 431 | "source": "

ドイツ語学習帳 in Deutschland » 都道府県をドイツ語にしてみた (via hujisato)

\n

ドイツ語の語感の良さは異常

(via y-u)\n\n

2011-09-12

", 432 | "can_reply": false 433 | }, 434 | { 435 | "blog_name": "mmtki", 436 | "id": 23344549430, 437 | "post_url": "http://mmtki.tumblr.com/post/23344549430/2011-06-29", 438 | "slug": "2011-06-29", 439 | "type": "photo", 440 | "date": "2012-05-19 12:00:18 GMT", 441 | "timestamp": 1337428818, 442 | "format": "html", 443 | "reblog_key": "D38XrlUj", 444 | "tags": [ 445 | 446 | ], 447 | "highlighted": [ 448 | 449 | ], 450 | "liked": false, 451 | "note_count": 5126, 452 | "source_url": "http://d---ope.tumblr.com/post/6732333678", 453 | "source_title": "d---ope", 454 | "caption": "

2011-06-29

", 455 | "link_url": "http://comequietlyleavescreaming.tumblr.com/post/6732333678", 456 | "photos": [ 457 | { 458 | "caption": "", 459 | "alt_sizes": [ 460 | { 461 | "width": 640, 462 | "height": 427, 463 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_1280.png" 464 | }, 465 | { 466 | "width": 500, 467 | "height": 334, 468 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_500.png" 469 | }, 470 | { 471 | "width": 400, 472 | "height": 267, 473 | "url": "http://25.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_400.png" 474 | }, 475 | { 476 | "width": 250, 477 | "height": 167, 478 | "url": "http://25.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_250.png" 479 | }, 480 | { 481 | "width": 100, 482 | "height": 67, 483 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_100.png" 484 | }, 485 | { 486 | "width": 75, 487 | "height": 75, 488 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_75sq.png" 489 | } 490 | ], 491 | "original_size": { 492 | "width": 640, 493 | "height": 427, 494 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_1280.png" 495 | } 496 | } 497 | ], 498 | "can_reply": false 499 | }, 500 | { 501 | "blog_name": "mmtki", 502 | "id": 23343833812, 503 | "post_url": "http://mmtki.tumblr.com/post/23343833812/nkym-kafka-0-on-twitpic", 504 | "slug": "nkym-kafka-0-on-twitpic", 505 | "type": "photo", 506 | "date": "2012-05-19 11:30:19 GMT", 507 | "timestamp": 1337427019, 508 | "format": "html", 509 | "reblog_key": "ztA1I4rN", 510 | "tags": [ 511 | 512 | ], 513 | "highlighted": [ 514 | 515 | ], 516 | "liked": false, 517 | "note_count": 1047, 518 | "source_url": "http://nkym.tumblr.com/post/16231348486/kafka-0-on-twitpic", 519 | "source_title": "nkym", 520 | "caption": "

nkym:

\n
\n

kafka_0: さかなハコください… on Twitpic

\n
\n\n

2012-01-23

", 521 | "photos": [ 522 | { 523 | "caption": "", 524 | "alt_sizes": [ 525 | { 526 | "width": 300, 527 | "height": 605, 528 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_500.jpg" 529 | }, 530 | { 531 | "width": 298, 532 | "height": 600, 533 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_400.jpg" 534 | }, 535 | { 536 | "width": 198, 537 | "height": 400, 538 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_250.jpg" 539 | }, 540 | { 541 | "width": 99, 542 | "height": 200, 543 | "url": "http://25.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_100.jpg" 544 | }, 545 | { 546 | "width": 75, 547 | "height": 75, 548 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_75sq.jpg" 549 | } 550 | ], 551 | "original_size": { 552 | "width": 300, 553 | "height": 605, 554 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_500.jpg" 555 | } 556 | } 557 | ], 558 | "can_reply": false 559 | }, 560 | { 561 | "blog_name": "mmtki", 562 | "id": 23343177145, 563 | "post_url": "http://mmtki.tumblr.com/post/23343177145", 564 | "slug": "", 565 | "type": "quote", 566 | "date": "2012-05-19 11:00:18 GMT", 567 | "timestamp": 1337425218, 568 | "format": "html", 569 | "reblog_key": "o0J14dT8", 570 | "tags": [ 571 | 572 | ], 573 | "highlighted": [ 574 | 575 | ], 576 | "liked": false, 577 | "note_count": 630, 578 | "source_url": "http://vmconverter.tumblr.com/post/96766504", 579 | "source_title": "vmconverter", 580 | "text": "

「育児雑誌の特集号についている離乳食は、主婦を専業にしている母親の趣味をみたすようにできているので、実用的でない。すり鉢ですったりする料理がおおいのは、調理が趣味である母親を満足させるためである。」
\n(文庫版『定本育児の百科 中』p.65)

\n\n

「ところが、赤ちゃんに楽しい人生を用意しようとしないで、義務の人生をおしつける母親がおおい。(中略)離乳食献立と首っぴきで、離乳食をつくり、毎日これだけは、ぜひ食べさせようと努力する。赤ちゃんが離乳食を食べてくれればよろこび、食べてくれないと悲しむ。こういう母親は、赤ちゃんに1日何カロリー食べさせたかを計算するが、赤ちゃんに今日は、どれだけ楽しい思いをさせたかということをかんがえない」
\n(同前p.115)

\n\n

「食事は栄養さえたりていればなるべく簡単にすませて、生活を楽しむことに時間をついやすという人間の生き方に、赤ちゃんもならさねばならぬ。ごはんを食べたがらぬ子には、副食に十分の動物性タンパク(魚、卵、牛肉、豚肉、鶏肉)を与えればよい。それも食べないなら、ミルクや牛乳を今までのようにつづけていい。」
\n(同前、p.412)

\n\n

 離乳食より楽しい人生。こんなことを言ってくれる育児書がほかにあるだろうか。

", 581 | "source": "

Webマガジン幻冬舎

\n

そうそう。

\n

巷の離乳食本とか見ると「お前らどんだけ暇なんだよw」と思う。

\n

ここら辺、西原理恵子の食育話とかの「手作り信仰」と根っこは変わらんと思うよ。

\n

(via vmconverter) 2009-04-16 (via gkojay) (via mnak)

\n

(via ipodstyle) 2010-04-26 (via gkojay) (via oosawatechnica) (via s-wool) (via ishida) (via soothingnoise)

\n

(via tkashiwagi)

(via nowsprinting)\n\n

2011-01-14

", 582 | "can_reply": false 583 | }, 584 | { 585 | "blog_name": "mmtki", 586 | "id": 23342559867, 587 | "post_url": "http://mmtki.tumblr.com/post/23342559867/tumblr", 588 | "slug": "tumblr", 589 | "type": "quote", 590 | "date": "2012-05-19 10:30:23 GMT", 591 | "timestamp": 1337423423, 592 | "format": "html", 593 | "reblog_key": "2yJ8B53w", 594 | "tags": [ 595 | 596 | ], 597 | "highlighted": [ 598 | 599 | ], 600 | "liked": false, 601 | "note_count": 719, 602 | "source_url": "http://joriko.tumblr.com/post/3523997044/tumblr", 603 | "source_title": "joriko", 604 | "text": "「Tumblrの一番面白ところはどこですか?」 「名言をいくらreblogしても現実はまったく変わらないところですね」", 605 | "source": "Twitter / RPM (via joriko)\n\n

2011-03-08

", 606 | "can_reply": false 607 | }, 608 | { 609 | "blog_name": "mmtki", 610 | "id": 23340817566, 611 | "post_url": "http://mmtki.tumblr.com/post/23340817566/c-c", 612 | "slug": "c-c", 613 | "type": "quote", 614 | "date": "2012-05-19 09:00:20 GMT", 615 | "timestamp": 1337418020, 616 | "format": "html", 617 | "reblog_key": "ONA9nSSc", 618 | "tags": [ 619 | 620 | ], 621 | "highlighted": [ 622 | 623 | ], 624 | "liked": false, 625 | "note_count": 996, 626 | "source_url": "http://sayusayukawaii.tumblr.com/post/15770884636/584-vip-2012-01-12", 627 | "source_title": "sayusayukawaii", 628 | "text": "「レモン○○個分のビタミンC」という表現は多用されているが、実はレモンはジャガイモよりビタミンC含有率が低い。", 629 | "source": "あまり知られていないトリビア:哲学ニュースnwk (via shibata616)\n\n

2012-01-15

", 630 | "can_reply": false 631 | }, 632 | { 633 | "blog_name": "mmtki", 634 | "id": 23340236379, 635 | "post_url": "http://mmtki.tumblr.com/post/23340236379/vhodnk-2-10-2012-03-30", 636 | "slug": "vhodnk-2-10-2012-03-30", 637 | "type": "photo", 638 | "date": "2012-05-19 08:30:21 GMT", 639 | "timestamp": 1337416221, 640 | "format": "html", 641 | "reblog_key": "TLQTJuCg", 642 | "tags": [ 643 | 644 | ], 645 | "highlighted": [ 646 | 647 | ], 648 | "liked": false, 649 | "note_count": 541, 650 | "source_url": "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=26161254", 651 | "source_title": "pixiv.net", 652 | "caption": "

vhodnk:

\n
\n

双葉杏は働かない2 [10]

\n
\n\n

2012-03-30

", 653 | "link_url": "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=26161254", 654 | "photos": [ 655 | { 656 | "caption": "", 657 | "alt_sizes": [ 658 | { 659 | "width": 900, 660 | "height": 1200, 661 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_1280.jpg" 662 | }, 663 | { 664 | "width": 500, 665 | "height": 667, 666 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_500.jpg" 667 | }, 668 | { 669 | "width": 400, 670 | "height": 533, 671 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_400.jpg" 672 | }, 673 | { 674 | "width": 250, 675 | "height": 333, 676 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_250.jpg" 677 | }, 678 | { 679 | "width": 100, 680 | "height": 133, 681 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_100.jpg" 682 | }, 683 | { 684 | "width": 75, 685 | "height": 75, 686 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_75sq.jpg" 687 | } 688 | ], 689 | "original_size": { 690 | "width": 900, 691 | "height": 1200, 692 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_1280.jpg" 693 | } 694 | } 695 | ], 696 | "can_reply": false 697 | }, 698 | { 699 | "blog_name": "mmtki", 700 | "id": 23339636887, 701 | "post_url": "http://mmtki.tumblr.com/post/23339636887/a", 702 | "slug": "a", 703 | "type": "quote", 704 | "date": "2012-05-19 08:00:20 GMT", 705 | "timestamp": 1337414420, 706 | "format": "html", 707 | "reblog_key": "a4BvwSoI", 708 | "tags": [ 709 | 710 | ], 711 | "highlighted": [ 712 | 713 | ], 714 | "liked": false, 715 | "note_count": 829, 716 | "source_url": "http://deepspeed.tumblr.com/post/6710231232/a", 717 | "source_title": "deepspeed", 718 | "text": "

友達Aと地下鉄に乗ってたら、同じ車両にいた池沼が
\n大学生っぽい女の子の肩をグーで殴りながら奇声を上げだした。
\n女の子が「やめて下さい!」って言ってるのにニヤニヤしながら続行。
\nキレた女の子が池沼の腕掴んで「やめろって言ってるでしょ!」と
\n怒鳴ったら池沼の飼い主が現れて(ってか、ずっと隣にいたらしい)
\n「○○ちゃんはハンデキャップもってるのよ!もっと思いやり(ry」と
\n教科書どおりのセリフで逆切れしてた。

\n\n


\nそれを聞いたAが急に奇声を上げながら飼い主の肩を数発ほど殴り、
\n次に池沼の頬を両手でバシンバシン挟むように叩き出した。
\n「なにするの!」と飼い主の怒りがこちらに向いちゃったので
\n「すみません、弟はちょっとハンデキャップもちなもので」と言ってから
\n「こらA!知らない人ぶったらダメだろ!!」とAにゲンコツして
\n「あやまりなさい!」と促した。
\nAはたどたどしく「ごめんなさい」と池沼親子に謝り、俺も周りの人に
\n「お騒がせして申し訳ありません」と頭を下げる小芝居をしたら、
\n池沼の飼い主は顔赤くしてプルプルしながら沈黙した。

\n\n


\nその後、Aに何で急に池沼のフリして暴れんだよ、と聞いたら
\n「ああいう類は、自分がされなきゃわかんねーんだよ」と
\nDQNだけど男らしいお答えをいただき、ちょっとかっこいいと思ってしまった。
\nでも、その後「おまえもとっさに演技してたじゃん、弟はハンデキャップ持ちってw」
\n「なんだよハンデキャップってw」と笑うAに
\n「だってお前包茎じゃん」と真顔で言ったら奇声を上げながら殴られた。

", 719 | "source": "No.25553 ハンデキャップ - コピペ運動会 (via deepspeed)
2011-08-16 (via gkojax-text)\n\n

2011-08-19

", 720 | "can_reply": false 721 | }, 722 | { 723 | "blog_name": "mmtki", 724 | "id": 23338329362, 725 | "post_url": "http://mmtki.tumblr.com/post/23338329362", 726 | "slug": "", 727 | "type": "quote", 728 | "date": "2012-05-19 07:00:19 GMT", 729 | "timestamp": 1337410819, 730 | "format": "html", 731 | "reblog_key": "yKFIeB2Y", 732 | "tags": [ 733 | 734 | ], 735 | "highlighted": [ 736 | 737 | ], 738 | "liked": false, 739 | "note_count": 842, 740 | "source_url": "http://dannnao.tumblr.com/post/37296142", 741 | "source_title": "dannnao", 742 | "text": "硫化水素自殺や電車に飛び込んで死ぬ人に対して「迷惑をかけずに死ね」っていう人がいるけど、自分の感想はむしろ「ああ、この人は死ぬときくらいしか迷惑かけられなかったんだな」と思うことがある。", 743 | "source": "Twitter / esehara (via inujita, dannnao) (via kazukij) (via mmmmmmmmmy) (via mog-mog)\n\n

2011-07-10

", 744 | "can_reply": false 745 | }, 746 | { 747 | "blog_name": "mmtki", 748 | "id": 23337565094, 749 | "post_url": "http://mmtki.tumblr.com/post/23337565094/2011-12-17", 750 | "slug": "2011-12-17", 751 | "type": "photo", 752 | "date": "2012-05-19 06:30:20 GMT", 753 | "timestamp": 1337409020, 754 | "format": "html", 755 | "reblog_key": "HC4saOZo", 756 | "tags": [ 757 | 758 | ], 759 | "highlighted": [ 760 | 761 | ], 762 | "liked": false, 763 | "note_count": 3328, 764 | "source_url": "http://vvulf.tumblr.com", 765 | "source_title": "vvulf", 766 | "caption": "

2011-12-17

", 767 | "link_url": "http://vvulf.tumblr.com", 768 | "photos": [ 769 | { 770 | "caption": "", 771 | "alt_sizes": [ 772 | { 773 | "width": 500, 774 | "height": 281, 775 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_500.gif" 776 | }, 777 | { 778 | "width": 400, 779 | "height": 225, 780 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_400.gif" 781 | }, 782 | { 783 | "width": 250, 784 | "height": 141, 785 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_250.gif" 786 | }, 787 | { 788 | "width": 100, 789 | "height": 56, 790 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_100.gif" 791 | }, 792 | { 793 | "width": 75, 794 | "height": 75, 795 | "url": "http://24.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_75sq.gif" 796 | } 797 | ], 798 | "original_size": { 799 | "width": 500, 800 | "height": 281, 801 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_500.gif" 802 | } 803 | } 804 | ], 805 | "can_reply": false 806 | }, 807 | { 808 | "blog_name": "mmtki", 809 | "id": 23336683103, 810 | "post_url": "http://mmtki.tumblr.com/post/23336683103/2012-02-18", 811 | "slug": "2012-02-18", 812 | "type": "photo", 813 | "date": "2012-05-19 06:00:25 GMT", 814 | "timestamp": 1337407225, 815 | "format": "html", 816 | "reblog_key": "oNNPiUvF", 817 | "tags": [ 818 | 819 | ], 820 | "highlighted": [ 821 | 822 | ], 823 | "liked": false, 824 | "note_count": 545, 825 | "source_url": "http://filthygifs.tumblr.com/post/16478624408/rosie-lose-that-bra", 826 | "source_title": "filthygifs", 827 | "caption": "

2012-02-18

", 828 | "photoset_layout": 332, 829 | "photos": [ 830 | { 831 | "caption": "", 832 | "alt_sizes": [ 833 | { 834 | "width": 165, 835 | "height": 288, 836 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo1_250.gif" 837 | }, 838 | { 839 | "width": 100, 840 | "height": 175, 841 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo1_100.gif" 842 | }, 843 | { 844 | "width": 75, 845 | "height": 75, 846 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo1_75sq.gif" 847 | } 848 | ], 849 | "original_size": { 850 | "width": 165, 851 | "height": 288, 852 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo1_250.gif" 853 | } 854 | }, 855 | { 856 | "caption": "", 857 | "alt_sizes": [ 858 | { 859 | "width": 165, 860 | "height": 288, 861 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo2_250.gif" 862 | }, 863 | { 864 | "width": 100, 865 | "height": 175, 866 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo2_100.gif" 867 | }, 868 | { 869 | "width": 75, 870 | "height": 75, 871 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo2_75sq.gif" 872 | } 873 | ], 874 | "original_size": { 875 | "width": 165, 876 | "height": 288, 877 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo2_250.gif" 878 | } 879 | }, 880 | { 881 | "caption": "", 882 | "alt_sizes": [ 883 | { 884 | "width": 165, 885 | "height": 288, 886 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo3_250.gif" 887 | }, 888 | { 889 | "width": 100, 890 | "height": 175, 891 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo3_100.gif" 892 | }, 893 | { 894 | "width": 75, 895 | "height": 75, 896 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo3_75sq.gif" 897 | } 898 | ], 899 | "original_size": { 900 | "width": 165, 901 | "height": 288, 902 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo3_250.gif" 903 | } 904 | }, 905 | { 906 | "caption": "", 907 | "alt_sizes": [ 908 | { 909 | "width": 165, 910 | "height": 288, 911 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo4_250.gif" 912 | }, 913 | { 914 | "width": 100, 915 | "height": 175, 916 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo4_100.gif" 917 | }, 918 | { 919 | "width": 75, 920 | "height": 75, 921 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo4_75sq.gif" 922 | } 923 | ], 924 | "original_size": { 925 | "width": 165, 926 | "height": 288, 927 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo4_250.gif" 928 | } 929 | }, 930 | { 931 | "caption": "", 932 | "alt_sizes": [ 933 | { 934 | "width": 165, 935 | "height": 288, 936 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo5_250.gif" 937 | }, 938 | { 939 | "width": 100, 940 | "height": 175, 941 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo5_100.gif" 942 | }, 943 | { 944 | "width": 75, 945 | "height": 75, 946 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo5_75sq.gif" 947 | } 948 | ], 949 | "original_size": { 950 | "width": 165, 951 | "height": 288, 952 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo5_250.gif" 953 | } 954 | }, 955 | { 956 | "caption": "", 957 | "alt_sizes": [ 958 | { 959 | "width": 165, 960 | "height": 288, 961 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo6_250.gif" 962 | }, 963 | { 964 | "width": 100, 965 | "height": 175, 966 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo6_100.gif" 967 | }, 968 | { 969 | "width": 75, 970 | "height": 75, 971 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo6_75sq.gif" 972 | } 973 | ], 974 | "original_size": { 975 | "width": 165, 976 | "height": 288, 977 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo6_250.gif" 978 | } 979 | }, 980 | { 981 | "caption": "", 982 | "alt_sizes": [ 983 | { 984 | "width": 165, 985 | "height": 288, 986 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo7_250.gif" 987 | }, 988 | { 989 | "width": 100, 990 | "height": 175, 991 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo7_100.gif" 992 | }, 993 | { 994 | "width": 75, 995 | "height": 75, 996 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo7_75sq.gif" 997 | } 998 | ], 999 | "original_size": { 1000 | "width": 165, 1001 | "height": 288, 1002 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo7_250.gif" 1003 | } 1004 | }, 1005 | { 1006 | "caption": "", 1007 | "alt_sizes": [ 1008 | { 1009 | "width": 165, 1010 | "height": 288, 1011 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo8_250.gif" 1012 | }, 1013 | { 1014 | "width": 100, 1015 | "height": 175, 1016 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo8_100.gif" 1017 | }, 1018 | { 1019 | "width": 75, 1020 | "height": 75, 1021 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo8_75sq.gif" 1022 | } 1023 | ], 1024 | "original_size": { 1025 | "width": 165, 1026 | "height": 288, 1027 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo8_250.gif" 1028 | } 1029 | } 1030 | ], 1031 | "can_reply": false 1032 | }, 1033 | { 1034 | "blog_name": "mmtki", 1035 | "id": 23335670574, 1036 | "post_url": "http://mmtki.tumblr.com/post/23335670574/mitolier-http-aozora-jugem-cc-2010-12-12", 1037 | "slug": "mitolier-http-aozora-jugem-cc-2010-12-12", 1038 | "type": "photo", 1039 | "date": "2012-05-19 05:30:21 GMT", 1040 | "timestamp": 1337405421, 1041 | "format": "html", 1042 | "reblog_key": "ZU8UA0b3", 1043 | "tags": [ 1044 | 1045 | ], 1046 | "highlighted": [ 1047 | 1048 | ], 1049 | "liked": false, 1050 | "note_count": 674, 1051 | "source_url": "http://mitolier.tumblr.com/post/2184500895/http-aozora-jugem-cc", 1052 | "source_title": "mitolier", 1053 | "caption": "

mitolier:

\n\n

http://aozora.jugem.cc/

\n\n

2010-12-12

", 1054 | "photos": [ 1055 | { 1056 | "caption": "", 1057 | "alt_sizes": [ 1058 | { 1059 | "width": 510, 1060 | "height": 510, 1061 | "url": "http://24.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_1280.jpg" 1062 | }, 1063 | { 1064 | "width": 500, 1065 | "height": 500, 1066 | "url": "http://24.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_500.jpg" 1067 | }, 1068 | { 1069 | "width": 400, 1070 | "height": 400, 1071 | "url": "http://24.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_400.jpg" 1072 | }, 1073 | { 1074 | "width": 250, 1075 | "height": 250, 1076 | "url": "http://25.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_250.jpg" 1077 | }, 1078 | { 1079 | "width": 100, 1080 | "height": 100, 1081 | "url": "http://25.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_100.jpg" 1082 | }, 1083 | { 1084 | "width": 75, 1085 | "height": 75, 1086 | "url": "http://25.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_75sq.jpg" 1087 | } 1088 | ], 1089 | "original_size": { 1090 | "width": 510, 1091 | "height": 510, 1092 | "url": "http://24.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_1280.jpg" 1093 | } 1094 | } 1095 | ], 1096 | "can_reply": false 1097 | }, 1098 | { 1099 | "blog_name": "mmtki", 1100 | "id": 23334512540, 1101 | "post_url": "http://mmtki.tumblr.com/post/23334512540/blendy999-stars-2011-06-10", 1102 | "slug": "blendy999-stars-2011-06-10", 1103 | "type": "photo", 1104 | "date": "2012-05-19 05:00:18 GMT", 1105 | "timestamp": 1337403618, 1106 | "format": "html", 1107 | "reblog_key": "MAEs6AjS", 1108 | "tags": [ 1109 | 1110 | ], 1111 | "highlighted": [ 1112 | 1113 | ], 1114 | "liked": false, 1115 | "note_count": 6197, 1116 | "source_url": "http://weareuniverse.tumblr.com/post/5480736913/stars", 1117 | "source_title": "weareuniverse", 1118 | "caption": "

blendy999:

\n
\n

stars

\n
\n\n

2011-06-10

", 1119 | "link_url": "http://weareuniverse.tumblr.com/post/5480736913/stars", 1120 | "photos": [ 1121 | { 1122 | "caption": "", 1123 | "alt_sizes": [ 1124 | { 1125 | "width": 498, 1126 | "height": 574, 1127 | "url": "http://24.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_500.gif" 1128 | }, 1129 | { 1130 | "width": 400, 1131 | "height": 461, 1132 | "url": "http://24.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_400.gif" 1133 | }, 1134 | { 1135 | "width": 250, 1136 | "height": 288, 1137 | "url": "http://25.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_250.gif" 1138 | }, 1139 | { 1140 | "width": 100, 1141 | "height": 115, 1142 | "url": "http://25.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_100.gif" 1143 | }, 1144 | { 1145 | "width": 75, 1146 | "height": 75, 1147 | "url": "http://25.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_75sq.gif" 1148 | } 1149 | ], 1150 | "original_size": { 1151 | "width": 498, 1152 | "height": 574, 1153 | "url": "http://24.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_500.gif" 1154 | } 1155 | } 1156 | ], 1157 | "can_reply": false 1158 | } 1159 | ] 1160 | } 1161 | } 1162 | -------------------------------------------------------------------------------- /spec/fixtures/posts.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "status": 200, 4 | "msg": "OK" 5 | }, 6 | "response": { 7 | "blog": { 8 | "title": "Blue Planet", 9 | "posts": 6505, 10 | "name": "mmtki", 11 | "url": "http://mmtki.tumblr.com/", 12 | "updated": 1337455819, 13 | "description": "", 14 | "ask": false 15 | }, 16 | "posts": [ 17 | { 18 | "blog_name": "mmtki", 19 | "id": 23365606981, 20 | "post_url": "http://mmtki.tumblr.com/post/23365606981/suicideblonde-margareth-mad-photographed-by", 21 | "slug": "suicideblonde-margareth-mad-photographed-by", 22 | "type": "photo", 23 | "date": "2012-05-19 19:30:19 GMT", 24 | "timestamp": 1337455819, 25 | "format": "html", 26 | "reblog_key": "ckOf8Mw2", 27 | "tags": [ 28 | 29 | ], 30 | "highlighted": [ 31 | 32 | ], 33 | "liked": false, 34 | "note_count": 682, 35 | "source_url": "http://suicideblonde.tumblr.com", 36 | "source_title": "suicideblonde", 37 | "caption": "

suicideblonde:

\n
\n

Margareth Madè photographed by Vincent Peters

\n
\n\n

2012-04-15

", 38 | "link_url": "http://suicideblonde.tumblr.com", 39 | "photos": [ 40 | { 41 | "caption": "", 42 | "alt_sizes": [ 43 | { 44 | "width": 1280, 45 | "height": 1707, 46 | "url": "http://25.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_1280.jpg" 47 | }, 48 | { 49 | "width": 500, 50 | "height": 667, 51 | "url": "http://25.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_500.jpg" 52 | }, 53 | { 54 | "width": 400, 55 | "height": 533, 56 | "url": "http://25.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_400.jpg" 57 | }, 58 | { 59 | "width": 250, 60 | "height": 333, 61 | "url": "http://24.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_250.jpg" 62 | }, 63 | { 64 | "width": 100, 65 | "height": 133, 66 | "url": "http://24.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_100.jpg" 67 | }, 68 | { 69 | "width": 75, 70 | "height": 75, 71 | "url": "http://24.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_75sq.jpg" 72 | } 73 | ], 74 | "original_size": { 75 | "width": 1280, 76 | "height": 1707, 77 | "url": "http://25.media.tumblr.com/tumblr_m11rcw4PGB1qz9qooo1_1280.jpg" 78 | } 79 | } 80 | ], 81 | "can_reply": false 82 | }, 83 | { 84 | "blog_name": "mmtki", 85 | "id": 23363958388, 86 | "post_url": "http://mmtki.tumblr.com/post/23363958388/2012-01-23", 87 | "slug": "2012-01-23", 88 | "type": "photo", 89 | "date": "2012-05-19 19:00:25 GMT", 90 | "timestamp": 1337454025, 91 | "format": "html", 92 | "reblog_key": "F7EQLHbo", 93 | "tags": [ 94 | 95 | ], 96 | "highlighted": [ 97 | 98 | ], 99 | "liked": false, 100 | "note_count": 8982, 101 | "source_url": "http://dazhahs.tumblr.com/post/15945503860", 102 | "source_title": "dazhahs", 103 | "caption": "

2012-01-23

", 104 | "photos": [ 105 | { 106 | "caption": "", 107 | "alt_sizes": [ 108 | { 109 | "width": 500, 110 | "height": 667, 111 | "url": "http://25.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_500.jpg" 112 | }, 113 | { 114 | "width": 400, 115 | "height": 534, 116 | "url": "http://24.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_400.jpg" 117 | }, 118 | { 119 | "width": 250, 120 | "height": 334, 121 | "url": "http://24.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_250.jpg" 122 | }, 123 | { 124 | "width": 100, 125 | "height": 133, 126 | "url": "http://24.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_100.jpg" 127 | }, 128 | { 129 | "width": 75, 130 | "height": 75, 131 | "url": "http://25.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_75sq.jpg" 132 | } 133 | ], 134 | "original_size": { 135 | "width": 500, 136 | "height": 667, 137 | "url": "http://25.media.tumblr.com/tumblr_lxwa0ezqzT1r5a6xwo1_500.jpg" 138 | } 139 | } 140 | ], 141 | "can_reply": false 142 | }, 143 | { 144 | "blog_name": "mmtki", 145 | "id": 23357312954, 146 | "post_url": "http://mmtki.tumblr.com/post/23357312954/2011-09-18", 147 | "slug": "2011-09-18", 148 | "type": "photo", 149 | "date": "2012-05-19 17:00:26 GMT", 150 | "timestamp": 1337446826, 151 | "format": "html", 152 | "reblog_key": "TQ54qLM7", 153 | "tags": [ 154 | 155 | ], 156 | "highlighted": [ 157 | 158 | ], 159 | "liked": false, 160 | "note_count": 1565, 161 | "caption": "

2011-09-18

", 162 | "link_url": "http://enesetapp.tumblr.com/post/9258823118", 163 | "photos": [ 164 | { 165 | "caption": "", 166 | "alt_sizes": [ 167 | { 168 | "width": 700, 169 | "height": 506, 170 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_500.jpg" 171 | }, 172 | { 173 | "width": 500, 174 | "height": 361, 175 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_500.jpg" 176 | }, 177 | { 178 | "width": 400, 179 | "height": 289, 180 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_400.jpg" 181 | }, 182 | { 183 | "width": 250, 184 | "height": 181, 185 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_250.jpg" 186 | }, 187 | { 188 | "width": 100, 189 | "height": 72, 190 | "url": "http://25.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_100.jpg" 191 | }, 192 | { 193 | "width": 75, 194 | "height": 75, 195 | "url": "http://25.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_75sq.jpg" 196 | } 197 | ], 198 | "original_size": { 199 | "width": 700, 200 | "height": 506, 201 | "url": "http://24.media.tumblr.com/tumblr_lqcf2qA8bZ1r1g2c0o1_500.jpg" 202 | } 203 | } 204 | ], 205 | "can_reply": false 206 | }, 207 | { 208 | "blog_name": "mmtki", 209 | "id": 23354168264, 210 | "post_url": "http://mmtki.tumblr.com/post/23354168264/126-2009-01-28-07-49-34", 211 | "slug": "126-2009-01-28-07-49-34", 212 | "type": "quote", 213 | "date": "2012-05-19 16:00:25 GMT", 214 | "timestamp": 1337443225, 215 | "format": "html", 216 | "reblog_key": "iQnz6vba", 217 | "tags": [ 218 | 219 | ], 220 | "highlighted": [ 221 | 222 | ], 223 | "liked": false, 224 | "note_count": 959, 225 | "source_url": "http://petapeta.tumblr.com/post/1396987746/126-2009-01-28-07-49-34", 226 | "source_title": "petapeta", 227 | "text": "

126 名刺は切らしておりまして :2009/01/28(水) 07:49:34 ID:6Yqg40sQ

サバイバルはやってみたいな
\n社会が崩壊した時どうやって生き延びることができるのか体験してみたい

130 名刺は切らしておりまして :2009/01/28(水) 07:53:38 ID:WBxw2oDO
»126 
\n最低限水の確保の仕方とコレラ予防さえ知っておけば犬死にすることはない。
\nあとはまあ鉄則中の鉄則だけど、川&海沿い、湖など、とにかく水辺には出ないこと。
\nどうしても自然の水源が欲しいなら沢確保で。

133 名刺は切らしておりまして :2009/01/28(水) 07:57:51 ID:6Yqg40sQ
»130 
\n水辺に出ないってのは何故ですかい?

139 名刺は切らしておりまして :2009/01/28(水) 08:06:37 ID:WBxw2oDO
»133 
\n1.水の確保の仕方を知らないパンピーは100%水場へ群がる。
\n2.衛生状態が悪くなって確実にコレラが流行る。ついでに大腸菌。
\n3.煮沸でもおっつかなくなる、喧嘩が始まる~エスカレート

\n教訓「誰もが思いつく手は最悪よりも悪い手である」
", 228 | "source": "社会が崩壊した時に生き延びる方法:アルファルファモザイクだった (via petapeta)\n\n

2010-10-25

", 229 | "can_reply": false 230 | }, 231 | { 232 | "blog_name": "mmtki", 233 | "id": 23352664376, 234 | "post_url": "http://mmtki.tumblr.com/post/23352664376/2011-07-31", 235 | "slug": "2011-07-31", 236 | "type": "photo", 237 | "date": "2012-05-19 15:30:40 GMT", 238 | "timestamp": 1337441440, 239 | "format": "html", 240 | "reblog_key": "Ya45S7eJ", 241 | "tags": [ 242 | 243 | ], 244 | "highlighted": [ 245 | 246 | ], 247 | "liked": false, 248 | "note_count": 21926, 249 | "source_url": "http://massacra.tumblr.com/", 250 | "source_title": "massacra", 251 | "caption": "

2011-07-31

", 252 | "link_url": "http://massacra.tumblr.com/", 253 | "photos": [ 254 | { 255 | "caption": "", 256 | "alt_sizes": [ 257 | { 258 | "width": 500, 259 | "height": 266, 260 | "url": "http://24.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_500.gif" 261 | }, 262 | { 263 | "width": 400, 264 | "height": 213, 265 | "url": "http://25.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_400.gif" 266 | }, 267 | { 268 | "width": 250, 269 | "height": 133, 270 | "url": "http://24.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_250.gif" 271 | }, 272 | { 273 | "width": 100, 274 | "height": 53, 275 | "url": "http://25.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_100.gif" 276 | }, 277 | { 278 | "width": 75, 279 | "height": 75, 280 | "url": "http://25.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_75sq.gif" 281 | } 282 | ], 283 | "original_size": { 284 | "width": 500, 285 | "height": 266, 286 | "url": "http://24.media.tumblr.com/tumblr_lniux68m2G1qddjelo1_500.gif" 287 | } 288 | } 289 | ], 290 | "can_reply": false 291 | }, 292 | { 293 | "blog_name": "mmtki", 294 | "id": 23351194572, 295 | "post_url": "http://mmtki.tumblr.com/post/23351194572/non117-picapixels", 296 | "slug": "non117-picapixels", 297 | "type": "photo", 298 | "date": "2012-05-19 15:01:29 GMT", 299 | "timestamp": 1337439689, 300 | "format": "html", 301 | "reblog_key": "yFrNiPDD", 302 | "tags": [ 303 | 304 | ], 305 | "highlighted": [ 306 | 307 | ], 308 | "liked": false, 309 | "note_count": 556, 310 | "source_url": "http://picapixels.tumblr.com/post/400518128", 311 | "source_title": "picapixels", 312 | "caption": "

non117:

\n\n

picapixels:

\n
\n

メイド + ニーソ : 《神聖不可侵の聖域》絶対領域の神秘世界《ミニスカ!ニーソ!》

\n
\n\n

2010-02-20

", 313 | "link_url": "http://matome.naver.jp/odai/2125954904574166100/2125954915947483400", 314 | "photos": [ 315 | { 316 | "caption": "", 317 | "alt_sizes": [ 318 | { 319 | "width": 600, 320 | "height": 800, 321 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_1280.jpg" 322 | }, 323 | { 324 | "width": 500, 325 | "height": 667, 326 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_500.jpg" 327 | }, 328 | { 329 | "width": 400, 330 | "height": 533, 331 | "url": "http://24.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_400.jpg" 332 | }, 333 | { 334 | "width": 250, 335 | "height": 333, 336 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_250.jpg" 337 | }, 338 | { 339 | "width": 100, 340 | "height": 133, 341 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_100.jpg" 342 | }, 343 | { 344 | "width": 75, 345 | "height": 75, 346 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_75sq.jpg" 347 | } 348 | ], 349 | "original_size": { 350 | "width": 600, 351 | "height": 800, 352 | "url": "http://25.media.tumblr.com/tumblr_ky57wwPxJw1qz6ygbo1_1280.jpg" 353 | } 354 | } 355 | ], 356 | "can_reply": false 357 | }, 358 | { 359 | "blog_name": "mmtki", 360 | "id": 23347274003, 361 | "post_url": "http://mmtki.tumblr.com/post/23347274003/2011-04-24", 362 | "slug": "2011-04-24", 363 | "type": "photo", 364 | "date": "2012-05-19 13:30:19 GMT", 365 | "timestamp": 1337434219, 366 | "format": "html", 367 | "reblog_key": "zS2Y4lUD", 368 | "tags": [ 369 | 370 | ], 371 | "highlighted": [ 372 | 373 | ], 374 | "liked": false, 375 | "note_count": 9663, 376 | "source_url": "http://vivasuvida.tumblr.com/post/4704814644/chanel-nailpolish-love-xx", 377 | "source_title": "vivasuvida", 378 | "caption": "

2011-04-24

", 379 | "link_url": "http://vivasuvida.tumblr.com/post/4704814644", 380 | "photos": [ 381 | { 382 | "caption": "", 383 | "alt_sizes": [ 384 | { 385 | "width": 480, 386 | "height": 374, 387 | "url": "http://24.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_500.gif" 388 | }, 389 | { 390 | "width": 400, 391 | "height": 312, 392 | "url": "http://25.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_400.gif" 393 | }, 394 | { 395 | "width": 250, 396 | "height": 195, 397 | "url": "http://24.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_250.gif" 398 | }, 399 | { 400 | "width": 100, 401 | "height": 78, 402 | "url": "http://25.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_100.gif" 403 | }, 404 | { 405 | "width": 75, 406 | "height": 75, 407 | "url": "http://25.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_75sq.gif" 408 | } 409 | ], 410 | "original_size": { 411 | "width": 480, 412 | "height": 374, 413 | "url": "http://24.media.tumblr.com/tumblr_ljtoq7gvny1qimvgfo1_500.gif" 414 | } 415 | } 416 | ], 417 | "can_reply": false 418 | }, 419 | { 420 | "blog_name": "mmtki", 421 | "id": 23346246679, 422 | "post_url": "http://mmtki.tumblr.com/post/23346246679/nordmeerstrasse", 423 | "slug": "nordmeerstrasse", 424 | "type": "quote", 425 | "date": "2012-05-19 13:00:19 GMT", 426 | "timestamp": 1337432419, 427 | "format": "html", 428 | "reblog_key": "0w6NYoHu", 429 | "tags": [ 430 | 431 | ], 432 | "highlighted": [ 433 | 434 | ], 435 | "liked": false, 436 | "note_count": 631, 437 | "source_url": "http://deutsch.ironsand.net/2011/japanische-praefekturen-auf-deutsche/", 438 | "source_title": "deutsch.ironsand.net", 439 | "text": "

都道府県をドイツ語にしてみた

\n\n

北海道:Nordmeerstraße(ノートメアシュトラーセ)
\n青森:Blauwald(ブラウヴァルト)
\n岩手:Felsenhand(フェルゼンハント)
\n宮城:Palastburg(パラストブルク)
\n秋田:Herbstfeld(ヘァブストフェスト)
\n山形:Bergform(ベルクフォルム)
\n福島:Glückinsel(グリュックスインゼル)
\n茨城:Rosenburg(ローゼンブルグ)
\n栃木:Rosskastanie(ロスカスタニエ)
\n群馬:Pferdeherde(フェアデヘルデ)
\n埼玉:Kapskugel(カップスクーゲル)
\n千葉:Tausendeblätter(タウゼンデブレッダー)
\n東京:Osthauptstadt(オストハウプトシュタット)
\n神奈川 Gottesfluß(ゴッテスフルス)
\n新潟:Neuelagune(ノイエラグーネ)
\n富山:ReichenBerg(ライヘンベルク)
\n石川:Steinfluß(シュタインフルス)
\n福井:Glückesbrunnen(グリュックスブルネン)
\n山梨:Birnenberg(ビルネンべルク)
\n長野:Langenfeld(ランゲンフェルト)
\n岐阜:Gabelunghügel(ガーベルングスヒューゲル)
\n静岡:Stillenhügel(シュティレンヒューゲル)
\n愛知:Liebewissen(リーベヴィッセン)
\n三重:Dreifach(ドライファッハ)
\n滋賀:Nahhaftesfeier(ナーハフテスファイア)
\n京都:Edelhauptstadt(エーデルハウプトシュタット)
\n大阪:Großenhang(グローセンハンク)
\n兵庫:Soldatenlager(ゾルダーテンラーゲー)
\n奈良:Allesgute(アレスグーテ)
\n和歌山:Friedenliedberg(フリーデンリートベルク)
\n鳥取:Vogeljagd(フォーゲルヤクト)
\n島根:InselsWurzel(インゼルスブルツェル)
\n岡山:Hügelberg(ヒューゲルベルク)
\n広島:Großeinsel(グローセインゼル)
\n山口:Bergmund(ベルクムント)
\n徳島:Tugendinsel(トゥーゲントインゼル)
\n香川:Duftenfluß(ドゥフテンフルス)
\n愛媛:Liebesprinzessin(リーベスプリンツェッシン)
\n高知:hochwissen(ホッホヴィッセン)

\n\n

福岡:Glückshügel(グリュックスヒューゲル)
\n佐賀:Hilfenfeier(ヒルフェンファイア)
\n長崎:Langenkap(ランゲンカップ)
\n熊本:Bärgrund(ベアグルント)
\n大分:Großeteilung(グローセタイルング)
\n宮崎:Palastkap(パラストカップ)
\n鹿児島:Hirschlingsinsel(ヒルシュリングスインゼル)
\n沖縄:Meerseile(メアザイレ)

\n\n

和歌山はわざと曲解してます。

", 440 | "source": "

ドイツ語学習帳 in Deutschland » 都道府県をドイツ語にしてみた (via hujisato)

\n

ドイツ語の語感の良さは異常

(via y-u)\n\n

2011-09-12

", 441 | "can_reply": false 442 | }, 443 | { 444 | "blog_name": "mmtki", 445 | "id": 23344549430, 446 | "post_url": "http://mmtki.tumblr.com/post/23344549430/2011-06-29", 447 | "slug": "2011-06-29", 448 | "type": "photo", 449 | "date": "2012-05-19 12:00:18 GMT", 450 | "timestamp": 1337428818, 451 | "format": "html", 452 | "reblog_key": "D38XrlUj", 453 | "tags": [ 454 | 455 | ], 456 | "highlighted": [ 457 | 458 | ], 459 | "liked": false, 460 | "note_count": 5126, 461 | "source_url": "http://d---ope.tumblr.com/post/6732333678", 462 | "source_title": "d---ope", 463 | "caption": "

2011-06-29

", 464 | "link_url": "http://comequietlyleavescreaming.tumblr.com/post/6732333678", 465 | "photos": [ 466 | { 467 | "caption": "", 468 | "alt_sizes": [ 469 | { 470 | "width": 640, 471 | "height": 427, 472 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_1280.png" 473 | }, 474 | { 475 | "width": 500, 476 | "height": 334, 477 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_500.png" 478 | }, 479 | { 480 | "width": 400, 481 | "height": 267, 482 | "url": "http://25.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_400.png" 483 | }, 484 | { 485 | "width": 250, 486 | "height": 167, 487 | "url": "http://25.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_250.png" 488 | }, 489 | { 490 | "width": 100, 491 | "height": 67, 492 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_100.png" 493 | }, 494 | { 495 | "width": 75, 496 | "height": 75, 497 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_75sq.png" 498 | } 499 | ], 500 | "original_size": { 501 | "width": 640, 502 | "height": 427, 503 | "url": "http://24.media.tumblr.com/tumblr_ln3v9k5JrP1qcph15o1_1280.png" 504 | } 505 | } 506 | ], 507 | "can_reply": false 508 | }, 509 | { 510 | "blog_name": "mmtki", 511 | "id": 23343833812, 512 | "post_url": "http://mmtki.tumblr.com/post/23343833812/nkym-kafka-0-on-twitpic", 513 | "slug": "nkym-kafka-0-on-twitpic", 514 | "type": "photo", 515 | "date": "2012-05-19 11:30:19 GMT", 516 | "timestamp": 1337427019, 517 | "format": "html", 518 | "reblog_key": "ztA1I4rN", 519 | "tags": [ 520 | 521 | ], 522 | "highlighted": [ 523 | 524 | ], 525 | "liked": false, 526 | "note_count": 1047, 527 | "source_url": "http://nkym.tumblr.com/post/16231348486/kafka-0-on-twitpic", 528 | "source_title": "nkym", 529 | "caption": "

nkym:

\n
\n

kafka_0: さかなハコください… on Twitpic

\n
\n\n

2012-01-23

", 530 | "photos": [ 531 | { 532 | "caption": "", 533 | "alt_sizes": [ 534 | { 535 | "width": 300, 536 | "height": 605, 537 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_500.jpg" 538 | }, 539 | { 540 | "width": 298, 541 | "height": 600, 542 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_400.jpg" 543 | }, 544 | { 545 | "width": 198, 546 | "height": 400, 547 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_250.jpg" 548 | }, 549 | { 550 | "width": 99, 551 | "height": 200, 552 | "url": "http://25.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_100.jpg" 553 | }, 554 | { 555 | "width": 75, 556 | "height": 75, 557 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_75sq.jpg" 558 | } 559 | ], 560 | "original_size": { 561 | "width": 300, 562 | "height": 605, 563 | "url": "http://24.media.tumblr.com/tumblr_ly5qeoxMsj1qz6y3go1_500.jpg" 564 | } 565 | } 566 | ], 567 | "can_reply": false 568 | }, 569 | { 570 | "blog_name": "mmtki", 571 | "id": 23343177145, 572 | "post_url": "http://mmtki.tumblr.com/post/23343177145", 573 | "slug": "", 574 | "type": "quote", 575 | "date": "2012-05-19 11:00:18 GMT", 576 | "timestamp": 1337425218, 577 | "format": "html", 578 | "reblog_key": "o0J14dT8", 579 | "tags": [ 580 | 581 | ], 582 | "highlighted": [ 583 | 584 | ], 585 | "liked": false, 586 | "note_count": 630, 587 | "source_url": "http://vmconverter.tumblr.com/post/96766504", 588 | "source_title": "vmconverter", 589 | "text": "

「育児雑誌の特集号についている離乳食は、主婦を専業にしている母親の趣味をみたすようにできているので、実用的でない。すり鉢ですったりする料理がおおいのは、調理が趣味である母親を満足させるためである。」
\n(文庫版『定本育児の百科 中』p.65)

\n\n

「ところが、赤ちゃんに楽しい人生を用意しようとしないで、義務の人生をおしつける母親がおおい。(中略)離乳食献立と首っぴきで、離乳食をつくり、毎日これだけは、ぜひ食べさせようと努力する。赤ちゃんが離乳食を食べてくれればよろこび、食べてくれないと悲しむ。こういう母親は、赤ちゃんに1日何カロリー食べさせたかを計算するが、赤ちゃんに今日は、どれだけ楽しい思いをさせたかということをかんがえない」
\n(同前p.115)

\n\n

「食事は栄養さえたりていればなるべく簡単にすませて、生活を楽しむことに時間をついやすという人間の生き方に、赤ちゃんもならさねばならぬ。ごはんを食べたがらぬ子には、副食に十分の動物性タンパク(魚、卵、牛肉、豚肉、鶏肉)を与えればよい。それも食べないなら、ミルクや牛乳を今までのようにつづけていい。」
\n(同前、p.412)

\n\n

 離乳食より楽しい人生。こんなことを言ってくれる育児書がほかにあるだろうか。

", 590 | "source": "

Webマガジン幻冬舎

\n

そうそう。

\n

巷の離乳食本とか見ると「お前らどんだけ暇なんだよw」と思う。

\n

ここら辺、西原理恵子の食育話とかの「手作り信仰」と根っこは変わらんと思うよ。

\n

(via vmconverter) 2009-04-16 (via gkojay) (via mnak)

\n

(via ipodstyle) 2010-04-26 (via gkojay) (via oosawatechnica) (via s-wool) (via ishida) (via soothingnoise)

\n

(via tkashiwagi)

(via nowsprinting)\n\n

2011-01-14

", 591 | "can_reply": false 592 | }, 593 | { 594 | "blog_name": "mmtki", 595 | "id": 23342559867, 596 | "post_url": "http://mmtki.tumblr.com/post/23342559867/tumblr", 597 | "slug": "tumblr", 598 | "type": "quote", 599 | "date": "2012-05-19 10:30:23 GMT", 600 | "timestamp": 1337423423, 601 | "format": "html", 602 | "reblog_key": "2yJ8B53w", 603 | "tags": [ 604 | 605 | ], 606 | "highlighted": [ 607 | 608 | ], 609 | "liked": false, 610 | "note_count": 719, 611 | "source_url": "http://joriko.tumblr.com/post/3523997044/tumblr", 612 | "source_title": "joriko", 613 | "text": "「Tumblrの一番面白ところはどこですか?」 「名言をいくらreblogしても現実はまったく変わらないところですね」", 614 | "source": "Twitter / RPM (via joriko)\n\n

2011-03-08

", 615 | "can_reply": false 616 | }, 617 | { 618 | "blog_name": "mmtki", 619 | "id": 23340817566, 620 | "post_url": "http://mmtki.tumblr.com/post/23340817566/c-c", 621 | "slug": "c-c", 622 | "type": "quote", 623 | "date": "2012-05-19 09:00:20 GMT", 624 | "timestamp": 1337418020, 625 | "format": "html", 626 | "reblog_key": "ONA9nSSc", 627 | "tags": [ 628 | 629 | ], 630 | "highlighted": [ 631 | 632 | ], 633 | "liked": false, 634 | "note_count": 996, 635 | "source_url": "http://sayusayukawaii.tumblr.com/post/15770884636/584-vip-2012-01-12", 636 | "source_title": "sayusayukawaii", 637 | "text": "「レモン○○個分のビタミンC」という表現は多用されているが、実はレモンはジャガイモよりビタミンC含有率が低い。", 638 | "source": "あまり知られていないトリビア:哲学ニュースnwk (via shibata616)\n\n

2012-01-15

", 639 | "can_reply": false 640 | }, 641 | { 642 | "blog_name": "mmtki", 643 | "id": 23340236379, 644 | "post_url": "http://mmtki.tumblr.com/post/23340236379/vhodnk-2-10-2012-03-30", 645 | "slug": "vhodnk-2-10-2012-03-30", 646 | "type": "photo", 647 | "date": "2012-05-19 08:30:21 GMT", 648 | "timestamp": 1337416221, 649 | "format": "html", 650 | "reblog_key": "TLQTJuCg", 651 | "tags": [ 652 | 653 | ], 654 | "highlighted": [ 655 | 656 | ], 657 | "liked": false, 658 | "note_count": 541, 659 | "source_url": "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=26161254", 660 | "source_title": "pixiv.net", 661 | "caption": "

vhodnk:

\n
\n

双葉杏は働かない2 [10]

\n
\n\n

2012-03-30

", 662 | "link_url": "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=26161254", 663 | "photos": [ 664 | { 665 | "caption": "", 666 | "alt_sizes": [ 667 | { 668 | "width": 900, 669 | "height": 1200, 670 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_1280.jpg" 671 | }, 672 | { 673 | "width": 500, 674 | "height": 667, 675 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_500.jpg" 676 | }, 677 | { 678 | "width": 400, 679 | "height": 533, 680 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_400.jpg" 681 | }, 682 | { 683 | "width": 250, 684 | "height": 333, 685 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_250.jpg" 686 | }, 687 | { 688 | "width": 100, 689 | "height": 133, 690 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_100.jpg" 691 | }, 692 | { 693 | "width": 75, 694 | "height": 75, 695 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_75sq.jpg" 696 | } 697 | ], 698 | "original_size": { 699 | "width": 900, 700 | "height": 1200, 701 | "url": "http://24.media.tumblr.com/tumblr_m1nb0mPN5K1qc8x37o1_1280.jpg" 702 | } 703 | } 704 | ], 705 | "can_reply": false 706 | }, 707 | { 708 | "blog_name": "mmtki", 709 | "id": 23339636887, 710 | "post_url": "http://mmtki.tumblr.com/post/23339636887/a", 711 | "slug": "a", 712 | "type": "quote", 713 | "date": "2012-05-19 08:00:20 GMT", 714 | "timestamp": 1337414420, 715 | "format": "html", 716 | "reblog_key": "a4BvwSoI", 717 | "tags": [ 718 | 719 | ], 720 | "highlighted": [ 721 | 722 | ], 723 | "liked": false, 724 | "note_count": 829, 725 | "source_url": "http://deepspeed.tumblr.com/post/6710231232/a", 726 | "source_title": "deepspeed", 727 | "text": "

友達Aと地下鉄に乗ってたら、同じ車両にいた池沼が
\n大学生っぽい女の子の肩をグーで殴りながら奇声を上げだした。
\n女の子が「やめて下さい!」って言ってるのにニヤニヤしながら続行。
\nキレた女の子が池沼の腕掴んで「やめろって言ってるでしょ!」と
\n怒鳴ったら池沼の飼い主が現れて(ってか、ずっと隣にいたらしい)
\n「○○ちゃんはハンデキャップもってるのよ!もっと思いやり(ry」と
\n教科書どおりのセリフで逆切れしてた。

\n\n


\nそれを聞いたAが急に奇声を上げながら飼い主の肩を数発ほど殴り、
\n次に池沼の頬を両手でバシンバシン挟むように叩き出した。
\n「なにするの!」と飼い主の怒りがこちらに向いちゃったので
\n「すみません、弟はちょっとハンデキャップもちなもので」と言ってから
\n「こらA!知らない人ぶったらダメだろ!!」とAにゲンコツして
\n「あやまりなさい!」と促した。
\nAはたどたどしく「ごめんなさい」と池沼親子に謝り、俺も周りの人に
\n「お騒がせして申し訳ありません」と頭を下げる小芝居をしたら、
\n池沼の飼い主は顔赤くしてプルプルしながら沈黙した。

\n\n


\nその後、Aに何で急に池沼のフリして暴れんだよ、と聞いたら
\n「ああいう類は、自分がされなきゃわかんねーんだよ」と
\nDQNだけど男らしいお答えをいただき、ちょっとかっこいいと思ってしまった。
\nでも、その後「おまえもとっさに演技してたじゃん、弟はハンデキャップ持ちってw」
\n「なんだよハンデキャップってw」と笑うAに
\n「だってお前包茎じゃん」と真顔で言ったら奇声を上げながら殴られた。

", 728 | "source": "No.25553 ハンデキャップ - コピペ運動会 (via deepspeed)
2011-08-16 (via gkojax-text)\n\n

2011-08-19

", 729 | "can_reply": false 730 | }, 731 | { 732 | "blog_name": "mmtki", 733 | "id": 23338329362, 734 | "post_url": "http://mmtki.tumblr.com/post/23338329362", 735 | "slug": "", 736 | "type": "quote", 737 | "date": "2012-05-19 07:00:19 GMT", 738 | "timestamp": 1337410819, 739 | "format": "html", 740 | "reblog_key": "yKFIeB2Y", 741 | "tags": [ 742 | 743 | ], 744 | "highlighted": [ 745 | 746 | ], 747 | "liked": false, 748 | "note_count": 842, 749 | "source_url": "http://dannnao.tumblr.com/post/37296142", 750 | "source_title": "dannnao", 751 | "text": "硫化水素自殺や電車に飛び込んで死ぬ人に対して「迷惑をかけずに死ね」っていう人がいるけど、自分の感想はむしろ「ああ、この人は死ぬときくらいしか迷惑かけられなかったんだな」と思うことがある。", 752 | "source": "Twitter / esehara (via inujita, dannnao) (via kazukij) (via mmmmmmmmmy) (via mog-mog)\n\n

2011-07-10

", 753 | "can_reply": false 754 | }, 755 | { 756 | "blog_name": "mmtki", 757 | "id": 23337565094, 758 | "post_url": "http://mmtki.tumblr.com/post/23337565094/2011-12-17", 759 | "slug": "2011-12-17", 760 | "type": "photo", 761 | "date": "2012-05-19 06:30:20 GMT", 762 | "timestamp": 1337409020, 763 | "format": "html", 764 | "reblog_key": "HC4saOZo", 765 | "tags": [ 766 | 767 | ], 768 | "highlighted": [ 769 | 770 | ], 771 | "liked": false, 772 | "note_count": 3328, 773 | "source_url": "http://vvulf.tumblr.com", 774 | "source_title": "vvulf", 775 | "caption": "

2011-12-17

", 776 | "link_url": "http://vvulf.tumblr.com", 777 | "photos": [ 778 | { 779 | "caption": "", 780 | "alt_sizes": [ 781 | { 782 | "width": 500, 783 | "height": 281, 784 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_500.gif" 785 | }, 786 | { 787 | "width": 400, 788 | "height": 225, 789 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_400.gif" 790 | }, 791 | { 792 | "width": 250, 793 | "height": 141, 794 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_250.gif" 795 | }, 796 | { 797 | "width": 100, 798 | "height": 56, 799 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_100.gif" 800 | }, 801 | { 802 | "width": 75, 803 | "height": 75, 804 | "url": "http://24.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_75sq.gif" 805 | } 806 | ], 807 | "original_size": { 808 | "width": 500, 809 | "height": 281, 810 | "url": "http://25.media.tumblr.com/tumblr_lqmpwwaVcc1qbmtjno1_500.gif" 811 | } 812 | } 813 | ], 814 | "can_reply": false 815 | }, 816 | { 817 | "blog_name": "mmtki", 818 | "id": 23336683103, 819 | "post_url": "http://mmtki.tumblr.com/post/23336683103/2012-02-18", 820 | "slug": "2012-02-18", 821 | "type": "photo", 822 | "date": "2012-05-19 06:00:25 GMT", 823 | "timestamp": 1337407225, 824 | "format": "html", 825 | "reblog_key": "oNNPiUvF", 826 | "tags": [ 827 | 828 | ], 829 | "highlighted": [ 830 | 831 | ], 832 | "liked": false, 833 | "note_count": 545, 834 | "source_url": "http://filthygifs.tumblr.com/post/16478624408/rosie-lose-that-bra", 835 | "source_title": "filthygifs", 836 | "caption": "

2012-02-18

", 837 | "photoset_layout": 332, 838 | "photos": [ 839 | { 840 | "caption": "", 841 | "alt_sizes": [ 842 | { 843 | "width": 165, 844 | "height": 288, 845 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo1_250.gif" 846 | }, 847 | { 848 | "width": 100, 849 | "height": 175, 850 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo1_100.gif" 851 | }, 852 | { 853 | "width": 75, 854 | "height": 75, 855 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo1_75sq.gif" 856 | } 857 | ], 858 | "original_size": { 859 | "width": 165, 860 | "height": 288, 861 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo1_250.gif" 862 | } 863 | }, 864 | { 865 | "caption": "", 866 | "alt_sizes": [ 867 | { 868 | "width": 165, 869 | "height": 288, 870 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo2_250.gif" 871 | }, 872 | { 873 | "width": 100, 874 | "height": 175, 875 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo2_100.gif" 876 | }, 877 | { 878 | "width": 75, 879 | "height": 75, 880 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo2_75sq.gif" 881 | } 882 | ], 883 | "original_size": { 884 | "width": 165, 885 | "height": 288, 886 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo2_250.gif" 887 | } 888 | }, 889 | { 890 | "caption": "", 891 | "alt_sizes": [ 892 | { 893 | "width": 165, 894 | "height": 288, 895 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo3_250.gif" 896 | }, 897 | { 898 | "width": 100, 899 | "height": 175, 900 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo3_100.gif" 901 | }, 902 | { 903 | "width": 75, 904 | "height": 75, 905 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo3_75sq.gif" 906 | } 907 | ], 908 | "original_size": { 909 | "width": 165, 910 | "height": 288, 911 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo3_250.gif" 912 | } 913 | }, 914 | { 915 | "caption": "", 916 | "alt_sizes": [ 917 | { 918 | "width": 165, 919 | "height": 288, 920 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo4_250.gif" 921 | }, 922 | { 923 | "width": 100, 924 | "height": 175, 925 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo4_100.gif" 926 | }, 927 | { 928 | "width": 75, 929 | "height": 75, 930 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo4_75sq.gif" 931 | } 932 | ], 933 | "original_size": { 934 | "width": 165, 935 | "height": 288, 936 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo4_250.gif" 937 | } 938 | }, 939 | { 940 | "caption": "", 941 | "alt_sizes": [ 942 | { 943 | "width": 165, 944 | "height": 288, 945 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo5_250.gif" 946 | }, 947 | { 948 | "width": 100, 949 | "height": 175, 950 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo5_100.gif" 951 | }, 952 | { 953 | "width": 75, 954 | "height": 75, 955 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo5_75sq.gif" 956 | } 957 | ], 958 | "original_size": { 959 | "width": 165, 960 | "height": 288, 961 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo5_250.gif" 962 | } 963 | }, 964 | { 965 | "caption": "", 966 | "alt_sizes": [ 967 | { 968 | "width": 165, 969 | "height": 288, 970 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo6_250.gif" 971 | }, 972 | { 973 | "width": 100, 974 | "height": 175, 975 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo6_100.gif" 976 | }, 977 | { 978 | "width": 75, 979 | "height": 75, 980 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo6_75sq.gif" 981 | } 982 | ], 983 | "original_size": { 984 | "width": 165, 985 | "height": 288, 986 | "url": "http://24.media.tumblr.com/tumblr_lydgd2O37a1qiweszo6_250.gif" 987 | } 988 | }, 989 | { 990 | "caption": "", 991 | "alt_sizes": [ 992 | { 993 | "width": 165, 994 | "height": 288, 995 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo7_250.gif" 996 | }, 997 | { 998 | "width": 100, 999 | "height": 175, 1000 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo7_100.gif" 1001 | }, 1002 | { 1003 | "width": 75, 1004 | "height": 75, 1005 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo7_75sq.gif" 1006 | } 1007 | ], 1008 | "original_size": { 1009 | "width": 165, 1010 | "height": 288, 1011 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo7_250.gif" 1012 | } 1013 | }, 1014 | { 1015 | "caption": "", 1016 | "alt_sizes": [ 1017 | { 1018 | "width": 165, 1019 | "height": 288, 1020 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo8_250.gif" 1021 | }, 1022 | { 1023 | "width": 100, 1024 | "height": 175, 1025 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo8_100.gif" 1026 | }, 1027 | { 1028 | "width": 75, 1029 | "height": 75, 1030 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo8_75sq.gif" 1031 | } 1032 | ], 1033 | "original_size": { 1034 | "width": 165, 1035 | "height": 288, 1036 | "url": "http://25.media.tumblr.com/tumblr_lydgd2O37a1qiweszo8_250.gif" 1037 | } 1038 | } 1039 | ], 1040 | "can_reply": false 1041 | }, 1042 | { 1043 | "blog_name": "mmtki", 1044 | "id": 23335670574, 1045 | "post_url": "http://mmtki.tumblr.com/post/23335670574/mitolier-http-aozora-jugem-cc-2010-12-12", 1046 | "slug": "mitolier-http-aozora-jugem-cc-2010-12-12", 1047 | "type": "photo", 1048 | "date": "2012-05-19 05:30:21 GMT", 1049 | "timestamp": 1337405421, 1050 | "format": "html", 1051 | "reblog_key": "ZU8UA0b3", 1052 | "tags": [ 1053 | 1054 | ], 1055 | "highlighted": [ 1056 | 1057 | ], 1058 | "liked": false, 1059 | "note_count": 674, 1060 | "source_url": "http://mitolier.tumblr.com/post/2184500895/http-aozora-jugem-cc", 1061 | "source_title": "mitolier", 1062 | "caption": "

mitolier:

\n\n

http://aozora.jugem.cc/

\n\n

2010-12-12

", 1063 | "photos": [ 1064 | { 1065 | "caption": "", 1066 | "alt_sizes": [ 1067 | { 1068 | "width": 510, 1069 | "height": 510, 1070 | "url": "http://24.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_1280.jpg" 1071 | }, 1072 | { 1073 | "width": 500, 1074 | "height": 500, 1075 | "url": "http://24.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_500.jpg" 1076 | }, 1077 | { 1078 | "width": 400, 1079 | "height": 400, 1080 | "url": "http://24.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_400.jpg" 1081 | }, 1082 | { 1083 | "width": 250, 1084 | "height": 250, 1085 | "url": "http://25.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_250.jpg" 1086 | }, 1087 | { 1088 | "width": 100, 1089 | "height": 100, 1090 | "url": "http://25.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_100.jpg" 1091 | }, 1092 | { 1093 | "width": 75, 1094 | "height": 75, 1095 | "url": "http://25.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_75sq.jpg" 1096 | } 1097 | ], 1098 | "original_size": { 1099 | "width": 510, 1100 | "height": 510, 1101 | "url": "http://24.media.tumblr.com/tumblr_ldb6fvFg991qbrv5ko1_1280.jpg" 1102 | } 1103 | } 1104 | ], 1105 | "can_reply": false 1106 | }, 1107 | { 1108 | "blog_name": "mmtki", 1109 | "id": 23334512540, 1110 | "post_url": "http://mmtki.tumblr.com/post/23334512540/blendy999-stars-2011-06-10", 1111 | "slug": "blendy999-stars-2011-06-10", 1112 | "type": "photo", 1113 | "date": "2012-05-19 05:00:18 GMT", 1114 | "timestamp": 1337403618, 1115 | "format": "html", 1116 | "reblog_key": "MAEs6AjS", 1117 | "tags": [ 1118 | 1119 | ], 1120 | "highlighted": [ 1121 | 1122 | ], 1123 | "liked": false, 1124 | "note_count": 6197, 1125 | "source_url": "http://weareuniverse.tumblr.com/post/5480736913/stars", 1126 | "source_title": "weareuniverse", 1127 | "caption": "

blendy999:

\n
\n

stars

\n
\n\n

2011-06-10

", 1128 | "link_url": "http://weareuniverse.tumblr.com/post/5480736913/stars", 1129 | "photos": [ 1130 | { 1131 | "caption": "", 1132 | "alt_sizes": [ 1133 | { 1134 | "width": 498, 1135 | "height": 574, 1136 | "url": "http://24.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_500.gif" 1137 | }, 1138 | { 1139 | "width": 400, 1140 | "height": 461, 1141 | "url": "http://24.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_400.gif" 1142 | }, 1143 | { 1144 | "width": 250, 1145 | "height": 288, 1146 | "url": "http://25.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_250.gif" 1147 | }, 1148 | { 1149 | "width": 100, 1150 | "height": 115, 1151 | "url": "http://25.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_100.gif" 1152 | }, 1153 | { 1154 | "width": 75, 1155 | "height": 75, 1156 | "url": "http://25.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_75sq.gif" 1157 | } 1158 | ], 1159 | "original_size": { 1160 | "width": 498, 1161 | "height": 574, 1162 | "url": "http://24.media.tumblr.com/tumblr_ll6x9tV1gD1qglkxeo1_500.gif" 1163 | } 1164 | } 1165 | ], 1166 | "can_reply": false 1167 | } 1168 | ], 1169 | "total_posts": 6505 1170 | } 1171 | } 1172 | --------------------------------------------------------------------------------