Python 은 어떻게 위 챗 공식 번호 의 글 과 평론 을 얻 습 니까?(Fiddler 캡 처 분석 을 바탕 으로)

배경 설명
위 챗 공식 번 호 는 비교적 오 르 기 어 려 운 플랫폼 중 하나 라 고 생각 하지만 한바탕 고생 한 후에 도 작은 수확 을 거 두 었 다.스 크 래 피 를 사용 하지 않 았 지만 뒤 에는 실전 을 정리 해 쓰기 시작 했다.이번 개발 환경 을 간단하게 소개 합 니 다.
  • python3
  • requests
  • psycopg 2(postgres 데이터베이스 조작)클러치 분석
    이번 실전 에 서 는 잡 은 공중 번 호 는 제한 이 없 지만,공중 번 호 는 잡 을 때마다 분석 해 야 한다.Fiddler 를 열 고 관련 에이 전 트 를 설정 합 니 다.간섭 이 너무 많 지 않도록 Fiddler 에 필터 규칙 을 추가 합 니 다.위 챗 도 메 인 이름 mp.weixin.qq.com 만 지정 하면 됩 니 다.

    Fiddler 설정 필터 규칙
    평소에 관심 을 가 지 는 대중 번호 도 비교적 많 습 니 다.이번 실전 은'36 크립톤'대중 번 호 를 예 로 들 어 계속 내 려 다 보 겠 습 니 다.

    "36 크립톤"공중 번호

    공중 번호 오른쪽 상단->모든 메시지
    공중 번호 홈 페이지 에서 오른쪽 상단 에 세 개의 옹 골 진 원점 이 있 습 니 다.메시지 인터페이스 에 들 어가 기 를 클릭 하고 내 려 가서'모든 메시지'를 클릭 합 니 다.아래 에 역사 글 을 몇 번 불 러 오 라 고 요청 한 다음 에 Fiddler 인터페이스 로 돌아 갑 니 다.의외 의 사고 가 발생 하지 않 으 면 이 몇 번 의 요청 을 볼 수 있 습 니 다.돌아 오 는 데 이 터 는 json 형식 입 니 다.동시에 글 데 이 터 는 json 문자열 로 geneal 에 정의 되 어 있 습 니 다.msg_list 필드 중:

    공식 글 목록 패키지 요청
    분석 글 목록 인터페이스
    요청 URL 과 쿠키 를 붙 여 분석 하기:
    
    https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MzI2NDk5NzA0Mw==&f=json&offset=10&count=10&is_ok=1&scene=126&uin=777&key=777&pass_ticket=QhOypNwH5dAr5w6UgMjyBrTSOdMEUT86vWc73GANoziWFl8xJd1hIMbMZ82KgCpN&wxtoken=&appmsg_token=971_LwY7Z%252BFBoaEv5z8k_dFWfJkdySbNkMR4OmFxNw~~&x5=1&f=json
    Cookie: pgv_pvid=2027337976; pgv_info=ssid=s3015512850; rewardsn=; wxtokenkey=777; wxuin=2089823341; devicetype=android-26; version=26070237; lang=zh_CN;pass_ticket=NDndxxaZ7p6Z9PYulWpLqMbI0i3ULFeCPIHBFu1sf5pX2IhkGfyxZ6b9JieSYRUy;wap_sid2=CO3YwOQHEogBQnN4VTNhNmxQWmc3UHI2U3kteWhUeVExZHFVMnN0QXlsbzVJRUJKc1pkdVFUU2Y5UzhSVEtOZmt1VVlYTkR4SEllQ2huejlTTThJWndMQzZfYUw2SldLVGVMQUthUjc3QWdVMUdoaGN0Nml2SU05cXR1dTN2RkhRUVd1V2Y3SFJ5d01BQUF+fjCB1pLcBTgNQJVO
    다음은 중요 한 매개 변 수 를 설명 하 겠 습 니 다.언급 하지 않 은 설명 은 그리 중요 하지 않 습 니 다.
  • __biz:현재 공중 번호 에 해당 하 는 id(유일한 고정 표지)
  • offset:글 데이터 인터페이스 요청 오프셋 표지(0 부터),매번 돌아 오 는 json 데이터 에 다음 요청 한 offset 이 있 습 니 다.여 기 는 특정한 규칙 에 따라 증가 하 는 것 이 아 닙 니 다
  • count:매번 요청 한 데 이 터 량(친 측 은 최대 10)
  • pass_ticket:어음 을 청구 하 는 것 으로 이해 할 수 있 습 니 다.그리고 시간 이 지나 면(몇 시간 정도)기한 이 지 납 니 다.이것 도 위 챗 공중 번호 가 고정된 규칙 에 따라 잡기 어 려 운 이유 입 니 다
  • appmsg_token:고정 적 이지 않 고 기한 이 지난 어음 으로 이해 합 니 다
  • 쿠키:사용 시 전체 단락 을 붙 일 수 있 지만 최소한 wap이 부분
    좀 귀 찮 지 않 습 니까?대규모 전문 파충류 가 아니 기 때문에 하나의 대중 번호 만 이렇게 분석 하면 계속 할 수 있 습 니 다.캡 처 한 json 데 이 터 를 붙 여 글 데이터 표를 디자인 할 수 있 습 니 다.
    
    {
    "ret": 0,
    "errmsg": "ok",
    "msg_count": 10,
    "can_msg_continue": 1,
    "general_msg_list": "{\"list\":[{\"comm_msg_info\":{\"id\":1000005700,\"type\":49,\"datetime\":1535100943,\"fakeid\":\"3264997043\",\"status\":2,\"content\":\"\"},\"app_msg_ext_info\":{\"title\":\"       :    ,          \",\"digest\":\"           。\",\"content\":\"\",\"fileid\":100034824,\"content_url\":\"http:\\/\\/mp.weixin.qq.com\\/s?__biz=MzI2NDk5NzA0Mw==&mid=2247518479&idx=1&sn=124ab52f7478c1069a6b4592cdf3c5f5&chksm=eaa6d8d3ddd151c5bb95a7ae118de6d080023246aa0a419e1d53bfe48a8d9a77e52b752d9b80&scene=27#wechat_redirect\",\"source_url\":\"\",\"cover\":\"http:\\/\\/mmbiz.qpic.cn\\/mmbiz_jpg\\/QicyPhNHD5vYgdpprkibtnWCAN7l4ZaqibKvopNyCWWLQAwX7QpzWicnQSVfcBZmPrR5YuHS45JIUzVjb0dZTiaLPyA\\/0?wx_fmt=jpeg\",\"subtype\":9,\"is_multi\":0,\"multi_app_msg_item_list\":[],\"author\":\"   \",\"copyright_stat\":11,\"duration\":0,\"del_flag\":1,\"item_show_type\":0,\"audio_fileid\":0,\"play_url\":\"\",\"malicious_title_reason_id\":0,\"malicious_content_type\":0}}]}",
    "next_offset": 20,
    "video_count": 1,
    "use_video_tab": 1,
    "real_type": 0
    }
    원 하 는 데 이 터 를 간단하게 추출 할 수 있 습 니 다.여기 서 문장 표 구 조 를 다음 과 같이 정의 하고 표를 만 드 는 SQL 문 구 를 붙 일 수 있 습 니 다.

    문장 데이터 테이블
    
    -- ----------------------------
    -- Table structure for tb_article
    -- ----------------------------
    DROP TABLE IF EXISTS "public"."tb_article";
    CREATE TABLE "public"."tb_article" (
    "id" serial4 PRIMARY KEY,
    "msg_id" int8 NOT NULL,
    "title" varchar(200) COLLATE "pg_catalog"."default" NOT NULL,
    "author" varchar(20) COLLATE "pg_catalog"."default",
    "cover" varchar(500) COLLATE "pg_catalog"."default",
    "digest" varchar(200) COLLATE "pg_catalog"."default",
    "source_url" varchar(800) COLLATE "pg_catalog"."default",
    "content_url" varchar(600) COLLATE "pg_catalog"."default" NOT NULL,
    "post_time" timestamp(6),
    "create_time" timestamp(6) NOT NULL
    )
    ;
    COMMENT ON COLUMN "public"."tb_article"."id" IS '    ';
    COMMENT ON COLUMN "public"."tb_article"."msg_id" IS '  id (  )';
    COMMENT ON COLUMN "public"."tb_article"."title" IS '  ';
    COMMENT ON COLUMN "public"."tb_article"."author" IS '  ';
    COMMENT ON COLUMN "public"."tb_article"."cover" IS '   ';
    COMMENT ON COLUMN "public"."tb_article"."digest" IS '   ';
    COMMENT ON COLUMN "public"."tb_article"."source_url" IS '    ';
    COMMENT ON COLUMN "public"."tb_article"."content_url" IS '    ';
    COMMENT ON COLUMN "public"."tb_article"."post_time" IS '    ';
    COMMENT ON COLUMN "public"."tb_article"."create_time" IS '    ';
    COMMENT ON TABLE "public"."tb_article" IS '      ';
    -- ----------------------------
    -- Indexes structure for table tb_article
    -- ----------------------------
    CREATE UNIQUE INDEX "unique_msg_id" ON "public"."tb_article" USING btree (
    "msg_id" "pg_catalog"."int8_ops" ASC NULLS LAST
    );
    요청 글 인 터 페 이 스 를 첨부 하고 데이터 베 이 스 를 분석 하 는 관련 코드:
    
    class WxMps(object):
    """       、      """
    
    def __init__(self, _biz, _pass_ticket, _app_msg_token, _cookie, _offset=0):
    self.offset = _offset
    self.biz = _biz #      
    self.msg_token = _app_msg_token #   (   )
    self.pass_ticket = _pass_ticket #   (   )
    self.headers = {
    'Cookie': _cookie, # Cookie(   )
    'User-Agent': 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 '
    }
    wx_mps = 'wxmps' #      、  、    (       )
    self.postgres = pgs.Pgs(host='localhost', port='5432', db_name=wx_mps, user=wx_mps, password=wx_mps)
    
    def start(self):
    """            """
    
    offset = self.offset
    while True:
    api = 'https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz={0}&f=json&offset={1}' \
    '&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket={2}&wxtoken=&appmsg_token' \
    '={3}&x5=1&f=json'.format(self.biz, offset, self.pass_ticket, self.msg_token)
    
    resp = requests.get(api, headers=self.headers).json()
    ret, status = resp.get('ret'), resp.get('errmsg') #     
    if ret == 0 or status == 'ok':
    print('Crawl article: ' + api)
    offset = resp['next_offset'] #         
    general_msg_list = resp['general_msg_list']
    msg_list = json.loads(general_msg_list)['list'] #       
    for msg in msg_list:
    comm_msg_info = msg['comm_msg_info'] #                
    msg_id = comm_msg_info['id'] #   id
    post_time = datetime.fromtimestamp(comm_msg_info['datetime']) #     
    # msg_type = comm_msg_info['type'] #     
    # msg_data = json.dumps(comm_msg_info, ensure_ascii=False) # msg   
    app_msg_ext_info = msg.get('app_msg_ext_info') # article   
    if app_msg_ext_info:
    #          
    self._parse_articles(app_msg_ext_info, msg_id, post_time)
    #          
    multi_app_msg_item_list = app_msg_ext_info.get('multi_app_msg_item_list')
    if multi_app_msg_item_list:
    for item in multi_app_msg_item_list:
    msg_id = item['fileid'] #   id
    if msg_id == 0:
    msg_id = int(time.time() * 1000) #     id,      id=0           
    self._parse_articles(item, msg_id, post_time)
    print('next offset is %d' % offset)
    else:
    print('Before break , Current offset is %d' % offset)
    break
    def _parse_articles(self, info, msg_id, post_time):
    """             """
    title = info.get('title') #   
    cover = info.get('cover') #    
    author = info.get('author') #   
    digest = info.get('digest') #    
    source_url = info.get('source_url') #     
    content_url = info.get('content_url') #     
    # ext_data = json.dumps(info, ensure_ascii=False) #     
    self.postgres.handler(self._save_article(), (msg_id, title, author, cover, digest,
    source_url, content_url, post_time,
    datetime.now()), fetch=True)
    @staticmethod
    def _save_article():
    sql = 'insert into tb_article(msg_id,title,author,cover,digest,source_url,content_url,post_time,create_time) ' \
    'values(%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    return sql 
    if __name__ == '__main__':
    biz = 'MzI2NDk5NzA0Mw==' # "36 "
    pass_ticket = 'NDndxxaZ7p6Z9PYulWpLqMbI0i3ULFeCPIHBFu1sf5pX2IhkGfyxZ6b9JieSYRUy'
    app_msg_token = '971_Z0lVNQBcGsWColSubRO9H13ZjrPhjuljyxLtiQ~~'
    cookie = 'wap_sid2=CO3YwOQHEogBQnN4VTNhNmxQWmc3UHI2U3kteWhUeVExZHFVMnN0QXlsbzVJRUJKc1pkdVFUU2Y5UzhSVEtOZmt1VVlYTkR4SEllQ2huejlTTThJWndMQzZfYUw2SldLVGVMQUthUjc3QWdVMUdoaGN0Nml2SU05cXR1dTN2RkhRUVd1V2Y3SFJ5d01BQUF+fjCB1pLcBTgNQJVO'
    #                          
    wxMps = WxMps(biz, pass_ticket, app_msg_token, cookie)
    wxMps.start() #       
    분석 문장 평론 인터페이스
    평론 을 얻 는 사고방식 은 대체로 같 지만,단지 좀 더 번 거 로 울 뿐이다.먼저 핸드폰 터미널 에 댓 글 이 있 는 글 을 열 고 Fiddler 가 캡 처 한 요청 을 확인 합 니 다.

    공중 호 문장 평론

    공중 호 글 평론 인터페이스 패키지 요청
    그 중의 URL 과 Cookie 를 추출 하여 재 분석:
    https://mp.weixin.qq.com/mp/appmsg_comment?action=getcomment&scene=0&__biz=MzI2NDk5NzA0Mw==&appmsgid=2247518723&idx=1&comment_id=433253969406607362&offset=0&limit=100&uin=777&key=777&pass_ticket=NDndxxaZ7p6Z9PYulWpLqMbI0i3ULFeCPIHBFu1sf5pX2IhkGfyxZ6b9JieSYRUy&wxtoken=777&devicetype=android-26&clientversion=26070237&appmsg_token=971_dLK7htA1j8LbMUk8pvJKRlC_o218HEgwDbS9uARPOyQ34_vfXv3iDstqYnq2gAyze1dBKm4ZMTlKeyfx&x5=1&f=json
    Cookie: pgv_pvid=2027337976; pgv_info=ssid=s3015512850; rewardsn=; wxuin=2089823341; devicetype=android-26; version=26070237; lang=zh_CN; pass_ticket=NDndxxaZ7p6Z9PYulWpLqMbI0i3ULFeCPIHBFu1sf5pX2IhkGfyxZ6b9JieSYRUy; wap_sid2=CO3YwOQHEogBdENPSVdaS3pHOWc1V2QzY1NvZG9PYk1DMndPS3NfbGlHM0Vfal8zLU9kcUdkWTQxdUYwckFBT3RZM1VYUXFaWkFad3NVaWFXZ28zbEFIQ2pTa1lqZktfb01vcGdPLTQ0aGdJQ2xOSXoxTVFvNUg3SVpBMV9GRU1lbnotci1MWWl5d01BQUF+fjCj45PcBTgNQAE=; wxtokenkey=777
    다음 분석 매개 변수:
  • __biz:동상
  • pass_ticket:동상
    Cookie:동상
  • 4.567917.offset 과 limit:오프셋 과 요청 수량 을 대표 합 니 다.공중 번호 평론 은 최대 100 개 를 보 여 주기 때문에 이 두 매개 변 수 는 고 칠 필요 가 없습니다
  • comment_id:글 댓 글 데이터 의 태그 id 를 가 져 옵 니 다.고정 적 이지 만 현재 글 구조(Html)에서 추출 해 야 합 니 다
  • appmsgid:어음 id,고정 되 지 않 을 때마다 현재 글 구조(Html)에서 추출 해 야 합 니 다
  • appmsg_token:어음 token,고정 되 지 않 은 매번 현재 글 구조(Html)에서 추출 해 야 합 니 다
  • 마지막 세 개의 매개 변 수 를 html 로 분석 하여 얻 을 수 있 습 니 다.글 요청 인터페이스 에서 글 주 소 를 얻 을 수 있 습 니 다.위의 content 에 대응 합 니 다.url 필드 입 니 다.그러나 이 주 소 를 요청 하기 전에 url 에 대해 관련 처 리 를 해 야 합 니 다.그렇지 않 으 면 위의 세 개의 매개 변수 가 부족 하고 뒤의 댓 글 내용 을 얻 을 수 없습니다.
    
    def _parse_article_detail(self, content_url, article_id):
    """                ,article_id       id"""
    try:
    api = content_url.replace('amp;', '').replace('#wechat_redirect', '').replace('http', 'https')
    html = requests.get(api, headers=self.headers).text
    except:
    print('      ' + content_url)
    else:
    # group(0) is current line
    str_comment = re.search(r'var comment_id = "(.*)" \|\| "(.*)" \* 1;', html)
    str_msg = re.search(r"var appmsgid = '' \|\| '(.*)'\|\|", html)
    str_token = re.search(r'window.appmsg_token = "(.*)";', html)
    if str_comment and str_msg and str_token:
    comment_id = str_comment.group(1) #   id(  )
    app_msg_id = str_msg.group(1) #   id(   )
    appmsg_token = str_token.group(1) #   token(   )
    이 인터페이스 에서 돌아 온 json 데 이 터 를 다시 보고 구 조 를 분석 한 다음 에 데이터 시트(SQL 포함)를 정의 합 니 다.

    글 리 뷰 데이터 시트
    
    -- ----------------------------
    -- Table structure for tb_article_comment
    -- ----------------------------
    DROP TABLE IF EXISTS "public"."tb_article_comment";
    CREATE TABLE "public"."tb_article_comment" (
    "id" serial4 PRIMARY KEY,
    "article_id" int4 NOT NULL,
    "comment_id" varchar(50) COLLATE "pg_catalog"."default",
    "nick_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
    "logo_url" varchar(300) COLLATE "pg_catalog"."default",
    "content_id" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
    "content" varchar(3000) COLLATE "pg_catalog"."default" NOT NULL,
    "like_num" int2,
    "comment_time" timestamp(6),
    "create_time" timestamp(6) NOT NULL
    )
    ;
    COMMENT ON COLUMN "public"."tb_article_comment"."id" IS '    ';
    COMMENT ON COLUMN "public"."tb_article_comment"."article_id" IS '    id';
    COMMENT ON COLUMN "public"."tb_article_comment"."comment_id" IS '    id';
    COMMENT ON COLUMN "public"."tb_article_comment"."nick_name" IS '    ';
    COMMENT ON COLUMN "public"."tb_article_comment"."logo_url" IS '    ';
    COMMENT ON COLUMN "public"."tb_article_comment"."content_id" IS '  id (  )';
    COMMENT ON COLUMN "public"."tb_article_comment"."content" IS '    ';
    COMMENT ON COLUMN "public"."tb_article_comment"."like_num" IS '   ';
    COMMENT ON COLUMN "public"."tb_article_comment"."comment_time" IS '    ';
    COMMENT ON COLUMN "public"."tb_article_comment"."create_time" IS '    ';
    COMMENT ON TABLE "public"."tb_article_comment" IS '        ';
    -- ----------------------------
    -- Indexes structure for table tb_article_comment
    -- ----------------------------
    CREATE UNIQUE INDEX "unique_content_id" ON "public"."tb_article_comment" USING btree (
    "content_id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
    );
    만리장정 이 곧 끝 날 것 입 니 다.마지막 으로 이 코드 를 붙 입 니 다.먼저 글 의 주 소 를 가 져 와 야 하기 때문에 위 에서 글 의 데 이 터 를 가 져 오 는 코드 와 함께 있 습 니 다.
    
    import json
    import re
    import time
    from datetime import datetime
    
    import requests
    
    from utils import pgs
    
    
    class WxMps(object):
    """       、      """
    
    def __init__(self, _biz, _pass_ticket, _app_msg_token, _cookie, _offset=0):
    self.offset = _offset
    self.biz = _biz #      
    self.msg_token = _app_msg_token #   (   )
    self.pass_ticket = _pass_ticket #   (   )
    self.headers = {
    'Cookie': _cookie, # Cookie(   )
    'User-Agent': 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 '
    }
    wx_mps = 'wxmps' #      、  、    (       )
    self.postgres = pgs.Pgs(host='localhost', port='5432', db_name=wx_mps, user=wx_mps, password=wx_mps)
    
    def start(self):
    """            """
    
    offset = self.offset
    while True:
    api = 'https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz={0}&f=json&offset={1}' \
    '&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket={2}&wxtoken=&appmsg_token' \
    '={3}&x5=1&f=json'.format(self.biz, offset, self.pass_ticket, self.msg_token)
    
    resp = requests.get(api, headers=self.headers).json()
    ret, status = resp.get('ret'), resp.get('errmsg') #     
    if ret == 0 or status == 'ok':
    print('Crawl article: ' + api)
    offset = resp['next_offset'] #         
    general_msg_list = resp['general_msg_list']
    msg_list = json.loads(general_msg_list)['list'] #       
    for msg in msg_list:
    comm_msg_info = msg['comm_msg_info'] #                
    msg_id = comm_msg_info['id'] #   id
    post_time = datetime.fromtimestamp(comm_msg_info['datetime']) #     
    # msg_type = comm_msg_info['type'] #     
    # msg_data = json.dumps(comm_msg_info, ensure_ascii=False) # msg   
    
    app_msg_ext_info = msg.get('app_msg_ext_info') # article   
    if app_msg_ext_info:
    #          
    self._parse_articles(app_msg_ext_info, msg_id, post_time)
    #          
    multi_app_msg_item_list = app_msg_ext_info.get('multi_app_msg_item_list')
    if multi_app_msg_item_list:
    for item in multi_app_msg_item_list:
    msg_id = item['fileid'] #   id
    if msg_id == 0:
    msg_id = int(time.time() * 1000) #     id,      id=0           
    self._parse_articles(item, msg_id, post_time)
    print('next offset is %d' % offset)
    else:
    print('Before break , Current offset is %d' % offset)
    break
    
    def _parse_articles(self, info, msg_id, post_time):
    """             """
    
    title = info.get('title') #   
    cover = info.get('cover') #    
    author = info.get('author') #   
    digest = info.get('digest') #    
    source_url = info.get('source_url') #     
    content_url = info.get('content_url') #     
    # ext_data = json.dumps(info, ensure_ascii=False) #     
    
    content_url = content_url.replace('amp;', '').replace('#wechat_redirect', '').replace('http', 'https')
    article_id = self.postgres.handler(self._save_article(), (msg_id, title, author, cover, digest,
    source_url, content_url, post_time,
    datetime.now()), fetch=True)
    if article_id:
    self._parse_article_detail(content_url, article_id)
    
    def _parse_article_detail(self, content_url, article_id):
    """                ,article_id       id"""
    
    try:
    html = requests.get(content_url, headers=self.headers).text
    except:
    print('      ' + content_url)
    else:
    # group(0) is current line
    str_comment = re.search(r'var comment_id = "(.*)" \|\| "(.*)" \* 1;', html)
    str_msg = re.search(r"var appmsgid = '' \|\| '(.*)'\|\|", html)
    str_token = re.search(r'window.appmsg_token = "(.*)";', html)
    
    if str_comment and str_msg and str_token:
    comment_id = str_comment.group(1) #   id(  )
    app_msg_id = str_msg.group(1) #   id(   )
    appmsg_token = str_token.group(1) #   token(   )
    
    #     
    if appmsg_token and app_msg_id and comment_id:
    print('Crawl article comments: ' + content_url)
    self._crawl_comments(app_msg_id, comment_id, appmsg_token, article_id)
    
    def _crawl_comments(self, app_msg_id, comment_id, appmsg_token, article_id):
    """       """
    
    api = 'https://mp.weixin.qq.com/mp/appmsg_comment?action=getcomment&scene=0&__biz={0}' \
    '&appmsgid={1}&idx=1&comment_id={2}&offset=0&limit=100&uin=777&key=777' \
    '&pass_ticket={3}&wxtoken=777&devicetype=android-26&clientversion=26060739' \
    '&appmsg_token={4}&x5=1&f=json'.format(self.biz, app_msg_id, comment_id,
    self.pass_ticket, appmsg_token)
    resp = requests.get(api, headers=self.headers).json()
    ret, status = resp['base_resp']['ret'], resp['base_resp']['errmsg']
    if ret == 0 or status == 'ok':
    elected_comment = resp['elected_comment']
    for comment in elected_comment:
    nick_name = comment.get('nick_name') #   
    logo_url = comment.get('logo_url') #   
    comment_time = datetime.fromtimestamp(comment.get('create_time')) #     
    content = comment.get('content') #     
    content_id = comment.get('content_id') # id
    like_num = comment.get('like_num') #    
    # reply_list = comment.get('reply')['reply_list'] #     
    
    self.postgres.handler(self._save_article_comment(), (article_id, comment_id, nick_name, logo_url,
    content_id, content, like_num, comment_time,
    datetime.now()))
    
    @staticmethod
    def _save_article():
    sql = 'insert into tb_article(msg_id,title,author,cover,digest,source_url,content_url,post_time,create_time) ' \
    'values(%s,%s,%s,%s,%s,%s,%s,%s,%s) returning id'
    return sql
    
    @staticmethod
    def _save_article_comment():
    sql = 'insert into tb_article_comment(article_id,comment_id,nick_name,logo_url,content_id,content,like_num,' \
    'comment_time,create_time) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    return sql
    
    if __name__ == '__main__':
    biz = 'MzI2NDk5NzA0Mw==' # "36 "
    pass_ticket = 'NDndxxaZ7p6Z9PYulWpLqMbI0i3ULFeCPIHBFu1sf5pX2IhkGfyxZ6b9JieSYRUy'
    app_msg_token = '971_Z0lVNQBcGsWColSubRO9H13ZjrPhjuljyxLtiQ~~'
    cookie = 'wap_sid2=CO3YwOQHEogBQnN4VTNhNmxQWmc3UHI2U3kteWhUeVExZHFVMnN0QXlsbzVJRUJKc1pkdVFUU2Y5UzhSVEtOZmt1VVlYTkR4SEllQ2huejlTTThJWndMQzZfYUw2SldLVGVMQUthUjc3QWdVMUdoaGN0Nml2SU05cXR1dTN2RkhRUVd1V2Y3SFJ5d01BQUF+fjCB1pLcBTgNQJVO'
    #                          
    wxMps = WxMps(biz, pass_ticket, app_msg_token, cookie)
    wxMps.start() #          
    문말 소결
    마지막 으로 데이터 베이스 에 있 는 데 이 터 를 보 여 주 었 습 니 다.일방 통행 이 느 리 고 이런 데이터 수요 도 없 기 때문에 마음대로 손 을 써 보 았 습 니 다.

    캡 처 한 부분 데이터
    파충류 라 고 쓰 는 것 은 세심 한 일이 다.너무 귀 찮 으 면WechatSogou이 도 구 를 알 아 보 는 것 을 추천한다.문제 가 있 는 것 은 아래쪽 에 댓 글 을 달 아 토론 하 는 것 을 환영 합 니 다.
    전체 코드:GitHub
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기