WeChat管理システム
...
MySQL と Redis をインストールし、ライブラリを作成します (デフォルトは 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
ソース コードをダウンロードし、依存関係をインストールします。
❯ 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: ローカルで実行している場合は、gunicorn を使用せずに Flask のマルチスレッド デバッグ モードを直接使用できます。
❯ python app.py
WEB ページ 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 がより安定します。
一部のユーザー/グループの設定の変更により、ログインするために 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 をカプセル化するプロジェクトです。最終的には、依然として Web WeChat (wx.qq.com) を使用しているため、その API の機能がこのシステムの機能を決定します。
モバイル WeChat API を復号化し、これらの未公開 API を統合することはあまり良いことではなく、法的問題を引き起こす可能性もあります。
多くの人がこの問題に遭遇しており、ブロックされた後は解決する方法がありませんので、この問題を参照してください。しかし、できるだけブロックされないようにすることはできます。数日間調査した結果、次の 3 つの教訓が見つかりました。