tilde.news/script/post_to_twitter

78 lines
1.9 KiB
Ruby
Executable File

#!/usr/bin/env ruby
ENV["RAILS_ENV"] ||= "production"
APP_PATH = File.expand_path("../../config/application", __FILE__)
require File.expand_path("../../config/boot", __FILE__)
require APP_PATH
Rails.application.require_environment!
Story.to_tweet.each_with_index do |s, x|
if x > 0
sleep 2
end
tags = s.tags.pluck(:tag).map { |t| " #" + t }.join("")
via = ""
if s.user.twitter_username.present?
via = "\n" +
(s.user_is_author? ? "by" : "via") +
" @#{s.user.twitter_username}"
end
tco_status = via +
"\n" +
("X" * Twitter::TCO_LEN) + tags +
(s.url.present? ? "\n" + ("X" * Twitter::TCO_LEN) : "")
status = via +
"\n" +
s.short_id_url +
tags +
(s.url.present? ? "\n" + s.url : "")
left_len = Twitter::MAX_TWEET_LEN - tco_status.length
title = s.title
if /^([dm] |@)/i.match?(title)
# prevent these tweets from activating twitter shortcuts
# https://dev.twitter.com/docs/faq#tweeting
title = "- #{title}"
end
# if there are any urls in the title, they should be sized (at least) to a
# twitter t.co url
left_len -= title.scan(/[^ ]\.[a-z]{2,10}/i)
.map { |_u| [0, Twitter::TCO_LEN].max }
.inject(:+)
.to_i
if left_len < -3
left_len = -3
end
status = if title.bytesize > left_len
title[0, left_len - 3] + "..." + status
else
title + status
end
res = Twitter.oauth_request("/1.1/statuses/update.json", :post, "status" => status)
begin
if /\d+/.match?(res["id_str"].to_s)
s.update_column("twitter_id", res["id_str"])
elsif res["errors"].select { |e| e["code"] == 226 || e["code"] == 186 }.any?
# twitter is rejecting the content of this message, skip it
s.update_column("twitter_id", 0)
puts "skipping: failed posting story #{s.id} (#{status.inspect}): #{res.inspect}\n"
else
raise
end
rescue => e
puts "failed posting story #{s.id} (#{status.inspect}): #{e.inspect}\n#{res.inspect}"
exit
end
end