ระบบการจัดการวีแชท
-
ติดตั้ง MySQL, Redis จากนั้นสร้างไลบรารี (ค่าเริ่มต้นคือการทดสอบ):
❯ 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
ดาวน์โหลดซอร์สโค้ดและติดตั้งการอ้างอิง:
❯ 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/`这样的前缀可不加,下同
คำแนะนำในการตั้งค่า: การกำหนดค่าแบบกำหนดเองควรเก็บไว้ใน local_settings.py (จำเป็นต้องสร้าง) และการตั้งค่าใน config.py สามารถแทนที่ได้
ติดตั้งปลั๊กอิน (ไม่จำเป็น):
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
# 如果有额外插件配置,需要修改PLUGIN_PATHS和PLUGINS
สำหรับการพัฒนาปลั๊กอิน โปรดไปที่: หน้าปลั๊กอิน
เริ่มต้นฐานข้อมูล:
❯ export FLASK_APP = manager . py
❯ venv / bin / flask initdb
เริ่มบริการ:
❯ venv/bin/gunicorn app:app --bind 0.0.0.0:8100 -w 6 -t 0
PS: หากคุณใช้งานในเครื่อง คุณสามารถใช้โหมดดีบักแบบมัลติเธรดของ Flask ได้โดยตรงโดยไม่ต้องใช้ gunicorn:
❯ python app.py
เยี่ยมชมหน้าเว็บ http://localhost:8100 และใช้ WeChat เพื่อสแกนโค้ด QR เพื่อเข้าสู่ระบบ
หลังจากเข้าสู่ระบบสำเร็จ ให้เริ่ม Celery Beat และ Worker:
❯ venv/bin/celery -A wechat worker -l info -B
หมายเหตุ: เป็นครั้งแรกที่รายชื่อผู้ติดต่อและรายชื่อสมาชิกแชทกลุ่มทั้งหมดจะถูกดึงออก ซึ่งจะใช้เวลาสักครู่หนึ่ง สังเกตเอาต์พุตเทอร์มินัลเพื่อทำความเข้าใจความสมบูรณ์ของงานการกำหนดค่าเริ่มต้น
สมมติว่าติดตั้ง Docker แล้ว เพียงรันคำสั่งต่อไปนี้
❯ 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 # 同样是在扫码登录之后再启动
ติดตั้ง cnpm เพื่อเพิ่มความเร็วในการดาวน์โหลดแพ็คเกจ:
❯ npm install -g cnpm --registry=https://registry.npm.taobao.org
ติดตั้งแพ็คเกจที่จำเป็น:
❯ cnpm i
เริ่มต้นสภาพแวดล้อมการดีบัก:
❯ npm run dev
หากการเริ่มต้นสำเร็จ http://localhost:8080 จะถูกเปิดตามค่าเริ่มต้น และ API ส่วนหลังยังคงใช้ http://localhost:8100/j
หลังจากพัฒนาท้องถิ่นแล้วจึงจัดสร้างดังนี้
❯ npm run build
รีเฟรช http://localhost:8100 เพื่อดูเอฟเฟกต์ล่าสุด
ใส่ใจกับการปรับเปลี่ยนโครงสร้างตารางทุกครั้ง:
❯ venv/bin/flask db migrate
❯ venv/bin/flask db upgrade
puid not found
บางครั้งปรากฏขึ้นหลังจากใช้งานไประยะหนึ่งเนื่องจากการออกแบบของ WeChat จึงไม่ได้ให้ข้อมูลที่เป็นเอกลักษณ์และมีเสถียรภาพ เช่น uid ดังนั้น wxpy จึงได้ออกแบบชุดความสัมพันธ์การแมประหว่างผู้ใช้ที่เข้าสู่ระบบและผู้ติดต่อที่เกี่ยวข้อง การแชทกลุ่ม และบัญชีอย่างเป็นทางการ นอกจากนี้ ฉันยังได้แก้ไข การใช้ wxpy คุณจะได้รับเนื้อหาที่เกี่ยวข้องกับคำบรรยาย (ชื่อเล่น เพศ จังหวัด เมือง) มากขึ้น ทำให้ puid ในวัตถุมีเสถียรภาพมากขึ้น
เนื่องจากการเปลี่ยนแปลงในการตั้งค่าของบุคคล/กลุ่มบางกลุ่ม puid ของพวกเขาอาจมีการเปลี่ยนแปลง หลังจากสแกนโค้ด QR เพื่อเข้าสู่ระบบแต่ละครั้ง งานในการอัปเดตความสัมพันธ์ของการแมปจะถูกทริกเกอร์ให้อัปเดตความสัมพันธ์ของการแมปเป็นความสัมพันธ์ล่าสุด หากคุณพบข้อผิดพลาดนี้ หมายความว่าคุณต้องเข้าสู่ระบบอีกครั้ง หรือทริกเกอร์งานนี้ด้วยตนเอง:
from wechat . tasks import retrieve_data
retrieve_data . delay ()
ปัญหา: #9
ขอบคุณ @zgjhust สำหรับความคิดเห็น
นี่เป็นโปรเจ็กต์ขนาดเล็ก ฉันไม่ได้เพิ่มการรองรับ Nginx และใช้ Gunicorn โดยตรง เมื่อใช้ Gunicorn ให้ใช้ -t 0
ซึ่งหมายความว่าไม่มีการหมดเวลา
เหตุผลก็คือ SSE ในโปรเจ็กต์ต้องการการเชื่อมต่อที่ยาวนาน และเวลาตั้งแต่ผู้ใช้เปิดหน้าเข้าสู่ระบบจนถึงการสแกนให้เสร็จสิ้นนั้นควบคุมได้ยาก ดังนั้นจึงไม่หมดเวลา แต่ยังทำให้คำขอที่ไม่ตอบสนองไม่ ที่จะได้รับการปล่อยตัวทันเวลา ในความเป็นจริง /stream ควรถูกนำออกไปสำหรับการประมวลผลพิเศษ และเส้นทางอื่น ๆ จำเป็นต้องมีการตั้งค่าการหมดเวลา (ฉันจะสร้างสิ่งนี้ใหม่เมื่อมีโอกาสเกิดขึ้น)
วิธีแก้ปัญหาในปัจจุบันคือการระบุคนงานมากขึ้นและรีสตาร์ท gunicorn บ่อยๆ (การใช้การจัดการหัวหน้างานจะสะดวกกว่า):
gunicorn app:app --bind 0.0.0.0:8100 -w 10 -t 0
หรือแทนที่จะใช้ gunicorn ให้เริ่มโดยตรงโดยใช้พารามิเตอร์เธรดของ Flask:
❯ cat app.py
...
if __name__ == ' __main__ ' :
app.run(host= ' 0.0.0.0 ' , port=8100, debug=app.debug, threaded=True)
❯ python app.py
โดยทั่วไปมี 2 สาเหตุที่ทำให้ไม่ทำงาน:
แม้ว่าฉันจะออกแบบฟังก์ชันการรีสตาร์ทงานบนคื่นฉ่าย แต่เนื่องจากฉันสแกนโค้ด QR เพื่อเข้าสู่ระบบอีกครั้งหลังจากออฟไลน์ ขั้นตอนนี้จึงไม่สามารถดำเนินการอัตโนมัติได้ ทำให้ระบบหยุดทำงาน
หากคุณต้องการให้ระบบนี้ทำงานได้นานที่สุด คำแนะนำของฉันคือ:
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 )
โปรดทราบว่าการดำเนินการสมัครสมาชิกควรเกิดขึ้นก่อนที่จะนำเข้า wxpy/itchat
ใช่ นี่เป็นโปรเจ็กต์ที่สรุป wxpy/itchat ในการวิเคราะห์ขั้นสุดท้าย ยังคงใช้เว็บ WeChat (wx.qq.com) ดังนั้นฟังก์ชันของ API จะเป็นตัวกำหนดความสามารถของระบบนี้
การถอดรหัส WeChat API บนมือถือและการรวม API ที่ไม่ได้เปิดเหล่านี้ไม่ดีนัก และอาจทำให้เกิดปัญหาทางกฎหมายด้วย
คุณสามารถอ้างถึงปัญหานี้ได้ หลายคนประสบปัญหาและไม่มีทางแก้ไขได้หลังจากถูกบล็อก แต่คุณสามารถมั่นใจได้ว่าจะไม่ถูกบล็อกให้มากที่สุด หลังจากค้นคว้ามาหลายวัน ฉันพบบทเรียนสามบท: