Spring SocialでStackExchangeの質問をツイートする
1前書き
これは、小さなサイドプロジェクトに関する3番目の最後の記事です。さまざまなQからの質問を自動的にツイートするボットです。
リンク:/tweeting-stackexchange-with-spring-social-part-1/[最初の記事]では、StackExchange REST API用のhttps://github.com/eugenp/java-stackexchange[simple client]の構築について説明しました。リンク:/spring
social
twitter__setup[2番目の記事]Spring Socialを使用してTwitterとの対話を設定しました。
この記事では、実装の最後の部分、Stackexchangeクライアントと
TwitterTemplate
間の対話を担当する部分について説明します。
2 Tweet Stackexchangeサービス
Stackexchangeクライアント(未加工の質問を公開する)と
TwitterTemplate(完全に設定されてツイートできる)の間の対話は、非常に単純なサービス(
TweetStackexchangeService)です。これによって公開されたAPIは次のとおりです。
public void tweetTopQuestionBySite(String site, String twitterAccount){ ... }
public void tweetTopQuestionBySiteAndTag(String site, String twitterAccount, String tag){ ... }
その機能は単純です – これらのAPIは、その特定のアカウントで
の前に
がツイートされていないことが判明するまで、Stackexchange REST APIからの質問を(クライアントを通して)読み続けます。
その質問が見つかると、そのアカウントに対応する
TwitterTemplate
** によってツイートされ、非常に単純な
Question
エンティティがローカルに保存されます。このエンティティは、質問のIDとそれがツイートされたTwitterアカウントのみを格納しています。
-
例えば** 次の質問:
SpringTip
アカウントのhttps://twitter.com/SpringTip/status/326561270604103680
Questionエンティティは単に以下を含みます。
-
質問の
ID
– この場合は4596351 -
質問がツイートされた
Twitterアカウント
–
SpringAtSO
質問が由来する
Stackexcangeサイト** –
スタックオーバーフロー
どの質問がすでにツイートされていて、どの質問がまだされていないかを知るために、この情報を追跡する必要があります。
3スケジューラ
スケジューラはSpringのスケジュールされたタスク機能を利用します – これらはJava設定を通して可能にされます:
@Configuration
@EnableScheduling
public class ContextConfig {
//}
実際のスケジューラは比較的単純です。
@Component
@Profile(SpringProfileUtil.DEPLOYED)
public class TweetStackexchangeScheduler {
@Autowired
private TweetStackexchangeService service;
//API
@Scheduled(cron = "0 0 1,5 ** ** ** ")
public void tweetStackExchangeTopQuestion() throws JsonProcessingException, IOException {
service.tweetTopQuestionBySiteAndTag("StackOverflow", Tag.clojure.name(), "BestClojure", 1);
String randomSite = StackexchangeUtil.pickOne("SuperUser", "StackOverflow");
service.tweetTopQuestionBySiteAndTag(randomSite, Tag.bash.name(), "BestBash", 1);
}
}
上記で構成された2つのツイート操作があります –
Best Of Clojure Twitterアカウント
の「clojure」でタグ付けされたStackOverflowの質問からの1つのツイート。
他の操作は「bash」でタグ付けされた質問をツイートします – そして、これらの種類の質問は実際にはStackexchangeネットワークからの複数のサイトに現れるからです。
StackOverflow
、http://superuser.com/questions/tagged/bash[SuperUser]、およびhttp://askubuntu.com/questions/tagged/bash[AskUbuntu]、最初にこれらのサイトの1つを選ぶための簡単な選択プロセスがあります、その後質問はツイートされます。
最後に、** cronジョブは毎日午前1時と午前5時に実行されるようにスケジュールされています。
4セットアップ
これはペットプロジェクトなので、
非常に単純なデータベース構造
から始まりました – それは今でもまだ単純ですが、それはさらにもっと単純でした。データベースの移行にはもちろんhttp://techblog.bozho.net/?p=1100[いくつかのツール]がありますが、主な目的の1つはデータベースの構造を簡単に変更できるようにすることです。そのような単純なプロジェクトです。
そこで、私はセットアップデータをhttps://github.com/eugenp/stackexchange2twitter/blob/master/src/main/resources/setup.properties[単純なテキストフォーマット]で保存することにしました – それは半自動的に更新されます。
セットアップには2つの主なステップがあります。
-
各Twitterアカウントでツイートされた質問のIDが取得されます。
テキストファイルに保存
** データベーススキーマは削除され、アプリケーションは再起動されます – これ
スキーマを再度作成し、テキストファイルからすべてのデータを新しいデータベースにセットアップします。
4.1. 生のセットアップデータ
JDBCを使用すると、既存のデータベースからデータを取得するプロセスは非常に簡単です。最初にRowMapperを定義します。
class TweetRowMapper implements RowMapper<String> {
private Map<String, List<Long>> accountToQuestions;
public TweetRowMapper(Map<String, List<Long>> accountToQuestions) {
super();
this.accountToQuestions = accountToQuestions;
}
public String mapRow(ResultSet rs, int line) throws SQLException {
String questionIdAsString = rs.getString("question__id");
long questionId = Long.parseLong(questionIdAsString);
String account = rs.getString("account");
if (accountToQuestions.get(account) == null) {
accountToQuestions.put(account, Lists.<Long> newArrayList());
}
accountToQuestions.get(account).add(questionId);
return "";
}
}
これにより、Twitterアカウントごとに質問のリストが作成されます。
次に、これを簡単なテストで使用します。
@Test
public void whenQuestionsAreRetrievedFromTheDB__thenNoExceptions() {
Map<String, List<Long>> accountToQuestionsMap = Maps.newHashMap();
jdbcTemplate.query
("SELECT ** FROM question__tweet;", new TweetRowMapper(accountToQuestionsMap));
for (String accountName : accountToQuestionsMap.keySet()) {
System.out.println
(accountName + "=" + valuesAsCsv(accountToQuestionsMap.get(accountName)));
}
}
アカウントの質問を取得した後、テストは単にそれらをリストします。例えば:
SpringAtSO=3652090,1079114,5908466,...
4.2. 設定データを復元する
前のステップで生成されたデータ行は、https://github.com/eugenp/stackexchange2twitter/blob/master/src/main/resources/setup.properties[
setup.properties
file]に格納されています。 :
@Configuration
@PropertySource({ "classpath:setup.properties" })
public class PersistenceJPAConfig {
//}
アプリケーションが起動すると、セットアッププロセスが実行されます。この簡単なプロセスは、
ContextRefreshedEvent
をリッスンして、Spring ApplicationListenerを使用します。
@Component
public class StackexchangeSetup implements ApplicationListener<ContextRefreshedEvent> {
private boolean setupDone;
public void onApplicationEvent(ContextRefreshedEvent event) {
if (!setupDone) {
recreateAllQuestionsOnAllTwitterAccounts();
setupDone = true;
}
}
}
最後に、質問が
setup.properties
ファイルから取得され、再作成されます。
private void recreateAllQuestionsOnTwitterAccount(String twitterAccount) {
String tweetedQuestions = env.getProperty(twitterAccount.name();
String[]questionIds = tweetedQuestions.split(",");
recreateQuestions(questionIds, twitterAccount);
}
void recreateQuestions(String[]questionIds, String twitterAccount) {
List<String> stackSitesForTwitterAccount = twitterAccountToStackSites(twitterAccount);
String site = stackSitesForTwitterAccount.get(0);
for (String questionId : questionIds) {
QuestionTweet questionTweet = new QuestionTweet(questionId, twitterAccount, site);
questionTweetDao.save(questionTweet);
}
}
この単純なプロセスにより、DB構造を簡単に更新できます。データが完全に消去され、完全に再作成されるため、
実際の移行を実行する必要はまったくありません
。
5アカウントの全リスト
-
Twitterアカウントの全リスト** は次のとおりです。
-
SpringTip
–
Spring
からの質問
スタックオーバーフロー
JavaTopSO
–
Java ** からの質問
スタックオーバーフロー
RESTDaily
–
REST ** からの質問
スタックオーバーフロー
BestJPA
–
JPA ** からの質問
スタックオーバーフロー
MavenFact
–
Maven ** の質問
スタックオーバーフロー
BestGit
– からの
Git ** の質問
スタックオーバーフロー
AskUbuntuBest
–
AskUbuntu ** best
その他の質問(すべてのトピック)
ServerFaultBest
–
ServerFault **
最高の質問(すべてのトピック)
BestBash
–
Bashに関する最善の質問**
StackOverflow、ServerFault、およびAskUbuntu
**
ClojureFact
– からClojure質問
スタックオーバーフロー
**
ScalaFact
– Scalaからの質問
スタックオーバーフロー
**
EclipseFacts
– Eclipseに関する質問
StackOverflowより
**
jQueryDaily
– jQueryからの質問
スタックオーバーフロー
**
BestAlgorithms
– アルゴリズム
StackOverflowからの質問
1日に2つのツイートがこれらのアカウントのそれぞれに作成され、その特定のテーマに関する最高評価の質問があります。
6. 結論
この第3回目の記事では、StackOverflowや他のStackExchangeサイトと統合してREST APIを通じて質問を検索し、TwitterやSpring Socialと統合してこれらの質問をツイートする方法について説明しました。説明する価値のある潜在的な方向は、グーグルプラスと同じことをすることである – おそらくアカウントではなくページを使用する。
-
14 Twitterアカウント** は、このプロジェクトの結果として、さまざまなトピックに焦点を当て、少量で高品質のコンテンツを作成することで稼働しています(自分のTwitterアカウントに値する他のタグのアイデアはコメントに歓迎されます)。