Bereaksi Formulir Umpan Balik Asli Menggunakan AWS + Telegram

gambar

Sebelum saya mulai mengintegrasikan formulir umpan balik di salah satu proyek terakhir saya, saya mencoba menemukan pendekatan non-standar untuk menyelesaikan masalah. Email membutuhkan semacam server SMTP, dan itu hanya membosankan, terutama untuk pemula dengan aliran pesan rendah.

Utusan, ini adalah alternatif yang bagus, dan ini adalah jalan yang saya pilih. Telegram menyediakan salah satu cara termudah untuk membuat bot (jika bukan yang termudah). Sebagai gantinya bisa apa saja - utusan lain, panggilan telepon (Amazon Connect) atau Yandex Dialogs.

Kami tidak mencoba membuat chatbot atau antarmuka untuk korespondensi, kami ingin ini terlihat seperti bentuk umpan balik normal ketika pengirim tidak mengharapkan tanggapan langsung. Dalam contoh di bawah ini, penerima akan dapat membalas pengguna melalui email, yang akan ditinggalkannya di bidang formulir.

Langkah 1: bot di Telegram, itu tidak bisa lebih mudah


Kami mengirim pesan @BotFatherdengan tim /newbot, menetapkan nama dan hanya itu! Kami mendapat tanda . Kami menyimpannya untuk diri kita sendiri.

Selain itu, kita perlu chat_id- identifikasi obrolan ke mana pesan akan dikirim. Pelajari chat_idsedikit lebih sulit daripada mendapatkan token , untungnya, ada perahu di bawah nama @my_id_botyang akan mengungkapkan Anda chat_id.

Akibatnya, kami memiliki token yang akan kami gunakan untuk "berbicara" dengan bot kami, dan chat_idakan digunakan untuk mengirim pesan kepada Anda secara pribadi. Sekarang Anda dapat mengirim perintah ke bot kami /startdan kami dapat melanjutkan.

Telegram ditampilkan sebagai contoh dan karena kemudahan penggunaan bot, mungkin ada messenger lain atau pemicu lain di tempatnya.

Langkah 2: Lambda sebagai perantara


Salah satu opsi untuk mengatur Telegram adalah dengan menyematkan seluruh kode permintaan dan "berbicara" dengan API Telegram ke dalam kode aplikasi Asli Bereaksi itu sendiri - pilihan yang baik untuk pengujian. Dalam kasus saya, API dengan beberapa fungsi Lambda aktif sudah dikonfigurasi, jadi opsi saya menyertakan Lambda sebagai lapisan perantara antara aplikasi dan API Telegram. Kode dan instruksi di bawah ini dapat digunakan dalam proyek React Native itu sendiri.

Saya menggunakan kerangka Serverless untuk membuat fungsi baru dengan parameter di bawah ini (format yaml).

sendTelegramMessage:
  description: used for contact form (${self:custom.stage})
  handler: lib/additional/sendMessageTelegram.handler
  environment: ${file(env_contact.yml):${self:custom.stage}}
  events:
    - http:
      path: contact
      method: POST
      private: false
  package:
    include:
      - lib/additional/sendMessageTelegram.js

Ingat bahwa token dan chat_idharus benar-benar disembunyikan. Dalam hal ini, saya menggunakan file variabel lingkungan yang akan digunakan di Lambda. Seperti yang Anda lihat dari baris di atas, Serverless akan mengonfigurasi Gateway API untuk permintaan POST. Perhatikan juga bahwa dalam hal ini, API terbuka untuk semua orang tanpa batasan apa pun.

Dan di sini adalah bagian dari kode Lambda yang akan menerima permintaan kami. Front-end kami hanya mengumpulkan informasi - email dan pesan, dan mengirimkan permintaan ke fungsi kami, yang akan memproses permintaan di API Telegram.

exports.handler = async (event) => {
  if (!event.body) {
    return createResponse(400, " ");
  }

  const data = JSON.parse(event.body);

  if (!data.email || !data.message) {
    return createResponse(400, " 'email'  'message' ");
  }

  try {
    const telegram = getTelegramConfig();

    await fetch(`${telegram.url}/bot${telegram.token}/sendMessage?${telegram.params(data.email, data.message)}`)

    return createResponse(200, " ");
  } catch (e) {
    return createResponse(500, e.message);
  }
};

Dua fungsi pembantu getTelegramConfiguntuk membuat URL permintaan dan createResponseuntuk menghasilkan respons standar dengan kode status dan pesan.

const getTelegramConfig = () => {
  const token = process.env.TELEGRAM_BOT_TOKEN;
  const chatId = process.env.TELEGRAM_MAIN_CONTACT;

  if (!token || !chatId) {
    throw new Error("  ");
  }

  return {
    url: "https://api.telegram.org",
    token,
    params: (email, message) => qp.encode({
      chat_id: chatId,
      parse_mode: "Markdown",
      text: "  " + email + ": ```" + message + "```"
    })
  };
};

const createResponse = (statusCode, message) => ({
  statusCode,
  body: JSON.stringify({ message }, null, 2)
});

qp.encodedigunakan untuk mengkonversi objek ke string seperti ?param1=value¶m2=value.

Sekarang, jika kami membuat permintaan POST dengan konten di bawah ini, kami akan menerima pesan kami di Telegram.

{
    "email": "privet@gmail.com",
    "message": "   .  . , ,  ,   . ,        .         ,   .  ,  .  .   ,     .          .  .    ,   "
}

gambar

Langkah 3: "Hubungi Kami" di Aplikasi Bereaksi Asli


Bagian ujung depan yang tersisa. Sebanyak mungkin, membutuhkan setidaknya 10 karakter untuk pesan dan memeriksa alamat email.

Bagian dari BEJ . Button- ini adalah komponennya dengan parameter tambahan disabledstatus tidak aktif ( ) dan status unduhan ( loading). Gaya juga sesuai dengan kebijaksanaan Anda.

<View style={styles.container}>
  <TextInput
    value={sendersEmail}
    keyboardType="email-address"
    autoCapitalize="none"
    autoCompleteType="email"
    style={styles.input}
    onChangeText={onEmailChange}
    selectionColor="#555"
    placeholder=" "
    placeholderTextColor="#CCC"
    clearButtonMode="always"
    returnKeyType="done"
    disableFullscreenUI
  />
  <TextInput
    value={message}
    style={{ ...styles.input, ...styles.messageInput }}
    onChangeText={onMessageChange}
    selectionColor="#555"
    placeholder=" ..."
    placeholderTextColor="#CCC"
    clearButtonMode="always"
    returnKeyType="done"
    multiline
    textAlignVertical="top"
    disableFullscreenUI
  />
  <Button
    title=""
    loading={loading}
    disabled={disabled}
    onPress={onSendPress}
  />
</View>

Bagian JavaScript.

const [ sendersEmail, setSendersEmail ] = useState("");
  const [ message, setMessage ] = useState("");

  const [ loading, setLoading ] = useState(false);

  const onEmailChange = (value) => {
    setSendersEmail(value);
  };

  const onMessageChange = (value) => {
    setMessage(value);
  };

  const onSendPress = () => {
    setLoading(true);

    const url = "https://api.example.com/contact";

    fetch(url, {
      method: "POST",
      body: JSON.stringify({
        email: sendersEmail,
        message
      })
    })
    .then(() => {
      setLoading(false);
    })
    .catch(() => {
      setLoading(false);

      Alert.alert("", "    .");
    });
  };

  const isValidEmail = () => {
    const emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

    return emailRegex.test(sendersEmail.toLowerCase());
  };


  const disabled = message.length < 10 || !isValidEmail();

Tombol Kirim akan tidak aktif sampai pengguna memasukkan alamat email yang benar dan setidaknya pesan 10 karakter. Ingat bahwa dalam contoh ini, API terbuka.

gambar

Seperti ini.

Apa yang hilang


  • Saya tidak menyentuh bagian dari API, ini adalah topik yang terpisah, banyak artikel lain dapat ditemukan tentang ini. Saya juga merekomendasikan agar Anda membiasakan diri dengan kerangka Serverless.
  • Dalam contoh ini, kami menerima pesan di Telegram, tetapi kami harus menjawabnya melalui email. Ada banyak opsi berbeda dan ini hanyalah sebuah contoh.

tautan yang bermanfaat


Dalam bahasa Inggris
https://core.telegram.org/bots/api#sendmessage
https://core.telegram.org/bots/api#markdown-style
https://facebook.imtqy.com/react-native/docs/ masukan teks

All Articles