我正在使用Twitter gem生成包含图片的特定主题标签的最近推文列表。
它工作正常,但我注意到当人们在其推文中将标点添加到主题标签时,API不会将它们包含在我的搜索结果中。为了说明,当我搜索#sourcecon
时,它不包含使用#sourcecon!
通过#sourcecon.
或#sourcecon!
的API运行单独搜索无效 - 它会忽略标点并生成相同的列表。
我的代码在这里:
twitter_client.search("'#sourcecon' filter:images", result_type: "recent", :since_id => last_tweet).collect
VS
twitter_client.search("'#sourcecon!' filter:images", result_type: "recent", :since_id => last_tweet).collect
我知道Twitter将标点符号视为不是标签的一部分。来自twitter API:
请注意,标点符号不被视为#hashtag或@mention的一部分,因此包含标点符号的跟踪词与#hashtags或@mentions不匹配。
但是不应该意味着它会完全忽略它并返回所有结果(包括那些在推文中包含附加标点符号的结果?)
有没有人知道如何在此处获取搜索结果,其中包括最后是否有标点符号的标签提及?
答案 0 :(得分:2)
通过Twitter搜索,标点符号和特殊字符将被视为您要搜索的字词的一部分,因此搜索#twitter!'将返回' #twitter!'," twitter?',' #twitter'等。您可以做的是检查搜索是否包含任何类型的搜索标点符号,如果是,您可以对数组进行排序以首先添加这些推文。
require 'twitter'
module TwitterSearch
extend self
@twiiter_client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
end
# search returns
# Check out what @researchgoddess is up to at #sourcecon!
# What a welcome from @SourceCon! Thanks @CareerBuilder for hosting.#
# RT @JRoberts257: Happy hour at #SourceCon! Thanks @CareerBuilder for
# Happy hour at #SourceCon! Thanks @CareerBuilder for sponsoring. ht
# @RT @cybsearchjoe: #SourceCon is rocking
# etc
def search(text)
tweets = @twitter_client.search("#{text} filter:images", result_type: "recent").take(30).collect do |tweet|
"#{tweet.text}"
end
# looks to see if there is puncuation at the end of the text "!.?{}[]" It will ignore the # at the beginning
tweets = sort_tweets(text, tweets) if text[1..text.length] =~ /[[:punct:]]/
puts tweets
end
# sorts tweets based off index given in match_phrase
def sort_tweets(text, tweets)
tweets.sort do |phrase, other_phrase|
match_phrase(phrase, text, tweets) <=> match_phrase(other_phrase, text, tweets)
end
end
# if phrase matches punc_text(text) the phrase will be inserted at the beginning of the array else it will return its previous index.
def match_phrase(phrase, text, tweets)
phrase.match(/#{punc_text(text)}/i).nil? ? tweets.index(phrase) + 1 : 0
end
# adds backslash to punctuation '#sourcecon//?|!|.'
def punc_text(text)
text[1..text.length].gsub(/([[:punct:]])/){|punc| "\\#{punc}"}
end
end
TwitterSearch.search('#sourcecon!')