Moderasi konten dengan Cloud Functions for Firebase
27 June 2017
Di aplikasi yang memungkinkan pengguna posting konten publik - misalnya di forum, jejaring sosial dan platform blogging - selalu ada risiko bahwa konten yang tidak pantas akan dipublikasikan. Dalam entri blog ini, kita akan melihat langkah-langkah agar Anda bisa secara otomatis memoderasi konten yang tidak pantas dalam aplikasi Firebase Anda menggunakan Cloud Functions.
Strategi yang paling sering digunakan untuk memoderasi konten adalah "moderasi reaktif". Biasanya, Anda bisa menambahkan tautan yang memungkinkan pengguna untuk melaporkan konten yang tidak pantas sehingga Anda dapat mereview dan menurunkan konten yang tidak sesuai dengan aturan internal Anda secara manual. Anda bisa mencegah konten yang tidak pantas agar tidak terlihat oleh publik dan melengkapi moderasi reaktif Anda secara lebih baik dengan menambahkan mekanisme moderasi otomatis. Mari kita lihat bagaimana Anda bisa dengan mudah menambahkan pemeriksaan otomatis untuk konten yang tidak pantas dalam teks dan foto yang dipublikasikan oleh pengguna di aplikasi Firebase menggunakan Cloud Functions.
Kita akan melakukan dua jenis moderasi konten otomatis:
Moderasi teks di sini kita akan menghapus semua kata-kata umpatan dan teriakan (misalnya "BERTERIAK!!!").
Moderasi gambar - di sini kita akan mengaburkan gambar yang berisi konten dewasa atau kekerasan.
Moderasi otomatis, biasanya, perlu dilakukan di lingkungan yang tepercaya (bukan pada klien), jadi Cloud Functions for Firebase sangat cocok untuk hal ini. Dibutuhkan dua fungsi untuk melakukan dua jenis moderasi.
Moderasi teks akan dilakukan oleh fungsi bernama
Untuk menggambarkan hal ini, kita akan menggunakan struktur data sederhana yang mewakili daftar pesan yang telah ditulis oleh pengguna dari sebuah chat room. Ini terbuat dari objek dengan atribut
Setelah fungsi berjalan pada pesan yang baru ditambahkan, kita akan menambahkan dua atribut:
Fungsi
Dalam fungsi
Catatan: paket bad-words menggunakan paket badwords-list dari daftar kata-kata umpatan yang hanya berisi sekitar 400 kata. Seperti yang Anda tahu imajinasi pengguna di luar sana tidak memiliki batas, jadi daftar ini tidak lengkap dan Anda mungkin perlu memperbanyak kamus kata-kata kotor.
Untuk memoderasi gambar, kita menyiapkan fungsi
Untuk mengaburkan gambar yang tersimpan di Cloud Storage, pertama-tama kita perlu mengunduhnya secara lokal pada instance Cloud Functions, mengaburkan gambar dengan ImageMagick, yang secara default terpasang pada semua instance, kemudian mengunggah ulang gambar tersebut ke Cloud Storage:
Cloud Functions for Firebase bisa menjadi alat yang sempurna untuk secara reaktif dan otomatis menerapkan aturan moderasi. Silakan lihat contoh sumber terbuka kami untuk moderasi teks dan moderasi gambar.
Strategi yang paling sering digunakan untuk memoderasi konten adalah "moderasi reaktif". Biasanya, Anda bisa menambahkan tautan yang memungkinkan pengguna untuk melaporkan konten yang tidak pantas sehingga Anda dapat mereview dan menurunkan konten yang tidak sesuai dengan aturan internal Anda secara manual. Anda bisa mencegah konten yang tidak pantas agar tidak terlihat oleh publik dan melengkapi moderasi reaktif Anda secara lebih baik dengan menambahkan mekanisme moderasi otomatis. Mari kita lihat bagaimana Anda bisa dengan mudah menambahkan pemeriksaan otomatis untuk konten yang tidak pantas dalam teks dan foto yang dipublikasikan oleh pengguna di aplikasi Firebase menggunakan Cloud Functions.
Kita akan melakukan dua jenis moderasi konten otomatis:
Moderasi teks di sini kita akan menghapus semua kata-kata umpatan dan teriakan (misalnya "BERTERIAK!!!").
Moderasi gambar - di sini kita akan mengaburkan gambar yang berisi konten dewasa atau kekerasan.
Moderasi otomatis, biasanya, perlu dilakukan di lingkungan yang tepercaya (bukan pada klien), jadi Cloud Functions for Firebase sangat cocok untuk hal ini. Dibutuhkan dua fungsi untuk melakukan dua jenis moderasi.
Moderasi Teks
Moderasi teks akan dilakukan oleh fungsi bernama
moderator yang dipicu Firebase Realtime Database. Ketika pengguna menambahkan komentar atau posting baru ke Realtime Database, sebuah fungsi yang menggunakan paket npm bad-words akan terpicu untuk menghapus kata-kata umpatan. Kemudian kita menggunakan paket npm capitalize-sentence untuk memperbaiki pesan yang berisi terlalu banyak huruf besar (biasanya menandakan pengguna berteriak). Langkah terakhir adalah menulis kembali pesan yang telah dimoderasi ke Realtime Database. Untuk menggambarkan hal ini, kita akan menggunakan struktur data sederhana yang mewakili daftar pesan yang telah ditulis oleh pengguna dari sebuah chat room. Ini terbuat dari objek dengan atribut
text yang ditambahkan ke daftar /messages: /functions-project-12345
/messages
/key-123456
text: "This is my first message!"
/key-123457
text: "IN THIS MESSAGE I AM SHOUTING!!!"
Setelah fungsi berjalan pada pesan yang baru ditambahkan, kita akan menambahkan dua atribut:
sanitized yang bernilai true setelah diverifikasi oleh fungsi moderasi kita dan moderated yang bernilai true jika terdeteksi bahwa pesan berisi konten yang tidak pantas dan telah dimodifikasi Misalnya, setelah fungsi berjalan pada dua contoh pesan di atas, kita akan mendapatkan: /functions-project-12345
/messages
/key-123456
text: "This is my first message!",
sanitized: true,
moderated: false
/key-123457
text: "In this message I am shouting."
sanitized: true,
moderated: true
Fungsi
moderator kita akan terpicu setiap kali ada penulisan ke salah satu pesan. Kita menyetelnya dengan menggunakan aturan pemicu functions.database().path('/messages/{messageId}').onWrite(...). Kita akan memoderasi pesan dan menulis kembali pesan yang telah dimoderasi ke dalam Realtime Database: exports.moderator = functions.database.ref('/messages/{messageId}')
.onWrite(event => {
const message = event.data.val();
if (message && !message.sanitized) {
// Retrieved the message values.
console.log('Retrieved message content: ', message);
// Run moderation checks on on the message and moderate if needed.
const moderatedMessage = moderateMessage(message.text);
// Update the Firebase DB with checked message.
console.log('Message has been moderated. Saving to DB: ', moderatedMessage);
return event.data.adminRef.update({
text: moderatedMessage,
sanitized: true,
moderated: message.text !== moderatedMessage
});
}
});
Dalam fungsi
moderateMessage, pertama-tama kita akan memeriksa apakah pengguna berteriak, dan jika memang berteriak, perbaiki kalimat dan hapus kata-kata kotor menggunakan filter paket bad-words. function moderateMessage(message) {
// Re-capitalize if the user is Shouting.
if (isShouting(message)) {
console.log('User is shouting. Fixing sentence case...');
message = stopShouting(message);
}
// Moderate if the user uses SwearWords.
if (containsSwearwords(message)) {
console.log('User is swearing. moderating...');
message = moderateSwearwords(message);
}
return message;
}
// Returns true if the string contains swearwords.
function containsSwearwords(message) {
return message !== badWordsFilter.clean(message);
}
// Hide all swearwords. e.g: Crap => ****.
function moderateSwearwords(message) {
return badWordsFilter.clean(message);
}
// Detect if the current message is shouting. i.e. there are too many Uppercase
// characters or exclamation points.
function isShouting(message) {
return message.replace(/[^A-Z]/g, '').length > message.length / 2 || message.replace(/[^!]/g, '').length >= 3;
}
// Correctly capitalize the string as a sentence (e.g. uppercase after dots)
// and remove exclamation points.
function stopShouting(message) {
return capitalizeSentence(message.toLowerCase()).replace(/!+/g, '.');
}
Catatan: paket bad-words menggunakan paket badwords-list dari daftar kata-kata umpatan yang hanya berisi sekitar 400 kata. Seperti yang Anda tahu imajinasi pengguna di luar sana tidak memiliki batas, jadi daftar ini tidak lengkap dan Anda mungkin perlu memperbanyak kamus kata-kata kotor.
Moderasi Gambar
Untuk memoderasi gambar, kita menyiapkan fungsi
blurOffensiveImages yang akan terpicu setiap kali sebuah file diunggah ke Cloud Storage. Kita menyetelnya dengan menggunakan aturan pemicu functions.cloud.storage().onChange(...). Kita akan memeriksa apakah gambar berisi konten kekerasan atau vulgar menggunakan Google Cloud Vision API. Cloud Vision API memiliki fitur yang secara khusus memungkinkan kita untuk mendeteksi konten yang tidak pantas dalam gambar. Kemudian jika gambar itu tidak pantas kita akan mengaburkannya: exports.blurOffensiveImages = functions.storage.object().onChange(event => {
const object = event.data;
const file = gcs.bucket(object.bucket).file(object.name);
// Exit if this is a move or deletion event.
if (object.resourceState === 'not_exists') {
return console.log('This is a deletion event.');
}
// Check the image content using the Cloud Vision API.
return vision.detectSafeSearch(file).then(data => {
const safeSearch = data[0];
console.log('SafeSearch results on image', safeSearch);
if (safeSearch.adult || safeSearch.violence) {
return blurImage(object.name, object.bucket, object.metadata);
}
});
});
Untuk mengaburkan gambar yang tersimpan di Cloud Storage, pertama-tama kita perlu mengunduhnya secara lokal pada instance Cloud Functions, mengaburkan gambar dengan ImageMagick, yang secara default terpasang pada semua instance, kemudian mengunggah ulang gambar tersebut ke Cloud Storage:
function blurImage(filePath, bucketName, metadata) {
const filePathSplit = filePath.split('/');
filePathSplit.pop();
const fileDir = filePathSplit.join('/');
const tempLocalDir = `${LOCAL_TMP_FOLDER}${fileDir}`;
const tempLocalFile = `${LOCAL_TMP_FOLDER}${filePath}`;
const bucket = gcs.bucket(bucketName);
// Create the temp directory where the storage file will be downloaded.
return mkdirp(tempLocalDir).then(() => {
console.log('Temporary directory has been created', tempLocalDir);
// Download file from bucket.
return bucket.file(filePath).download({
destination: tempLocalFile
});
}).then(() => {
console.log('The file has been downloaded to', tempLocalFile);
// Blur the image using ImageMagick.
return exec(`convert ${tempLocalFile} -channel RGBA -blur 0x8 ${tempLocalFile}`);
}).then(() => {
console.log('Blurred image created at', tempLocalFile);
// Uploading the Blurred image.
return bucket.upload(tempLocalFile, {
destination: filePath,
metadata: {metadata: metadata} // Keeping custom metadata.
});
}).then(() => {
console.log('Blurred image uploaded to Storage at', filePath);
});
}
Cloud Functions for Firebase bisa menjadi alat yang sempurna untuk secara reaktif dan otomatis menerapkan aturan moderasi. Silakan lihat contoh sumber terbuka kami untuk moderasi teks dan moderasi gambar.