Spring Social Twitter-instellingen

Het eerste deel van de serie behandelt het eerste werk van het gebruiken van de StackExchange REST API om de belangrijkste vragen op te halen. Dit tweede deel zal zich richten op het opzetten van de ondersteuning die nodig is om te communiceren met de Twitter REST API's met behulp van het Spring Social Twitter-project. Het uiteindelijke doel is om deze vragen twee keer per dag te kunnen tweeten op verschillende accounts, elk gericht op één onderwerp.

1. Spring Social Twitter gebruiken

De vereiste afhankelijkheden die nodig zijn om het Spring Social Twitter-project te gebruiken, zijn eenvoudig. Ten eerste definiëren we lente-social-twitter zelf:

 org.springframework.social spring-social-twitter 1.1.0.RELEASE 

Vervolgens moeten we enkele van zijn afhankelijkheden overschrijven met meer up-to-date versies:

 org.springframework spring-core 4.1.0.RELEASE org.springframework spring-web 4.1.0.RELEASE org.codehaus.jackson jackson-mapper-asl 1.9.13 

Beide lente-kern en lente-web worden gedefinieerd als afhankelijkheden door lente-social-twitter maar met Oudere versies3.0.7 VRIJGAVE en 3.1.0 VRIJGAVE respectievelijk. Door deze in onze eigen pom te overschrijven, zorgt u ervoor dat het project de up-to-date versies gebruikt die we hebben gedefinieerd in plaats van deze oudere geërfde versies.

2. Een Twitter-applicatie maken

Deze usecase - tweeten op een persoonlijk account en niet namens andere gebruikers op hun accounts, is een eenvoudige. Het feit dat het eenvoudig is, stelt ons in staat om af te zien van de meeste OAuth-orkestratie die nodig is als de applicatie voor meerdere gebruikers zou moeten tweeten, op elk van hun Twitter-accounts.

Dus, voor ons gebruik, zullen we dat doen maak het Twitter-sjabloon direct, aangezien we alles wat we hiervoor nodig hebben handmatig kunnen instellen.

Het eerste wat we nodig hebben is een dev-toepassing - hier kan een aangemaakt worden, na inloggen. Na het aanmaken van de applicatie hebben we een Gebruikers sleutel en Consumentengeheim - deze zijn verkregen via de pagina van de applicatie - op het Details tab, onder OAuth-instellingen.

Om de Applicatie in staat te stellen te tweeten op het account, Lezen en schrijven Toegang moet worden ingesteld om de standaard te vervangen Lezen enige privileges.

3. Bepaling van een Twitter-sjabloon

Vervolgens de Twitter-sjabloon vereist een Toegangstoken en een Toegang tot Token Secret worden ingericht. Deze kunnen ook worden gegenereerd vanaf de toepassingspagina - onder de Details tabblad - Maak mijn toegangstoken aan. Zowel het toegangstoken als het geheim kunnen vervolgens worden opgehaald onder het OAuth-tool tabblad.

Nieuwe kunnen altijd worden geregenereerd op de Details tabblad, via Maak mijn toegangstoken opnieuw aan actie.

Op dit punt hebben we alles wat we nodig hebben - de consumentensleutel en het consumentengeheim, evenals het toegangstoken en het toegangstokengeheim - wat betekent dat we door kunnen gaan en onze Twitter-sjabloon voor die toepassing:

nieuwe TwitterTemplate (consumerKey, consumerSecret, accessToken, accessTokenSecret);

4. Eén sjabloon per account

Nu we hebben gezien hoe we een single kunnen maken Twitter-sjabloon voor een enkele accountkunnen we onze usecase opnieuw bekijken - we moeten op verschillende accounts tweeten - wat betekent dat we er meerdere nodig hebben Twitter-sjabloon gevallen.

Deze kunnen eenvoudig op verzoek worden gemaakt met een eenvoudig mechanisme:

@Component openbare klasse TwitterTemplateCreator {@Autowired private Environment env; openbare Twitter getTwitterTemplate (String accountName) {String consumerKey = env.getProperty (accountName + ".consumerKey"); String consumerSecret = env.getProperty (accountName + ".consumerSecret"); String accessToken = env.getProperty (accountName + ".accessToken"); String accessTokenSecret = env.getProperty (accountName + ".accessTokenSecret"); Preconditions.checkNotNull (consumerKey); Preconditions.checkNotNull (consumerSecret); Preconditions.checkNotNull (accessToken); Preconditions.checkNotNull (accessTokenSecret); TwitterTemplate twitterTemplate = nieuwe TwitterTemplate (consumerKey, consumerSecret, accessToken, accessTokenSecret); retourneer twitterTemplate; }}

De vier beveiligingsartefacten zijn natuurlijk extern gemaakt in een eigenschappenbestand, per rekening; bijvoorbeeld voor het SpringAtSO-account:

SpringAtSO.consumerKey = nqYezCjxkHabaX6cdte12g SpringAtSO.consumerSecret = 7REmgFW4SnVWpD4EV5Zy9wB2ZEMM9WKxTaZwrgX3i4A SpringAtSO.accessToken = 1197830142-t44T7vwgmOnue8EoAxI1cDyDAEBAvple80s1SQ3 SpringAtSO.accessTokenSecret = ZIpghEJgFGNGQZzDFBT5TgsyeqDKY2zQmYsounPafE

Dit zorgt voor een goede mix van flexibiliteit en veiligheid - de beveiligingsreferenties maken geen deel uit van de codebase (die opensource is) maar leven onafhankelijk op het bestandssysteem en worden opgepikt door Spring en beschikbaar in de Spring-omgeving via een eenvoudige configuratie:

@Configuration @PropertySource ({"file: ///opt/stack/twitter.properties"}) openbare klasse TwitterConfig {//}

Eigenschappen in het voorjaar zijn een onderwerp dat al eerder is besproken, dus we gaan hier niet verder in op dit onderwerp.

Eindelijk een test zal controleren of een account de nodige beveiligingsinformatie direct beschikbaar heeft in de Spring-omgeving; als de eigendommen niet aanwezig zijn, de getTwitterTemplate logica zou de test moeten doorstaan ​​met een NullPointerException:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = {TwitterConfig.class}) openbare klasse TwitterTemplateCreatorIntegrationTest {@Autowired privé TwitterTemplateCreator twitterTemplateCreator; // @Test openbare leegte gegevenValidAccountSpringAtSO_whenRetrievingTwitterClient_thenNoException () {twitterTemplateCreator.getTwitterTemplate (SimpleTwitterAccount.SpringAtSO.name ()); }}

5. Tweeten

Met de Twitter-sjabloon gemaakt, laten we kijken naar de feitelijke actie van tweeten. Hiervoor gebruiken we een zeer eenvoudige service, waarbij we een Twitter-sjabloon en de onderliggende API gebruiken om een ​​tweet te maken:

@Service openbare klasse TwitterService {privé Logger-logger = LoggerFactory.getLogger (getClass ()); openbare ongeldige tweet (Twitter twitter, String tweetText) {probeer {twitter.timelineOperations (). updateStatus (tweetText); } catch (RuntimeException ex) {logger.error ("Kan niet tweeten" + tweetText, ex); }}}

6. Testen van het Twitter-sjabloon

En tot slot kunnen we een integratietest schrijven om het hele proces van het inrichten van een Twitter-sjabloon voor een account en tweeten op dat account:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = {TwitterConfig.class}) openbare klasse TweetServiceLiveTest {@Autowired privé TwitterService twitterService; @Autowired privé TwitterTemplateCreator twitterCreator; @Test openbare leegte whenTweeting_thenNoExceptions () {Twitter twitterTemplate = twitterCreator.getTwitterTemplate ("SpringAtSO"); twitterService.tweet (twitterTemplate, "Eerste Tweet"); }}

7. Conclusie

Op dit moment is de Twitter-API die we hebben gemaakt volledig gescheiden van de StackExchange-API en kan deze onafhankelijk van die specifieke gebruikssituatie worden gebruikt om iets te tweeten.

De volgende logische stap in het proces van het tweeten van vragen van Stack Exchange-accounts is het maken van een component - interactie met zowel de Twitter- als StackExchange-API's die we tot nu toe hebben gepresenteerd - dit zal de focus zijn van het volgende artikel in deze serie.