WeChat-Managementsystem
...
Installieren Sie MySQL und Redis und erstellen Sie dann eine Bibliothek (Standard ist Test):
❯ 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
Laden Sie den Quellcode herunter und installieren Sie Abhängigkeiten:
❯ 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/`这样的前缀可不加,下同
Einstellungsanweisungen: Die benutzerdefinierte Konfiguration sollte in local_settings.py gespeichert werden (muss erstellt werden), und die Einstellungen in config.py können überschrieben werden.
Plugin installieren (optional):
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
# 如果有额外插件配置,需要修改PLUGIN_PATHS和PLUGINS
Informationen zur Plug-in-Entwicklung finden Sie unter: Plugins-Seite
Initialisieren Sie die Datenbank:
❯ export FLASK_APP = manager . py
❯ venv / bin / flask initdb
Starten Sie den Dienst:
❯ venv/bin/gunicorn app:app --bind 0.0.0.0:8100 -w 6 -t 0
PS: Wenn Sie es lokal ausführen, können Sie den Multi-Thread-Debugging-Modus von Flask direkt verwenden, ohne Gunicorn zu verwenden:
❯ python app.py
Besuchen Sie die WEB-Seite http://localhost:8100 und scannen Sie mit WeChat den QR-Code, um sich anzumelden.
Starten Sie nach erfolgreicher Anmeldung Celery Beat and Worker:
❯ venv/bin/celery -A wechat worker -l info -B
Hinweis: Zum ersten Mal werden alle Kontakte und Gruppenchat-Mitgliederlisten abgerufen, was einige Zeit dauern wird. Beobachten Sie die Terminalausgabe, um den Abschluss der Initialisierungsaufgabe zu verstehen.
Vorausgesetzt, Docker wurde installiert, führen Sie einfach den folgenden Befehl aus.
❯ 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 # 同样是在扫码登录之后再启动
Installieren Sie cnpm, um die Download-Geschwindigkeit des Pakets zu erhöhen:
❯ npm install -g cnpm --registry=https://registry.npm.taobao.org
Installieren Sie die erforderlichen Pakete:
❯ cnpm i
Starten Sie die Debugging-Umgebung:
❯ npm run dev
Wenn der Start erfolgreich ist, wird standardmäßig http://localhost:8080 geöffnet und die Back-End-API verwendet weiterhin http://localhost:8100/j
Nach lokaler Entwicklung wird es wie folgt gebaut:
❯ npm run build
Aktualisieren Sie http://localhost:8100, um den neuesten Effekt zu sehen.
Achten Sie jedes Mal darauf, die Tabellenstruktur zu ändern:
❯ venv/bin/flask db migrate
❯ venv/bin/flask db upgrade
puid not found
?Aufgrund des Designs von WeChat werden keine eindeutigen und stabilen Daten wie UID bereitgestellt. Daher hat wxpy eine Reihe von Zuordnungsbeziehungen zwischen angemeldeten Benutzern und ihren zugehörigen Kontakten, Gruppenchats und offiziellen Konten entwickelt Durch die Implementierung von wxpy können Sie mehr Inhalte im Zusammenhang mit Untertiteln (Spitzname, Geschlecht, Provinz, Stadt) erhalten, wodurch die Puid im Objekt stabiler wird.
Aufgrund von Änderungen in den Einstellungen einiger Personen/Gruppen kann sich deren Puid ändern. Nach jedem Scan des QR-Codes zur Anmeldung wird eine Aufgabe zur Aktualisierung der Zuordnungsbeziehung ausgelöst, um die Zuordnungsbeziehung auf die neueste Version zu aktualisieren. Wenn dieser Fehler auftritt, müssen Sie sich erneut anmelden oder diese Aufgabe manuell auslösen:
from wechat . tasks import retrieve_data
retrieve_data . delay ()
Problem: Nr. 9
Danke an @zgjhust für den Kommentar
Dies ist ein kleines Projekt. Ich habe keine Nginx-Unterstützung hinzugefügt und Gunicorn direkt verwendet. Wenn Sie Gunicorn verwenden, verwenden Sie -t 0
was bedeutet, dass es keine Zeitüberschreitung gibt.
Der Grund dafür ist, dass das SSE im Projekt eine lange Verbindung erfordert und die Zeit vom Öffnen der Anmeldeseite des Benutzers bis zum Abschluss des Scans schwer zu kontrollieren ist, sodass es einfach nicht zu einer Zeitüberschreitung kommt, aber auch nicht reagierende Anfragen verursacht rechtzeitig freigegeben werden. Tatsächlich sollte /stream für eine spezielle Verarbeitung herausgenommen werden, und für andere Routen müssen Zeitüberschreitungen festgelegt werden (ich werde dies rekonstruieren, wenn sich die Gelegenheit ergibt).
Die aktuelle Lösung besteht darin, mehr Mitarbeiter anzugeben und Gunicorn häufig neu zu starten (die Verwendung der Supervisor-Verwaltung ist bequemer):
gunicorn app:app --bind 0.0.0.0:8100 -w 10 -t 0
Oder beginnen Sie anstelle von Gunicorn direkt mit der Verwendung des Thread-Parameters von Flask:
❯ cat app.py
...
if __name__ == ' __main__ ' :
app.run(host= ' 0.0.0.0 ' , port=8100, debug=app.debug, threaded=True)
❯ python app.py
Es gibt normalerweise zwei Gründe dafür, dass es nicht funktioniert:
Obwohl ich die Funktion zum Neustarten von Aufgaben auf Sellerie entworfen habe, konnte dieser Schritt nicht automatisiert werden, da ich den QR-Code gescannt habe, um mich erneut anzumelden, nachdem ich offline gegangen bin, was dazu führte, dass das System nicht mehr funktionierte.
Wenn Sie möchten, dass dieses System so lange wie möglich funktioniert, ist mein Vorschlag:
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 )
Beachten Sie, dass der Abonnementvorgang vor dem Import von wxpy/itchat erfolgen sollte.
Ja, dies ist ein Projekt, das wxpy/itchat kapselt. Letztlich nutzt es immer noch das Web WeChat (wx.qq.com), sodass die Funktion seiner API die Fähigkeiten dieses Systems bestimmt.
Die Entschlüsselung der mobilen WeChat-API und die Integration dieser ungeöffneten APIs ist nicht sehr gut und kann auch rechtliche Probleme verursachen.
Sie können sich auf dieses Problem beziehen, um das Problem zu beheben. Viele Menschen sind darauf gestoßen und es gibt keine Möglichkeit, es zu lösen, nachdem es blockiert wurde. Sie können jedoch sicherstellen, dass es möglichst nicht blockiert wird. Nach mehreren Tagen der Recherche habe ich drei Lektionen gefunden: