Sistem manajemen WeChat
...
Instal MySQL, Redis, lalu buat perpustakaan (standarnya adalah pengujian):
❯ mysql -u root -p
mysql > drop database test ;
Query OK, 9 rows affected (0.32 sec)
mysql > create database test ;
Query OK, 1 row affected (0.01 sec)
mysql > ^DBye
Unduh kode sumber dan instal dependensi:
❯ git clone https://github.com/dongweiming/wechat-admin
❯ cd wechat-admin
❯ virtualenv venv # 只支持Python 3
❯ source venv/bin/activate # 推荐使用autoenv
❯ venv/bin/pip install -r requirements.txt # 如果已经激活虚拟环境,`venv/bin/`这样的前缀可不加,下同
Petunjuk pengaturan: Konfigurasi khusus harus disimpan di local_settings.py (perlu dibuat), dan pengaturan di config.py dapat diganti.
Instal plugin (opsional):
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
# 如果有额外插件配置,需要修改PLUGIN_PATHS和PLUGINS
Untuk pengembangan plug-in, silakan kunjungi: Halaman Plugin
Inisialisasi database:
❯ export FLASK_APP = manager . py
❯ venv / bin / flask initdb
Mulai layanan:
❯ venv/bin/gunicorn app:app --bind 0.0.0.0:8100 -w 6 -t 0
PS: Jika Anda menjalankannya secara lokal, Anda dapat menggunakan mode debugging multi-thread Flask secara langsung tanpa menggunakan gunicorn:
❯ python app.py
Kunjungi halaman WEB http://localhost:8100 dan gunakan WeChat untuk memindai kode QR untuk masuk.
Setelah login berhasil, jalankan Celery Beat and Worker:
❯ venv/bin/celery -A wechat worker -l info -B
Catatan: Untuk pertama kalinya, semua kontak dan daftar anggota obrolan grup akan ditarik, yang akan memakan waktu cukup lama. Amati keluaran terminal untuk memahami penyelesaian tugas inisialisasi.
Dengan asumsi Docker telah diinstal, jalankan saja perintah berikut.
❯ pip install docker-compose
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
❯ venv/bin/docker-compose build
❯ venv/bin/docker-compose run init # 只有在第一次才需要执行这步
❯ venv/bin/docker-compose run --service-ports -d web # 启动Web,地址也是 http://localhost:8100
❯ venv/bin/docker-compose run -d celery # 同样是在扫码登录之后再启动
Instal cnpm untuk meningkatkan kecepatan pengunduhan paket:
❯ npm install -g cnpm --registry=https://registry.npm.taobao.org
Instal paket yang diperlukan:
❯ cnpm i
Mulai lingkungan debugging:
❯ npm run dev
Jika startup berhasil, http://localhost:8080 akan dibuka secara default, dan API back-end masih menggunakan http://localhost:8100/j
Setelah pengembangan lokal, dibangun sebagai berikut:
❯ npm run build
Refresh http://localhost:8100 untuk melihat efek terbaru.
Perhatikan untuk mengubah struktur tabel, setiap saat:
❯ venv/bin/flask db migrate
❯ venv/bin/flask db upgrade
puid not found
kadang-kadang muncul setelah menggunakannya untuk jangka waktu tertentu?Karena desain WeChat, ia tidak menyediakan data unik dan stabil seperti uid, jadi wxpy merancang serangkaian pemetaan hubungan antara pengguna yang masuk dan kontak terkait, obrolan grup, dan akun resmi implementasi wxpy, Anda bisa mendapatkan lebih banyak konten terkait teks (nama panggilan, jenis kelamin, provinsi, kota), membuat puid di objek lebih stabil.
Karena perubahan pengaturan beberapa orang/grup, puid mereka mungkin berubah. Setelah setiap pemindaian kode QR untuk login, tugas untuk memperbarui hubungan pemetaan akan dipicu untuk memperbarui hubungan pemetaan ke yang terbaru. Jika Anda mengalami kesalahan ini, berarti Anda harus masuk lagi, atau memicu tugas ini secara manual:
from wechat . tasks import retrieve_data
retrieve_data . delay ()
Masalah: #9
Terima kasih kepada @zgjhust atas komentarnya
Ini adalah proyek kecil, saya tidak menambahkan dukungan Nginx dan langsung menggunakan Gunicorn. Saat menggunakan Gunicorn, gunakan -t 0
yang berarti tidak ada batas waktu.
Alasannya adalah SSE dalam proyek memerlukan koneksi yang lama, dan waktu dari pengguna membuka halaman login hingga menyelesaikan pemindaian sulit dikendalikan, sehingga tidak ada waktu habis, tetapi juga menyebabkan permintaan tidak responsif. untuk dilepaskan tepat waktu. Faktanya, /stream harus dikeluarkan untuk pemrosesan khusus, dan rute lain perlu menetapkan batas waktu (saya akan merekonstruksi ini ketika ada kesempatan).
Solusi saat ini adalah dengan menentukan lebih banyak pekerja dan memulai kembali gunicorn secara berkala (menggunakan manajemen supervisor akan lebih nyaman):
gunicorn app:app --bind 0.0.0.0:8100 -w 10 -t 0
Atau alih-alih menggunakan gunicorn, mulailah langsung menggunakan parameter thread Flask:
❯ cat app.py
...
if __name__ == ' __main__ ' :
app.run(host= ' 0.0.0.0 ' , port=8100, debug=app.debug, threaded=True)
❯ python app.py
Biasanya ada 2 alasan untuk tidak bekerja:
Meskipun saya merancang fungsi memulai ulang tugas pada seledri, karena saya memindai kode QR untuk login lagi setelah offline, langkah ini tidak dapat diotomatiskan sehingga menyebabkan sistem berhenti bekerja.
Jika Anda ingin sistem ini bekerja selama mungkin, saran saya adalah:
from celery . task import periodic_task
from celery . task . control import revoke
def restart_listener ( sender , ** kw ):
task_id = r . get ( LISTENER_TASK_KEY )
if task_id :
revoke ( str ( task_id , 'utf-8' ))
task_id = app . send_task ( 'wechat.tasks.listener' )
r . set ( LISTENER_TASK_KEY , task_id )
stopped . connect ( restart_listener )
Perhatikan bahwa operasi berlangganan harus dilakukan sebelum mengimpor wxpy/itchat.
Ya, ini adalah proyek yang merangkum wxpy/itchat. Pada analisis akhir, masih menggunakan web WeChat (wx.qq.com), sehingga fungsi API-nya menentukan kemampuan sistem ini.
Mendekripsi API WeChat seluler dan mengintegrasikan API yang belum dibuka ini sangatlah tidak baik, dan juga dapat menyebabkan masalah hukum.
Anda dapat merujuk ke masalah ini untuk mengetahui masalahnya. Banyak orang yang mengalaminya dan tidak ada cara untuk menyelesaikannya setelah diblokir. Namun Anda dapat memastikannya tidak diblokir sebanyak mungkin. Setelah beberapa hari melakukan penelitian, saya menemukan tiga pelajaran: