twitter2vk_reposter 0.2.6 → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|