Tugas itu tampak sederhana ketika Anda tidak tahu apa-apa tentang itu dan kapan Anda memutuskan.
Pada suatu hari yang "luar biasa", saya menyadari bahwa saya tidak tertarik duduk di banyak forum, tetapi saya ingin membuat saluran saya sendiri dan berbagi "kebijaksanaan".
Saya suka fitur Telegram yang tertanam di dalamnya termasuk bot, jadi saluran dalam bentuk blog dibuat di sana. Dia mulai mencari bot untuk membantu menulis pesan .... dan karena saya ingin tidak menemukannya. Nah, tulis sendiri. Orang pintar disarankan untuk menulis dengan Python.
Saya membaca tutorial pertama di Internet pada 149 halaman. Saya kenal dengan Pascal, FoxPro, Interbase dan bahkan (ha ha 3 kali) 20 tahun yang lalu saya menjual program saya, dan kemudian entah bagaimana tidak berhasil, saya masuk ke perdagangan. Bekerja sebagai programmer sangat membantu saya dalam menetapkan tugas untuk coders. Tetapi kembali ke Python, tampaknya, tidak ada yang rumit, karena itu mungkin untuk memprogram pada BASIC juga, dan ini bukan diploma kuliah saya dengan kompleks perangkat keras-perangkat lunak dari generator verifikasi MIG pada Assembler. Satu masalah, itu sudah lama sekali, jadi kembali ke berita utama - sepertinya sederhana, karena saya belum tahu apa-apa tentang tugas itu, tetapi patut dicoba.
Saya memutuskan bahwa paling mudah membuat proyek dari smartphone ke Android, karena selalu ada. Jadi cantumkan:
- Pydroid 3 - IDE untuk Python 3 Sebenarnya Python untuk Android.
- @BotFather, Di Telegram, kami memasang ayah dari semua bot - Anda akan membutuhkannya untuk mendapatkan pengenal bot Anda dan membuat pengaturan dasar.
- Aplikasi Rebootr untuk meluncurkan proyek di heroku.
- GIT Aplikasi untuk hosting repositori online.
- Windscribe Tanpa VPN di mana saja?
- Emulator Terminal Termux dan lingkungan Linux.
Dan apa intinya? Pemrograman pada smartphone dimungkinkan secara teori, tetapi dalam praktiknya tidak mungkin. Periksa kode sebanyak mungkin, perbaiki kesalahan, selidiki kinerja.
Pengantar yang begitu panjang, dan apa yang ingin saya dapatkan dari bot saya. Awalnya saya merasa cukup untuk menambahkan Hashtag di akhir pesan. Kemudian muncul pemikiran untuk "menutupinya" dengan tautan ke saluran saya, jadi dengan repost akan ada bujukan tambahan ke sumber saluran. Kemudian, dia menambahkan otomatisasi tautan sumber, tempat saya menerima pesan. Selanjutnya, saya akan melakukan penyimpangan. Periklanan, tentu saja, adalah mesin kemajuan. Namun terkadang jumlahnya melewati atap. Telegram dipilih oleh saya, antara lain, karena ada peluang untuk melawan yang terakhir. Saya menghormati pembaca saluran saya dan karena itu saya membersihkan berita menarik yang ditemukan di Ineta dari iklan dan mengirimkannya ke saluran. Pada saat yang sama, saya menghormati penulis dan hampir selalu memberikan tautan ke sumber dalam bentuk "Baca lebih lanjut ...". Karena tidak suka beriklan, saya mengunduh konten dari YouTube dan mengunggahnya di saluran saya sebagai file video. Pada satu saat tertentu, bot yang mengunduh video menjadi gila dan mulai mengirimi saya iklan setiap jam. Jadi di bot saya ada kesempatan untuk mengunduh video dari YouTube. Baru-baru ini, omong-omong, saya bertemu dengan penulis bot ini, dia sangat terkejut, karena Menurutnya, ia mengirim iklan "hanya" 20 kali sebulan. Hal yang sama terjadi dengan bot yang membuat tanda air - itu dikirim ke tungku, dan saya mendapat kesempatan untuk membuat tanda air.
Untuk menulis program dari awal, saya harus mencari banyak informasi di Internet. Saya harap mereka yang mengikuti jejak saya akan membantu. Jadi dari mana saya mendapatkan informasi dan apa yang saya gunakan:
- Artikel tentang Habrr sangat membantu saya. Karena itu, saya tidak akan menulis ulang bagaimana dan apa yang harus dipasang. Semuanya ada di sana. Ngomong-ngomong, saya menghubungi penulis secara pribadi dan mereka tidak pernah menolak bantuan saya.
- github Layanan hosting repositori online dengan semua fitur kontrol versi terdistribusi dan fungsi kontrol sumber. Primer
- heroku adalah platform PaaS berbasis cloud yang mendukung sejumlah bahasa pemrograman. Sangat cepat meninggalkannya.
- pyTelegramBotAPI - Salah satu perpustakaan utama saat menulis bot untuk Telegram.
- Tutorial mengeja bot
- Python 3 untuk pemula
- Bot: informasi untuk pengembang
- Referensi HTML
- Tidak ada tempat tanpa VPN?
Penyimpangan kedua atau rencana perang akan ditampilkan. Ketika saya mulai menulis bot, hal pertama yang saya lihat adalah kode orang lain. Jika tidak ada kamenty, orang sulit memahami:
Bumi bergetar seperti payudara kita
Kuda-kuda tercampur dalam banyak hal, orang-orang,
Dan tembakan seribu senjata
Digabungkan menjadi ...
Lermontov menulis tentang kode itu. Tumpukan berisi fungsi, dekorator. Tidak ada kode kecantikan, tidak ada yang peduli dengan sumber daya. Meskipun keindahan itu kemungkinan besar akan dilihat oleh orang aneh masochist. Arti dari ungkapan programmer yang akrab “Lihat programnya, mungkin Anda bisa mengetahuinya” dengan sangat cepat mencapai saya. Ledakan otak paling penting yang saya miliki adalah ketika saya akhirnya menyadari bahwa kode tersebut adalah event-driven, bukan berurutan. Ini adalah level yang berbeda.
Masalah kedua adalah kurangnya dokumentasi yang baik. Bahkan di Basurm. Saya akan memberi contoh. Saya mengirim gambar ke telegram, dan dia mengguncangnya tanpa malu-malu. Ternyata argumen yang tidak valid ditulis di baris:
file_info = bot.get_file(message.photo[-1].file_id)
Dan apa dokumentasinya? Kami pergi ke sumbernya


Ini adalah sebuah array. Anda bisa berjalan di sana, belajar di mana ukurannya kembali. Terima kasih, orang pintar menyarankan apa yang harus diresepkan.
Meskipun apa yang saya bicarakan, bahkan jika guru bingung.
Ketika saya menulis kode tanda air, saya menggunakan font gratis dan untuk membuatnya berani saya menerapkan solusi untuk menampilkan pesan tiga kali dengan offset piksel, saya tidak tahu betapa indahnya solusinya, tetapi ia berfungsi.
font = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", width//20) pos = (width//4, height - height//10) text = skanal drawing.text(pos, text, fill=black, font=font) pos = (1 + width // 4, 1 + height - height // 10) drawing.text(pos, text, fill=black, font=font) pos = (2 + width // 4, 2 + height - height // 10) drawing.text(pos, text, fill=black, font=font)
Posisi, seperti yang Anda lihat, dipilih tergantung pada ukuran gambar, ketinggian font juga. Saya segera menemukan poin yang menarik: meskipun font merupakan bagian integral dari perpustakaan PIL, karena baris pertama mengatakan itu berfungsi secara lokal, tetapi di Docker tidak. Jalan keluarnya adalah mengunduhnya ke repositori, menambahkan path ke file environment dan menulis path lain di program.
Hal lain yang tidak dapat saya pahami terjadi pada gambar setelah diproses menggunakan perpustakaan PIL (segera setelah tanda air). Saya mengirimnya ke bot saya:
with open(photo_path, 'rb') as fi: bot.send_photo(message.chat.id, fi)
Semuanya bagus, saya suka gambarnya. Maka saya perlu menambahkan komentar pada gambar dan melihat apakah semuanya terlihat indah bersama? Kami menulis:
bot.send_photo(message.chat.id, message.photo[-1].file_id, caption=' ')
Untuk beberapa alasan, gambar asli, yang belum diproses masuk ke dalam bot. Baiklah, mari kita coba untuk menipu: getupdates.offset -1 tidak masuk akal, Telegram yakin bahwa ini adalah foto yang sama. Oke, kami melakukan ini:
with open(photo_path, 'rb') as fi: info = bot.send_photo(message.chat.id, fi)
Menulis ulang:
bot.send_photo(message.chat.id, info.photo[-1].file_id, caption=' ')
Hasilnya sama - gambar aslinya ditampilkan. Dan hanya mengganti pesan di argumen pertama dengan info yang memberikan hasil yang diinginkan.
Saya juga akan memberi Anda sepotong kode entry-level menarik dari YouTube (NB: tanpa pengecekan kesalahan):
elif message.entities:
Bagi saya, batu sandungannya adalah entitas adalah array array dan Anda perlu "menelusuri" seluruh array sehingga bot memahami bahwa kami bekerja dengan tautan. Ternyata juga pengguna mengirim tautan ke bot sebagai "Bagikan" dari YouTube, jadi "youtu.be" juga ditulis dalam contoh. Saya tidak menemukan cara untuk segera mengirim file ke Telegram, jadi kami menyimpannya, mengirimnya dan kemudian menghapusnya. Selama pengujian, saya segera diberitahu bahwa orang akan mulai mengunduh file raksasa - kemudian saya harus memperkenalkan batasan.
Sebelum bot dirilis, tiba-tiba menjadi jelas bahwa saya tidak memiliki pemeriksaan untuk hak akses ke saluran. Misalnya, mengetahui saluran saya, setiap pengguna bot dapat mengirim pesan di sana, karena Bot adalah Administrator. Saya harus segera melakukan pemeriksaan:
if message.from_user.id in [adm_obj.user.id for adm_obj in bot.get_chat_administrators(chat_id)]:
Di sini kita mendapatkan daftar Administrator dari saluran dan melihat apakah penulisnya juga seorang Administrator.
Beberapa kata tentang bagaimana Anda harus bertarung dengan Roskomnadzor. Karena akses ke API diblokir, untuk mengembangkan bot secara lokal, Anda harus melewati lalu lintas melalui pembela kami yang gagah berani. Anda dapat melakukan ini dengan dua cara - melalui VPN atau melalui proxy. Cara termudah dan tercepat dan "normal" adalah terowongan ssh: kami membuat koneksi antara klien dan server proxy, kami mendapatkan port pada host lokal di mana lalu lintas dapat dikirim dari pihak kami, dan itu akan keluar dari sisi lain (sudah ada di suatu tempat di Jerman). Untuk kenyamanan, Anda dapat menambahkan beberapa kemiripan otomatis dari koneksi ini - sebuah skrip dan pintasan di desktop, yang akan meluncurkannya, jika perlu. Dengan metode "normal", di sini yang saya maksudkan adalah situasi di mana kita mengontrol sendiri titik masuk dan keluar - di sebelah kiri adalah laptop kita, di sebelah kanan adalah VPS di Jerman. di tengah, lalu lintas dapat dicegat sebanyak yang diinginkan, dienkripsi, dan di pintu keluar kita berada di yurisdiksi negara lain, dan undang-undang Federasi Rusia tidak berlaku untuk itu. Sebagai nilai tambah, kami mendapatkan jaminan tambahan bahwa server proxy tidak akan diubah atau dimatikan hingga kami melakukannya sendiri. Yaitu tidak seperti paman VPN, kami memiliki ketenangan pikiran dan kepercayaan diri di masa depan.
Skrip
/home/user/proxy.sh
Kode skrip
Setelah kami membuat koneksi dengan server dan port terbuka, kami perlu mengarahkan lalu lintas ke sana. Berjalan di sepanjang jalan yang paling tidak resistansi dan agar tidak memikirkan cara mengkonfigurasi proxy di IDE \ docker \ python, Anda dapat membuat satu pengaturan sama sekali, proxychains akan menjadi pengaturan seperti itu. Jika Anda menjalankan perangkat lunak apa pun menggunakan utilitas ini, maka itu akan mengarahkan lalu lintas melalui rantai proxy yang terdaftar di konfigurasi.
/etc/proxychains.conf
Dalam kasus kami, ini adalah satu rantai dan menulis itu tidak sulit.
socks5 127.0.0.1 1080
dan penopang lain yang diambil untuk tidak mengkonfigurasi VPN (sarkasme) adalah cara untuk meluncurkan aplikasi Python dari PyCharm. Dalam kasus sederhana, untuk menjalankan aplikasi melalui proxychains, cukup tulis proxychains app.py dan hanya itu. Namun IDE selalu membutuhkan juru bahasa. Sangat mudah untuk mengatasi ini - buat "jalankan konfigurasi" baru, pilih skrip shell. dan isi kolom

Setelah itu, peluncuran dari sudut pandang IDE menggunakan formulir ini: proxychains python3 app.py - inilah yang kami butuhkan. Jadi, ketika kita ingin memulai sebuah proyek, yang perlu kita lakukan adalah menjalankan skrip pada desktop, dan kemudian tekan tombol "play" dalam ide untuk meluncurkan bot .Sisa sihir akan dilakukan oleh proxychains dan ssh.
Akhirnya, bot ditulis, diuji. Apa selanjutnya Di satu sisi, saya ingin menyatakan diri saya sendiri, di sisi lain, saya pikir itu bisa sangat berguna bagi seseorang. Dan di sini kita dihadapkan dengan masalah Telegram yang lain; tidak memiliki katalog tunggal saluran dan bot. Sangat mungkin bot yang mirip dengan milik saya ada, tapi saya ulangi saya tidak menemukannya. Dan di suatu tempat di trem seorang pria duduk dan menderita, yang ingin mengatur pesan dengan indah di saluran dan dia melakukan segalanya dengan pena.
Jika Anda sudah menjalankan bot saya, maka Anda melihat bahwa ada tagar # Iklan. Bagaimana bisa begitu? - kamu bertanya. Dan di sini saya membahas masalah dengan pengguna akhir - banyak posting iklan di saluran mereka dan dengan cepat terbiasa menulis pesan menggunakan bot, mereka meminta saya untuk menambahkan. Anda mungkin tidak suka beriklan, melawannya, tetapi ini adalah realitas yang keras dan perlu bagi pengguna.
Proyek ini nirlaba, jadi saya pikir Anda dapat memanggil bot itu sendiri @SGK_espace_bot.
Dan inilah video cara menggunakannyaSaya akan berterima kasih atas kritik yang membangun.