Twitter Webhook triggers Flow

Jedynym wyzwalaczem wbudowanym w Microsoft Flow dla Twittera jest „Kiedy nowy tweet jest opublikowany”. Lista zdarzeń dostępnych w dokumentacji aktywności konta (Account activity) API Twittera jest jednak znacznie szersza i składa się z 19 opcji. Ale jak z nich skorzystać?

Zainspirował mnie także przypadek użycia, który pozwala opublikować tweeta z podziękowaniami po tym, jak użytkownik zacznie followoać innego użytkownika. Rozwiązanie znane mi wykorzystywało jednak płatne rozwiązania online Zapier i Buffer. Zastanawiałem się, czy byłoby to możliwe tylko przy użyciu narzędzi ze środowiska Office 365 / Azure. A odpowiedź brzmiała … tak!

Sreencast

Screencast

Twitter API

Głównym elementem całego rozwiązania jest oczywiście API Twittera. Aby było to możliwe, musisz najpierw założyć konto programisty, utworzyć aplikację i utworzyć środowisko programistyczne. Oba mogą być używane za darmo.

Pamiętaj! Nazwa aplikacji (, której użyjesz, będzie wyświetlona wraz z aktywnością na Twitter, która zostanie przez nią wykonana, np.:

Displayed name of the app below a post created by it
Nazwa aplikacji wyświetlona poniżej posta wygenerowanego przez nią

Azure Function

I decided to use Node.js since I do know a little about programming in JavaScript 🙂 The function I created is being trigger via HTTP Request, it listens both to GET and POST requests. I also set it Authorization Level to Function.

Zdecydowałem się użyć Node.js, ponieważ wiem trochę o programowaniu w JavaScript 🙂 Funkcja, którą stworzyłem, jest uruchamiana za pośrednictwem żądania HTTP, nasłuchuje zarówno żądań GET, jak i POST. Ustawiłem także poziom autoryzacji (Authorization Level) na Function.

Configuration of Azure Function - Integrate option
Konfiguracja Azure Function – opcja: Integrate

Kluczowe jest to, że funkcja musi reagować w różny sposób, zależnie od tego, czy odbiera żądanie GET (jest to żądanie CRC do uwierzytelnienia endpoint dla webhooka) i POST (używane przez wywołania API Account Activity).

Obsługa żądań

Jest to kluczowa część, pozwalająca zarejestrować funkcję Azure jako aplikację dla webhook. Co 24 godziny Twitter wysyła do aplikacji Challenge-Response Check (CRC) w celu zweryfikowania jej wiarygodności. Zgodnie z dokumentacją: https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/guides/securing-webhooks, dla każdego takiego żądania Twoja aplikacja musi być w stanie uzyskać parametr crc_token, a następnie wysłać response_token zbudowany z crc_token i consumer_secret_key shashowany za pomocą HMAC SHA-256 i zakodowanego do łańcucha base64. Spore wyzwanie dla Flow. Ale nie dla funkcji Azure.

Mając to wszystko na uwadze, zbudowana funkcja zawiera blok if-else, który sprawdza rodzaj żądania i otrzymane parametry:

const crypto = require('crypto');
const https = require('https');

if (req.method === 'GET' && req.query.crc_token) {
    contents.log('CRC_Token: ' + req.query.crc_token);

    const responseToken = crypto.createHmac('sha256', process.env["Consumer_API_Key_Secret"]).
        update(req.query.crc_token).digest('base64');

    contents.res = {
        status: 200,
        headers: { "Content-Type": "application/json" },
        body: { "response_token": "sha256=" + responseToken + "" }
    };
}
else if (req.method === 'POST' && req.headers['content-type'] === 'application/json' && req.body) {
    // handling new account activity calls
}

Jeśli żądanie to GET, funkcja odczytuje wartość crc_token, następnie pobiera Consumer_API_Secret_Key ze zmiennych środowiskowych i używając biblioteki crypto generuje response_token, który następnie wysyła z powrotem.

Jeśli żądanie to POST, analizuje przychodzącą zawartość body i uruchamia mój Microsoft Flow, co możesz przeczytać później.

Account Activity Webhook

Aby utworzyć webhook, wykonaj poniższe kroki. Ja użyłem aplikacji Postman, aby je zrealizować.

Zgodnie z dokumentacją: https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/guides/getting-started-with-webhooks należy je wykonać następująco:

1. Zarejestruj swoją aplikację dla webhook poprzez wysłanie żądania POST do https://api.twitter.com/1.1/account_activity/all/{YOUR ENVIRONMENT NAME}/webhooks?url={YOUR APP URL}, zabezpieczonego nagłówkiem OAuth 1.0.

Wykonałem to z użyciem Postman:

Register Twitter Account Activity webhook with Azure Function app
Zarejestruj apikację Azure Function z Twitter Account Activity webhook
  1. Zdefiniuj szczegóły autoryzacji OAuth 1.0 w zakładce Authorization.
  2. Usuń wszystkie parametry z zakładki Params.
  3. Przenieś je do zakładki Body, do opcji x-www-form-urlencoded, jak to zostało opisane tutaj: https://github.com/twitterdev/postman-twitter-ads-api/issues/2.

Ważne! Wielokrotnie starałem się zarejestrować aplikację dla webhooka i ciągle otrzymywałem różne błędy z kodem „214”, które były po prostu różnymi opisami kodu „Unauthorized”. W końcu ponownie wygenerowałem wszystkie klucze i proces przeszedł gładko.

2. Dodaj konto (subskrybuj), dla którego działania zostaną przekazane przez webhook. Zrobiłem to również z Postman. Musisz wykonać żądanie POST do adresu URL: https://api.twitter.com/1.1/account_activity/all/{YOUR ENVIRONMENT NAME}/subscriptions.json i zabezpieczyć je nagłówkiem autoryzacji OAuth 1.0.

Słowo na koniec

Pamiętaj, że to rozwiązanie wymaga subskrypcji P1 dla Microsoft Flow, dzięki czemu możliwe jest korzystanie ze wszystkich dobrodziejstw akcji związanych z HTTP.

W ten sposób skonfigurowany wyzwalacz dla Microsoft Flow umożliwi słuchanie i działanie w przypadku wielu zdarzeń na koncie Twitter, takich jak:

  1. Tweets (by user)
  2. Tweet deletes (by user)
  3. @mentions (of user)
  4. Replies (to or from user)
  5. Retweets (by user or of user)
  6. Quote Tweets (by user or of user)
  7. Retweets of Quoted Tweets (by user or of user)
  8. Likes (by user or of user)
  9. Follows (by user or of user)
  10. Unfollows (by user)
  11. Blocks (by user)
  12. Unblocks (by user)
  13. Mutes (by user)
  14. Unmutes (by user)
  15. Direct Messages sent (by user)
  16. Direct Messages received (by user)
  17. Typing indicators (to user)
  18. Read receipts (to user)
  19. Subscription revokes (by user)

Co więcej, jeśli funkcja Azure została już skonfigurowana i Flow obsługuje żądania, możesz rozszerzyć swoje rozwiązanie tak jak ja. Napisałem drugą funkcję, która jest wywoływana przez Flow, aby opublikować tweeta z wiadomością z podziękowaniami dla każdego użytkownika, który zdecyduje się mnie obserwować na Twitter.

Ważne! Upewnij się, że Twoje rozwiązanie jest zgodne z najlepszymi praktykami i zasadami automatyzacji opisanymi poniżej:
https://help.twitter.com/en/rules-and-policies/twitter-rules-and-best-practices
https://help.twitter.com/en/rules-and-policies/twitter-automation

Mam nadzieję, że to rozwiązanie Ci się podoba i uznasz je za przydatne. Jeśli chcesz, abym pomógł Ci w implementacji tego rozwiązania w twoim projekcie lub aby dowiedzieć się więcej, złap mnie przez formularz kontaktowy lub zostaw komentarz. Dzięki!