twitter2vk_reposter 0.2.6 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +6 -0
- data/README.markdown +19 -7
- data/bin/twitter2vk_reposter +58 -36
- metadata +22 -2
data/ChangeLog
CHANGED
data/README.markdown
CHANGED
@@ -33,17 +33,23 @@ You can follow author @andrey_sitnik to receive last updates info.
|
|
33
33
|
Config is a YAML files with options:
|
34
34
|
|
35
35
|
* `vk_session` – session ID to access to VK.
|
36
|
-
* `
|
36
|
+
* `twitter_token`, `twitter_secret` — data to access to Twitter by OAuth.
|
37
37
|
* `exclude` – list of text or regexp patterns to exclude statuses from your VK.
|
38
|
-
Code `:reply` will exclude your replies to another
|
38
|
+
Code `:reply` will exclude your replies to another users, `:retweet` will
|
39
|
+
exclude retweets by you.
|
39
40
|
* `include` – list of text or regexp patterns to repost excluded statuses.
|
40
41
|
* `format` – format reposted status. `%status%` will be replaced by status text,
|
41
42
|
`%url%` by status link on Twitter.
|
43
|
+
* `last` — text after `format`. If status will be longer that VK allow,
|
44
|
+
`format` will be trim first. So `last` it useful, to set link to Twitter
|
45
|
+
status.
|
46
|
+
* `retweet` — format of retweet. `%status%` will be replaced by text,
|
47
|
+
`%author%` will be replace by tweet author.
|
42
48
|
* `replace` – list of array with 2 elements to replace text in status. Code
|
43
49
|
`:user_to_url` will replace user name to his Twitter link.
|
44
50
|
* `last_message` – file to contain ID of last reposted message.
|
45
51
|
|
46
|
-
##
|
52
|
+
## По-русски
|
47
53
|
|
48
54
|
Автоматический скрипт для публикации статусов Twitter’а во В Контакте. Так же
|
49
55
|
в отдельном пакете есть консольная утилита для создания настроек и добавления
|
@@ -79,13 +85,19 @@ Config is a YAML files with options:
|
|
79
85
|
Настройки хранятся в YAML файле с полями:
|
80
86
|
|
81
87
|
* `vk_session` – ID сессии для доступка к В Контакте.
|
82
|
-
* `
|
88
|
+
* `twitter_token`, `twitter_secret` — данные для доступа к Twitter’у через
|
89
|
+
OAuth.
|
83
90
|
* `exclude` — список слов или regexp’ов статусов, которые не нужно публиковать
|
84
|
-
во В Контакте. Код `:reply`
|
85
|
-
|
91
|
+
во В Контакте. Код `:reply` исключит ваши ответы другим пользователя,
|
92
|
+
`:retweet` — ретвиты от вас.
|
86
93
|
* `include` — список слов или regexp’ов для отмены exclude.
|
87
|
-
* `format` — вид статуса во В Контакте. `%status%` будет
|
94
|
+
* `format` — вид статуса во В Контакте. `%status%` будет заменён на текст
|
88
95
|
статуса, `%url%` — на ссылку на статус в Twitter’е.
|
96
|
+
* `last` — текст после `format`. Если статус больше допустимого во В Контакте,
|
97
|
+
то первым делом обрезается `format`, поэтому `last` удобен для указания ссылки
|
98
|
+
на твит.
|
99
|
+
* `retweet` — вид ретвита. `%status%` будет заменён на текст, `%author%` — на
|
100
|
+
автора твита.
|
89
101
|
* `replace` — список массивов из двух элементов для замены текста в статусе. Код
|
90
102
|
`:user_to_url` заменит имена пользователей на ссылку на их Twitter.
|
91
103
|
* `last_message` — файл, чтобы хранить ID последнего полученного сообщения.
|
data/bin/twitter2vk_reposter
CHANGED
@@ -6,6 +6,8 @@ $KCODE = 'u'
|
|
6
6
|
require 'rubygems'
|
7
7
|
require 'json'
|
8
8
|
require 'active_support'
|
9
|
+
require 'rvk'
|
10
|
+
require 'twitter_oauth'
|
9
11
|
|
10
12
|
require 'yaml'
|
11
13
|
require 'open-uri'
|
@@ -18,21 +20,22 @@ if ARGV.empty? or '--help' == ARGV.first or '-h' == ARGV.first
|
|
18
20
|
exit
|
19
21
|
end
|
20
22
|
|
21
|
-
def check(
|
22
|
-
|
23
|
+
def check(status, pattern)
|
24
|
+
return status.has_key?('retweeted_status') if :retweet == pattern
|
23
25
|
|
26
|
+
pattern = /^@\w/ if :reply == pattern
|
24
27
|
if pattern.is_a? String
|
25
|
-
text.index(pattern)
|
28
|
+
status['text'].index(pattern)
|
26
29
|
elsif pattern.is_a? Regexp
|
27
|
-
text =~ pattern
|
30
|
+
status['text'] =~ pattern
|
28
31
|
end
|
29
32
|
end
|
30
33
|
|
31
|
-
def repost?(
|
34
|
+
def repost?(status, config)
|
32
35
|
Array(config['exclude']).each do |pattern|
|
33
|
-
if check(
|
36
|
+
if check(status, pattern)
|
34
37
|
Array(config['include']).each do |pattern|
|
35
|
-
return true if check(
|
38
|
+
return true if check(status, pattern)
|
36
39
|
end
|
37
40
|
return false
|
38
41
|
end
|
@@ -40,56 +43,75 @@ def repost?(text, config)
|
|
40
43
|
true
|
41
44
|
end
|
42
45
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
def link(status)
|
47
|
+
"http://twitter.com/#{status['user']['screen_name']}/status/#{status['id']}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def format_text(status, format)
|
51
|
+
format.gsub('%status%', status['text']).
|
52
|
+
gsub('%url%', link(status)).
|
53
|
+
gsub('%author%', '@' + status['user']['screen_name']).mb_chars
|
54
|
+
end
|
55
|
+
|
56
|
+
def trim_text(text, length)
|
57
|
+
if text.length > length
|
58
|
+
text[0...(length - 1)] + '…'
|
59
|
+
else
|
60
|
+
text
|
61
|
+
end
|
47
62
|
end
|
48
63
|
|
49
64
|
def format_status(status, config)
|
50
|
-
|
51
|
-
text = format.gsub('%status%', status['text']).gsub('%url%',
|
52
|
-
"twitter.com/#{status['user']['screen_name']}/#{status['id']}")
|
65
|
+
last = trim_text(format_text(status, config['last']), 159)
|
53
66
|
|
67
|
+
if status.has_key?('retweeted_status')
|
68
|
+
text = format_text(status['retweeted_status'], config['retweet'])
|
69
|
+
else
|
70
|
+
text = format_text(status, config['format'])
|
71
|
+
end
|
54
72
|
Array(config['replace']).each do |replace|
|
55
|
-
|
73
|
+
if :user_to_url == replace
|
74
|
+
replace = [/@([a-zA-Z0-9_]+)/, 'http//twitter.com/\\1']
|
75
|
+
end
|
56
76
|
text.gsub!(replace[0], replace[1])
|
57
77
|
end
|
58
78
|
|
59
|
-
text
|
60
|
-
text = text[0...159] + '…' if text.length > 160
|
61
|
-
text.to_s
|
79
|
+
trim_text(text, 160 - last.length).to_s + last.to_s
|
62
80
|
end
|
63
81
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
Net::HTTP.new(url.host, url.port).start { |http| http.request(request) }
|
71
|
-
end
|
72
|
-
|
73
|
-
config = YAML.load_file(ARGV.first)
|
82
|
+
default = {
|
83
|
+
'format' => '%status%',
|
84
|
+
'last' => '',
|
85
|
+
'retweet' => 'RT %author%: %status%'
|
86
|
+
}
|
87
|
+
config = default.merge(YAML.load_file(ARGV.first))
|
74
88
|
|
75
89
|
last_message = if File.exists? config['last_message']
|
76
90
|
File.read(config['last_message']).strip
|
77
91
|
end
|
78
92
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
93
|
+
twitter = TwitterOAuth::Client.new(:consumer_key => 'lGdk5MXwNqFyQ6glsog0g',
|
94
|
+
:consumer_secret => 'jHfpLGY11clNSh9M0Fqnjl7fzqeHwrKSWTBo4i8TUcE',
|
95
|
+
:token => config['twitter_token'], :secret => config['twitter_secret'])
|
96
|
+
if last_message
|
97
|
+
query = { :since_id => last_message }
|
98
|
+
else
|
99
|
+
query = { :count => 1 }
|
100
|
+
end
|
101
|
+
statuses = twitter.user_timeline(query) + twitter.retweeted_by_me(query)
|
102
|
+
statuses.sort! { |a, b| a['id'] <=> b['id'] }
|
103
|
+
|
104
|
+
statuses = [statuses.last] unless last_message
|
83
105
|
|
84
106
|
unless statuses.empty?
|
85
|
-
|
107
|
+
vk = Vkontakte::User.new(config['vk_session'])
|
86
108
|
|
87
109
|
last_message_id = nil
|
88
|
-
statuses.
|
110
|
+
statuses.each do |status|
|
111
|
+
next unless repost? status, config
|
89
112
|
text = format_status(status, config)
|
90
113
|
last_message_id = status['id']
|
91
|
-
|
92
|
-
set_status_to_vk(text, config['vk_session'], activityhash)
|
114
|
+
vk.set_status(text)
|
93
115
|
break
|
94
116
|
end
|
95
117
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitter2vk_reposter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.3"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey "A.I." Sitnik
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-22 00:00:00 +03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,6 +32,26 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: "0"
|
34
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rvk
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: twitter_oauth
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
35
55
|
description: " Server script to repost Twitter statuses to VK (\xD0\x92 \xD0\x9A\xD0\xBE\xD0\xBD\xD1\x82\xD0\xB0\xD0\xBA\xD1\x82\xD0\xB5).\n Install twitter2vk to create config and cron task for it.\n"
|
36
56
|
email: andrey@sitnik.ru
|
37
57
|
executables:
|