Pengaturan Twitter Sosial Musim Semi

Bagian pertama dari rangkaian ini mengalami dealth dengan pekerjaan awal menggunakan StackExchange REST API untuk mengambil pertanyaan teratasnya. Bagian kedua ini akan berfokus pada pengaturan dukungan yang diperlukan untuk berinteraksi dengan REST API Twitter menggunakan proyek Twitter Sosial Musim Semi. Tujuan akhirnya adalah agar dapat men-tweet pertanyaan ini, dua pertanyaan per hari, di beberapa akun, masing-masing berfokus pada satu topik.

1. Menggunakan Spring Social Twitter

Dependensi yang diperlukan untuk menggunakan proyek Twitter Sosial Musim Semi sangatlah mudah. Pertama, kami mendefinisikan spring-social-twitter itu sendiri:

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

Kemudian, kita perlu mengganti beberapa dependensinya dengan versi yang lebih up-to-date:

 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 

Baik spring-core dan spring-web didefinisikan sebagai dependensi oleh spring-social-twitter tetapi dengan versi yang lebih lama - 3.0.7.RELEASE dan 3.1.0.RELEASE . Mengganti ini di pom kami sendiri memastikan bahwa proyek menggunakan versi terbaru yang telah kami tentukan, bukan versi lama yang diwariskan ini.

2. Membuat Aplikasi Twitter

Kasus penggunaan ini - menge-tweet di akun pribadi dan bukan atas nama pengguna lain di akun mereka, adalah hal yang sederhana. Fakta bahwa itu sederhana memungkinkan kita untuk membuang sebagian besar orkestrasi OAuth yang diperlukan jika aplikasi perlu men-tweet untuk beberapa pengguna, di setiap akun twitter mereka.

Jadi, untuk kasus penggunaan kami, kami akan membuat TwitterTemplate secara langsung , karena kami dapat secara manual mengatur semua yang kami butuhkan untuk melakukannya.

Hal pertama yang kita butuhkan adalah aplikasi dev - aplikasi dapat dibuat di sini, setelah masuk. Setelah membuat aplikasi, kita akan memiliki Kunci Konsumen dan Rahasia Konsumen - ini diperoleh dari halaman Aplikasi - pada tab Detail , di bawah Pengaturan OAuth .

Selain itu, untuk mengizinkan Aplikasi men-tweet di akun, Akses Baca dan Tulis harus diatur untuk menggantikan hak istimewa Hanya baca default .

3. Menyediakan Templat Twitter

Selanjutnya, TwitterTemplate memerlukan Access Token dan Access Token Secret untuk disediakan. Ini juga dapat dibuat dari halaman Aplikasi - di bawah tab Detail - Buat token akses saya . Baik Access Token dan Secret kemudian dapat diambil dari bawah tab alat OAuth .

Yang baru selalu dapat dibuat ulang di tab Detail , melalui Buat ulang tindakan token akses saya .

Pada titik ini kami memiliki semua yang kami butuhkan - Kunci Konsumen dan Rahasia Konsumen, serta Token Akses dan Rahasia Token Akses - yang berarti kami dapat melanjutkan dan membuat TwitterTemplate kami untuk aplikasi itu:

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

4. Satu Template per Akun

Sekarang kita telah melihat cara membuat satu TwitterTemplate untuk satu akun , kita dapat melihat kembali kasus penggunaan kita lagi - kita perlu men-tweet di beberapa akun - yang berarti kita memerlukan beberapa contoh TwitterTemplate .

Ini dapat dengan mudah dibuat berdasarkan permintaan, dengan mekanisme sederhana:

@Component public class TwitterTemplateCreator { @Autowired private Environment env; public 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 = new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret); return twitterTemplate; } }

Keempat artefak keamanan tentu saja dieksternalisasi dalam file properti , menurut akun; misalnya, untuk akun SpringAtSO:

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

Hal ini memungkinkan adanya perpaduan yang baik antara fleksibilitas dan keamanan - kredensial keamanan bukan bagian dari basis kode (yang merupakan sumber terbuka) tetapi hidup secara independen di sistem file dan diambil oleh Spring dan tersedia di Spring Enviroment melalui konfigurasi sederhana:

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

Properti di Spring adalah subjek yang telah dibahas sebelumnya, jadi kami tidak akan membahas detail lebih lanjut tentang subjek ini di sini.

Terakhir, pengujian akan memverifikasi bahwa akun memiliki informasi keamanan yang diperlukan yang tersedia di Lingkungan Spring; jika properti tidak ada, logika getTwitterTemplate akan gagal dalam pengujian dengan NullPointerException :

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { TwitterConfig.class }) public class TwitterTemplateCreatorIntegrationTest { @Autowired private TwitterTemplateCreator twitterTemplateCreator; // @Test public void givenValidAccountSpringAtSO_whenRetrievingTwitterClient_thenNoException() { twitterTemplateCreator.getTwitterTemplate(SimpleTwitterAccount.SpringAtSO.name()); } }

5. Tweeting

Dengan TwitterTemplate dibuat, mari beralih ke tindakan tweeting yang sebenarnya . Untuk ini, kami akan menggunakan layanan yang sangat sederhana, menerima TwitterTemplate dan menggunakan API yang mendasarinya untuk membuat tweet:

@Service public class TwitterService { private Logger logger = LoggerFactory.getLogger(getClass()); public void tweet(Twitter twitter, String tweetText) { try { twitter.timelineOperations().updateStatus(tweetText); } catch (RuntimeException ex) { logger.error("Unable to tweet" + tweetText, ex); } } }

6. Menguji TwitterTemplate

Dan terakhir, kita dapat menulis tes integrasi untuk melakukan seluruh proses penyediaan TwitterTemplate untuk akun dan men-tweet di akun itu:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { TwitterConfig.class }) public class TweetServiceLiveTest { @Autowired private TwitterService twitterService; @Autowired private TwitterTemplateCreator twitterCreator; @Test public void whenTweeting_thenNoExceptions() { Twitter twitterTemplate = twitterCreator.getTwitterTemplate("SpringAtSO"); twitterService.tweet(twitterTemplate, "First Tweet"); } }

7. Kesimpulan

Pada titik ini, API Twitter yang kami buat benar-benar terpisah dari StackExchange API dan dapat digunakan terlepas dari kasus penggunaan tertentu, untuk menge-tweet apa pun.

Langkah logis berikutnya dalam proses tweeting pertanyaan dari akun Stack Exchange adalah membuat komponen - berinteraksi dengan API Twitter dan StackExchange yang telah kami sajikan sejauh ini - ini akan menjadi fokus artikel berikutnya dalam seri ini.