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アカウントに値する他のタグのアイデアはコメントに歓迎されます)。