위챗 관리 시스템
...
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
추신: 로컬에서 실행하는 경우 gunicorn을 사용하지 않고 Flask의 다중 스레드 디버깅 모드를 직접 사용할 수 있습니다.
❯ 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
일반적으로 일하지 않는 이유는 두 가지입니다.
셀러리에서 작업을 다시 시작하는 기능을 설계했지만 오프라인 상태에서 다시 로그인하기 위해 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를 통합하는 것은 그리 좋지 않으며 법적 문제를 일으킬 수도 있습니다.
많은 분들이 이 문제를 겪으셨는데, 차단된 후에는 해결할 수 있는 방법이 없습니다. 하지만 최대한 차단되지 않는지 확인할 수 있습니다. 며칠 간의 연구 끝에 저는 세 가지 교훈을 얻었습니다.