ba-webby-pingback 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +75 -0
- data/ext/pingback.cgi +13 -0
- data/tasks/pingback.rake +57 -0
- data/webby-pingback.gemspec +18 -0
- metadata +86 -0
data/README.textile
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
h2. Why and what?
|
2
|
+
|
3
|
+
I like webby and the idea of having a blog with static pages, not that I ever think I need the speed of it but I at least save some RAM on a daily basis. :)
|
4
|
+
|
5
|
+
So this gem can send pingbacks and also receive pingbacks through "Disqus":http://www.disqus.com. What we're actually doing when receiving is just validating it as a "pingback":http://en.wikipedia.org/wiki/Pingback and then send a "trackback":http://en.wikipedia.org/wiki/Trackback to the Disqus page for the post.
|
6
|
+
|
7
|
+
h2. Usage
|
8
|
+
|
9
|
+
Make sure that all your posts that you want to be able to ping
|
10
|
+
other sites have a meta-data key that is called _trackback_done_ and
|
11
|
+
set it to false. When the ping has been done, successful or otherwise,
|
12
|
+
it will be set to true. Eg:
|
13
|
+
|
14
|
+
<pre>
|
15
|
+
<code>
|
16
|
+
---
|
17
|
+
title: a spiffy blogpost
|
18
|
+
trackback_done: false
|
19
|
+
---
|
20
|
+
</code>
|
21
|
+
</pre>
|
22
|
+
|
23
|
+
Write your posts, deploy and then run:
|
24
|
+
|
25
|
+
@webby pingback:ping@
|
26
|
+
|
27
|
+
*Note:* _You've to deploy because of how the pingback protocol works._
|
28
|
+
|
29
|
+
h2. Installation
|
30
|
+
|
31
|
+
Install it through rubygems:
|
32
|
+
|
33
|
+
@gem install ba-webby-pingback --source gems.github.com@
|
34
|
+
|
35
|
+
h3. Installing the sender
|
36
|
+
|
37
|
+
Now you've to install the rake tasks. Do this by either copying the
|
38
|
+
pingback.rake file from the gem installation directory or create a new
|
39
|
+
file with this content:
|
40
|
+
|
41
|
+
@require 'webby-pingback-rake'@
|
42
|
+
|
43
|
+
h3. Installing the receiver
|
44
|
+
|
45
|
+
To receive pingbacks you've to run a script that can act as a XML-RPC server, I've written a CGI-script using Rubys built-in XML-RPC package (which also can run it as a standalone server or WEBrick servlet), which can be used with a CGI-script that looks like this: (a copy exists in the _ext_ folder)
|
46
|
+
|
47
|
+
<pre>
|
48
|
+
<code>
|
49
|
+
#!/usr/bin/env ruby
|
50
|
+
# -*- coding: utf-8 -*-
|
51
|
+
$KCODE = 'u'
|
52
|
+
|
53
|
+
module Pingback
|
54
|
+
Conf = {
|
55
|
+
:db => 'path-to-sqlite-datbase-that-is-writable-by-server'
|
56
|
+
:forum_api_key => 'long string from disqus, use rake task to get'
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
require 'rubygems'
|
61
|
+
require 'webby-pingback-xmlrpc.cgi'
|
62
|
+
</code>
|
63
|
+
</pre>
|
64
|
+
|
65
|
+
*Note*: _The pingback database, a sqlite database, has to be writable by the server running the cgi-script._
|
66
|
+
|
67
|
+
To get the Disqus forum api key you can use a rake-task that is included in the rakefale for this gem. Just run:
|
68
|
+
|
69
|
+
@webby pingback:fetch_disqus_forum_key@
|
70
|
+
|
71
|
+
The user key you can get at http://disqus.com/api/get_my_key/ when you're logged in.
|
72
|
+
|
73
|
+
When the CGI-script is setup and is working you only have to add a @<link>@ tag to your blogposts that points to the CGI-script and we're done:
|
74
|
+
|
75
|
+
@<link rel="pingback" href="http://example.com/cgi-bin/pingback-xmlrpc.cgi.rb" />@
|
data/ext/pingback.cgi
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$KCODE = 'u'
|
4
|
+
|
5
|
+
module Pingback
|
6
|
+
Conf = {
|
7
|
+
:db => 'path-to-sqlite-datbase-that-is-writable-by-server'
|
8
|
+
:forum_api_key => 'long string from disqus, use raketasks to get'
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rubygems'
|
13
|
+
require 'webby-pingback-xmlrpc.cgi'
|
data/tasks/pingback.rake
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'webby-pingback'
|
4
|
+
|
5
|
+
namespace :pingback do
|
6
|
+
desc 'Ping all links in all new blogposts which hasn\'t been processed'
|
7
|
+
task :ping do
|
8
|
+
Webby.load_files
|
9
|
+
db = Webby::Resources.pages.find(:all, :blog_post => true, :trackback_done => false)
|
10
|
+
db.each do |page|
|
11
|
+
doc = Hpricot(File.read(Webby.site.output_dir + page.url))
|
12
|
+
urls = (doc/'/html/body//a[@href]').inject([]) do |memo, a|
|
13
|
+
if a['href'] == ("#{Webby.site.base}/") or a['href'].match(/(disqus)|(webby.rubyforge.org)/)
|
14
|
+
memo
|
15
|
+
else
|
16
|
+
memo << a['href']
|
17
|
+
end
|
18
|
+
end.uniq # /doc
|
19
|
+
|
20
|
+
pinger = Pingback::Sender.new("#{Webby.site.base}#{page.url}", urls)
|
21
|
+
pinger.start
|
22
|
+
Pingback.toggle_trackback_done(page.path)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'Fetches the Disqus forum key, needs the User API key'
|
27
|
+
task :fetch_disqus_forum_key do
|
28
|
+
require 'open-uri'
|
29
|
+
require 'json'
|
30
|
+
disqus_url = 'http://disqus.com/api/'
|
31
|
+
|
32
|
+
print 'Disqus user API key: '
|
33
|
+
user_key = STDIN.gets.strip
|
34
|
+
|
35
|
+
forum_list = JSON.parse(open("#{disqus_url}get_forum_list/?user_api_key=#{user_key}").read)
|
36
|
+
forum_id = if forum_list['message'].size > 2
|
37
|
+
puts 'Available shortnames:'
|
38
|
+
forum_list['message'].each_with_index {|x, i| puts "\t#{i + 1}) #{x['shortname']}" }
|
39
|
+
|
40
|
+
print 'Fetch shortname # '
|
41
|
+
num = STDIN.gets.strip
|
42
|
+
forum_list['message'][num.to_i - 1]['id']
|
43
|
+
else
|
44
|
+
forum_list['message'][0]['id']
|
45
|
+
end
|
46
|
+
|
47
|
+
if forum_id
|
48
|
+
forum_api_key = JSON.parse(open("#{disqus_url}get_forum_api_key/?user_api_key=#{user_key}&forum_id=#{forum_id}").read)
|
49
|
+
if forum_api_key['succeeded']
|
50
|
+
puts "Forum api key: #{forum_api_key['message']}"
|
51
|
+
else
|
52
|
+
STDERR.puts 'Unknown error:'
|
53
|
+
STDERR.puts forum_api_key.inspect
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.name = "webby-pingback"
|
4
|
+
s.version = "1.0"
|
5
|
+
s.date = Time.now.strftime('%Y-%m-%d')
|
6
|
+
s.description = "Using Webby and some custom meta-data tags enable pingbacks to blogs and pages"
|
7
|
+
s.authors = ["Björn Andersson"]
|
8
|
+
s.email = "ba@sanitarium.se"
|
9
|
+
s.homepage = "http://github.com/ba/webby-pingback"
|
10
|
+
s.summary = s.description
|
11
|
+
s.require_path = 'lib'
|
12
|
+
s.has_rdoc = false
|
13
|
+
s.files = %w[README.textile tasks/pingback.rake webby-pingback.gemspec ext/pingback.cgi] +
|
14
|
+
Dir.glob('lib/*.rb')
|
15
|
+
s.add_dependency('amalgalite', '>= 0.10.2')
|
16
|
+
s.add_dependency('json', '>= 1.1.7')
|
17
|
+
s.add_dependency('hpricot', '>= 0.8.1')
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ba-webby-pingback
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "1.0"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- "Bj\xC3\xB6rn Andersson"
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-08-15 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: amalgalite
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.10.2
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: json
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.7
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: hpricot
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.8.1
|
44
|
+
version:
|
45
|
+
description: Using Webby and some custom meta-data tags enable pingbacks to blogs and pages
|
46
|
+
email: ba@sanitarium.se
|
47
|
+
executables: []
|
48
|
+
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
extra_rdoc_files: []
|
52
|
+
|
53
|
+
files:
|
54
|
+
- README.textile
|
55
|
+
- tasks/pingback.rake
|
56
|
+
- webby-pingback.gemspec
|
57
|
+
- ext/pingback.cgi
|
58
|
+
has_rdoc: false
|
59
|
+
homepage: http://github.com/ba/webby-pingback
|
60
|
+
licenses:
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: "0"
|
71
|
+
version:
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: "0"
|
77
|
+
version:
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 1.3.5
|
82
|
+
signing_key:
|
83
|
+
specification_version: 2
|
84
|
+
summary: Using Webby and some custom meta-data tags enable pingbacks to blogs and pages
|
85
|
+
test_files: []
|
86
|
+
|