pintrest-api 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c216c3168b7271066677f540a132cebbfc9d3a3d
4
- data.tar.gz: aa9449ec04fe448b7e9dca912470791fb57e540c
3
+ metadata.gz: acd0a776db77d64d5fc3432055f521d8a932c996
4
+ data.tar.gz: cc004b329fbc2554b82c49b7ffa5981083b8bf49
5
5
  SHA512:
6
- metadata.gz: 61bcb16cfa708aac96c2bc6d96b20808c7c303b9c64d5589b600300574a769b89147c0a7af83388371cebf9dcf7b3fc9fa154aa317bf013ff482f43c2c40319a
7
- data.tar.gz: 39595bf52a6f67d2398bd82bc4cb3e37cb543a9a0a629c62cdf78b585733c8bba99920a1aa5369f1b0ecc0e8fd4ada56220a28f29930c442ec35a592780dca12
6
+ metadata.gz: 84860239e11a1145ccb306fd3af6464c6b888617df7ed190876cbc631ffebdb661832f40caee81c4ff7ff70c4c50df68e3dd4abf9ce25c5b3075f6fc720b58b2
7
+ data.tar.gz: 8f6cc6f2a94de1f9f0e6d533222ea51f99ed9468b1c2562030783eca78a93257f47120c93ee8537a6e6e8e705fa72abd9439fe6703e5a10f10e5b3c268449f67
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pintrest-api (0.1.1)
4
+ pintrest-api (0.1.2)
5
5
  capybara (~> 2.4)
6
6
  nokogiri (~> 1.6)
7
7
  poltergeist (~> 1.5)
@@ -24,12 +24,12 @@ GEM
24
24
  mime-types (2.4.3)
25
25
  mini_portile (0.6.2)
26
26
  minitest (5.5.1)
27
- multi_json (1.10.1)
27
+ multi_json (1.11.0)
28
28
  nokogiri (1.6.6.2)
29
29
  mini_portile (~> 0.6.0)
30
30
  parser (2.2.0.2)
31
31
  ast (>= 1.1, < 3.0)
32
- poltergeist (1.5.1)
32
+ poltergeist (1.6.0)
33
33
  capybara (~> 2.1)
34
34
  cliver (~> 0.3.1)
35
35
  multi_json (~> 1.0)
@@ -54,9 +54,9 @@ GEM
54
54
  ruby-progressbar (1.7.1)
55
55
  slop (3.6.0)
56
56
  terminal-notifier (1.6.2)
57
- websocket-driver (0.5.1)
57
+ websocket-driver (0.5.3)
58
58
  websocket-extensions (>= 0.1.0)
59
- websocket-extensions (0.1.1)
59
+ websocket-extensions (0.1.2)
60
60
  xpath (2.0.0)
61
61
  nokogiri (~> 1.3)
62
62
 
@@ -8,11 +8,19 @@ module PintrestApi
8
8
  LOGIN_PAGE_BUTTON_CSS = '.formFooter .formFooterButtons'
9
9
  PINTREST_LOGIN_URL = 'https://www.pinterest.com/login/'
10
10
 
11
+ def try_or_check_login(authentication)
12
+ login authentication if !@is_logged_in && authentication
13
+ @is_logged_in = true
14
+ end
15
+
16
+ private
17
+
11
18
  def login(authentication)
12
19
  visit PINTREST_LOGIN_URL
13
20
  @session.find(EMAIL_INPUT_CSS).set authentication[:email]
14
21
  @session.find(PASSWORD_INPUT_CSS).set authentication[:password]
15
22
  click LOGIN_PAGE_BUTTON_CSS
23
+ puts 'Clicking Login button'
16
24
  sleep 5
17
25
 
18
26
  puts 'Finished logging in'
@@ -3,11 +3,11 @@ module PintrestApi
3
3
  class Board < Core
4
4
  attr_reader :title, :url, :pin_count
5
5
 
6
- PINTREST_URL = 'http://www.pintrest.com/'
6
+ PINTREST_URL = 'http://www.pinterest.com/'
7
7
  BOARD_PIN_COUNT_CSS = '.PinCount'
8
8
  BOARD_LINK_CSS = '.boardLinkWrapper'
9
9
  BOARD_TITLE_CSS = 'h3.boardName .title'
10
- BOARD_ITEM_CSS = '.GridItems > .item'
10
+ BOARD_ITEM_CSS = '.UserBoards .item'
11
11
 
12
12
  ##
13
13
  # Get a instance of a board
@@ -31,6 +31,7 @@ module PintrestApi
31
31
  end
32
32
 
33
33
  class << self
34
+ include Authentication
34
35
  ##
35
36
  # Gets all boards from a user
36
37
  #
@@ -40,8 +41,12 @@ module PintrestApi
40
41
  # ==== Examples
41
42
  #
42
43
  # PintrestApi::Board.all('mikakalathil')
43
- def all(user_name)
44
- visit_page user_name
44
+ def all(user_name, authentication)
45
+ try_or_check_login authentication
46
+
47
+ session_visit user_name
48
+ @session.save_and_open_page
49
+
45
50
  parse_boards get_with_ajax_scroll(BOARD_ITEM_CSS)
46
51
  end
47
52
 
@@ -56,8 +61,10 @@ module PintrestApi
56
61
  #
57
62
  # PintrestApi::Board.pins('mikakalathil', 'My Board Name!!!', {email: 'asdf@gmail.com', password: 'asdf'})
58
63
  def pins(user_name, board_name, authentication)
64
+ try_or_check_login authentication
65
+
59
66
  board_slug = board_name.downcase.gsub(/[_\s]/, '-')
60
- Pin.get_for_board_url("#{PINTREST_URL}#{user_name}/#{board_slug}", authentication)
67
+ Pin.get_for_board_url("#{user_name}/#{board_slug}", authentication)
61
68
  end
62
69
 
63
70
  private
@@ -1,6 +1,7 @@
1
1
  require 'capybara'
2
2
  require 'capybara/dsl'
3
3
  require 'capybara/poltergeist'
4
+ require 'pry'
4
5
 
5
6
 
6
7
  module PintrestApi
@@ -10,7 +11,7 @@ module PintrestApi
10
11
  attr_accessor :session
11
12
  include Capybara::DSL
12
13
 
13
- PINTREST_URL = 'http://www.pintrest.com/'
14
+ PINTREST_URL = 'http://www.pinterest.com/'
14
15
 
15
16
  class << self
16
17
  def visit_page(user_name)
@@ -21,9 +22,11 @@ module PintrestApi
21
22
  end
22
23
 
23
24
  def session_visit(url)
25
+ url = PINTREST_URL + url if url !~ /pinterest/
26
+
24
27
  begin
25
28
  @session.visit url
26
- sleep 2
29
+ sleep 3
27
30
  rescue Capybara::Poltergeist::TimeoutError
28
31
  puts 'Gotten blocked by pintrest waiting 2 min to try again'
29
32
  sleep 120
@@ -47,10 +50,10 @@ module PintrestApi
47
50
  def new_session
48
51
  # Register PhantomJS (aka poltergeist) as the driver to use
49
52
  Capybara.register_driver :poltergeist do |app|
50
- Capybara::Poltergeist::Driver.new(app, timeout: 60)
53
+ Capybara::Poltergeist::Driver.new(app, timeout: 60, js_errors: false)
51
54
  end
52
55
 
53
- # Use XPath as the default selector for the find method
56
+ # Use CSS as the default selector for the find method
54
57
  Capybara.default_selector = :css
55
58
 
56
59
  # Start up a new thread
@@ -84,8 +87,26 @@ module PintrestApi
84
87
  old_items_count = items.count
85
88
  scroll_page if old_items_count > 0
86
89
 
87
- newItems = Nokogiri::HTML.parse(html).css css_selector
88
- items = newItems if old_items_count === 0 || newItems.count > old_items_count
90
+ new_items = Nokogiri::HTML.parse(html).css css_selector
91
+ items = new_items if old_items_count === 0 || new_items.count > old_items_count
92
+ puts "New Count: #{items.count}\nOld Count: #{old_items_count}"
93
+ end
94
+
95
+ items
96
+ end
97
+
98
+ def stream_with_ajax_scroll(css_selector)
99
+ old_items_count = 0
100
+ items = []
101
+
102
+ until (items.count === old_items_count) && items.count > 0
103
+ old_items_count = items.count
104
+ scroll_page if old_items_count > 0
105
+
106
+ items = Nokogiri::HTML.parse(html).css css_selector if old_items_count === 0 || items.count > old_items_count
107
+
108
+ yield items[old_items_count..-1] if items.count > old_items_count
109
+
89
110
  puts "New Count: #{items.count}\nOld Count: #{old_items_count}"
90
111
  end
91
112
 
@@ -5,8 +5,8 @@ module PintrestApi
5
5
  class Pin < Core
6
6
  attr_reader :image_url, :title, :credits_url, :url, :description
7
7
 
8
- PINTREST_URL = 'http://www.pintrest.com'
9
- PIN_BASE_CSS = '.Grid .Module.Pin.PinBase'
8
+ PINTREST_URL = 'http://www.pinterest.com'
9
+ PIN_BASE_CSS = '.Grid .Pin'
10
10
  PIN_IMAGE_CSS = '.pinHolder .pinImg'
11
11
  PIN_TITLE_CSS = '.richPinGridTitle'
12
12
  PIN_CREDIT_CSS = '.creditItem a'
@@ -33,23 +33,51 @@ module PintrestApi
33
33
  # * +authentication+ -
34
34
  # ==== Examples
35
35
  #
36
- # PintrestApi::Pin.get_for_board_url('http://pintrest.com/mikaak/my-pins', , {email: 'asdf@gmail.com', password: 'asdf'})
36
+ # PintrestApi::Pin.get_for_board_url('http://pintrest.com/mikaak/my-pins', {email: 'asdf@gmail.com', password: 'asdf'})
37
37
  def get_for_board_url(board_url, authentication)
38
- login authentication if !@is_logged_in && authentication
39
- @is_logged_in = true
38
+ try_or_check_login authentication
40
39
 
41
40
  session_visit http_url(board_url)
42
41
  parse_pins get_with_ajax_scroll(PIN_BASE_CSS)
43
42
  end
44
43
 
45
- def get_for_board(board, authentication)
46
- login authentication if !@is_logged_in && authentication
47
- @is_logged_in = true
44
+ ##
45
+ # Gets all pins from a board url
46
+ #
47
+ # ==== Attributes
48
+ #
49
+ # * +board+ - Pintrest board
50
+ # * +authentication+ -
51
+ # ==== Examples
52
+ #
53
+ # PintrestApi::Pin.get_for_board(board, {email: 'asdf@gmail.com', password: 'asdf'})
54
+ def get_for_board(board, authentication = nil)
55
+ try_or_check_login authentication
48
56
 
49
57
  session_visit http_url(board.url)
50
58
  parse_pins get_with_ajax_scroll(PIN_BASE_CSS)
51
59
  end
52
60
 
61
+ ##
62
+ # Gets all pins from a board url
63
+ #
64
+ # ==== Attributes
65
+ #
66
+ # * +board+ - Pintrest board
67
+ # * +authentication+ -
68
+ # * +&block+ - a stream of every 25ish pins
69
+ # ==== Examples
70
+ #
71
+ # PintrestApi::Pin.get_for_board_stream(board, {email: 'asdf@gmail.com', password: 'asdf'}) do |pins| end
72
+ def get_for_board_stream(board, authentication = nil)
73
+ try_or_check_login authentication
74
+
75
+ session_visit http_url(board.url)
76
+ stream_with_ajax_scroll(PIN_BASE_CSS) do |pins|
77
+ yield parse_pins pins
78
+ end
79
+ end
80
+
53
81
  ## Planned
54
82
  # def top(count)
55
83
  # # Raise error if over 800 as page will freeze if higher
@@ -1,3 +1,3 @@
1
1
  module PintrestApi
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pintrest-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mika Kalathil