python3 微博羣關注 自動發羣消息

一.開發環境

python3.6

windows7

chrome谷歌瀏覽器

需要的python的包 requests

親測可運行,時間(2019-1-30)

二.找到需要的數據

2.1 在電腦上找到微博羣

先清緩存  ,ctrl+shift +del ,清空cookie等緩存數據

打開chrome瀏覽器,按F12,點擊進入手機模式

f5刷新進入https://m.weibo.cn,這麼做主要是爲了能夠在電腦上看到自己的微博羣。

羣自己用手機app搜然後添加吧(這是唯一比較麻煩的地方了,trust me!)

2.2 group_id

 

(隨筆=》隨便)手誤,見諒。

group_id記錄下來,代碼會用到。

 

2.3 關注,需要的數據

首先,當然是羣裏所有成員的列表了,關注某個人至少需要他的用戶id吧。

點開更多成員後往下拉一段,在右邊的network找到groupmemberslist?group_id=xxx這條消息。注意在點“更多成員”之前,可以清一下network裏的東西,比較好找。(覺得頭疼不好找?其實我也經歷過,多折騰一會就好了)

urluser = "https://m.weibo.cn/groupChat/userChat/groupMembersList?group_id=%s&page=%d" % (groupid, nums)

這裏面的page參數就是第幾頁羣成員,不會一次給你下發所有的成員。(實際需要下拉,才一點一點的展示出來)

返回的數據上圖的Response就包含了羣成員的信息,很長。

可以複製下來,百度json找個網站格式化 http://www.bejson.com/

 id就是羣用戶的id,screen_name就是顯示的暱稱(可以百度“編碼”找網站 unicode轉中文看看http://tool.chinaz.com/tools/unicode.aspx,可以不管。)

 

正則找出respone返回的值裏用card_group和後面 用[ ]包裹的json數據——用戶的信息, 正則不熟的話,只能自己研究研究了,這裏不多說。

pattern = re.compile('\['+'(.*?)'+']',re.S)
json1 = pattern.findall(respone.text)[0]+']}'

"card_group"後面的就是可以轉化爲json數組的數據了。

json_base = json.loads(json1)
card_group = json_base['card_group']

================================中場休息================================ 

2.4這篇文章裏不打算寫登錄獲取cookie(比較麻煩,容易有挫敗感。。)

登錄後,隨便找人點個關注 

2.5 兩個st參數

關注和發送羣信息,各需要一個會變化的st參數

2.51關注的需要的st參數(唯二麻煩的)

        st_url = 'https://m.weibo.cn/api/config/'
        st_respone = requests.post(st_url, headers=headetr2, verify=False)
        st_json = json.loads(st_respone.content)
        print('st = ' + st_json['data']['st'])

st_url 如果你想問爲什麼是這個url,我告訴你猜的你會想揍我嗎。。

其實在電腦上自己手動點關注的時候,在create裏的headers的formdata裏看到st的值,然後搜索。在一個respone裏看到了

 

然後看到一個 叫config的,就比較順眼,看看他的headers 裏的url https://m.weibo.cn/api/config,嘗試複製到瀏覽器地址欄裏,馬上就返回我想要的值

{"preferQuickapp":0,"data":{"login":true,"st":"1de4bb","uid":"5156567902"},"ok":1}。

嗯,冥冥之中自有定數,是它了。

(找不到的話最好在打開羣的界面刷新一次,可能在前面的操作裏被你清掉了)

2.51發羣信息需要的st參數(唯三麻煩的,事不過三)

首先,還是在剛纔的羣,發個消息

sendMsg,需要額外獲取的就是st參數。

chatgroup_url = 'https://m.weibo.cn/groupChat/userChat/chat?group_id=' + str(groupid)
chatgroup_respone = requests.get(chatgroup_url, headers=headetr2, verify=False)


try:

   chat_st = re.search(r'\"st\":\"(\w+)\"', chatgroup_respone.text)

   chat_st_param = chat_st.group().split('"')[3]#在羣裏發消息需要的參數st,注意和關注的st參數不一樣

 還是搜剛纔sendmsg裏Headers的form data st:eec616,不行就再打開羣的界面,刷新瀏覽器,再搜。最終發現只有一條符合的

在respone發現 "st":"eec616" 有2個,用正則匹配其中一個就行。

 

3.最後上代碼

headers裏的cookie用自己的

guanzhugroup(xxxx)這裏的groupid,需要是自己加入的羣

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import sys
import json
import time

import re

import urllib3#不顯示ssh驗證的提示,不管也行
urllib3.disable_warnings()#不顯示ssh驗證的提示,不管也行

headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Cookie': '_T_WM=**************************',#步驟2.4登錄微博後找到requestheader裏的cookie
        'Host': 'm.weibo.cn',
        'RA-Sid': 'B781E81A-20150402-024118-ce25e1-ba5345',
        'RA-Ver': '3.0.8',
        # 'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Mobile Safari/537.36',
        'Referer': 'https://m.weibo.cn/message',
    }

def guanzhugroup(groupid):

    for nums in range(1, 49):  # 這裏是模擬頁數,在獲取groupMembersList的返回信息裏有max_page
        print('***************第幾頁='+str(nums))
        
        urluser = "https://m.weibo.cn/groupChat/userChat/groupMembersList?group_id=%s&page=%d" % (groupid, nums)

        respone = requests.get(urluser, headers=headers, verify=False)

        
        print(respone.text)
        pattern = re.compile('\['+'(.*?)'+']',re.S)
        json1 = pattern.findall(respone.text)[0]+']}'

        json_base = json.loads(json1)
        print(json_base)

        card_group = json_base['card_group']

        st_url = 'https://m.weibo.cn/api/config/'
        st_respone = requests.post(st_url, headers=headers, verify=False)
        st_json = json.loads(st_respone.content)
        print('st = ' + st_json['data']['st'])

        
        for num in range(0, len(card_group)):
            member = card_group[num]
            print(member['member']['id'])
            print(member['member']['screen_name'])

            postData2 = {"uid": member['member']['id'], 'st': st_json['data']['st']}  # post請求傳的數據
            url = 'https://m.weibo.cn/api/friendships/create'

            respone1 = requests.post(url, data=postData2, headers=headers,verify=False)
            print(respone1.text)
            json_str = respone1.content

            chatgroup_url = 'https://m.weibo.cn/groupChat/userChat/chat?group_id=' + str(groupid)
            chatgroup_respone = requests.get(chatgroup_url, headers=headers, verify=False)
            print(chatgroup_respone.text)

            try:

                chat_st = re.search(r'\"st\":\"(\w+)\"', chatgroup_respone.text)

                chat_st_param = chat_st.group().split('"')[3]#在羣裏發消息需要的參數st,注意和關注的st參數不一樣


                sendmsg_url = 'https://m.weibo.cn/groupChat/userChat/sendMsg'
                sendmsg_data = {
                    'content': '@%s 我關注你了。' % member['member']['screen_name'],
                    'st': chat_st_param,
                    'group_id': groupid,
                }
                sendmsg_respone = requests.post(sendmsg_url, headers=headers, data=sendmsg_data, verify=False)
                print('send msg ret = '+sendmsg_respone.text)

            except Exception as e:
                print(e)

            time.sleep(10)#sleep,都是爲了請求不要太快,給服務器造成壓力不說還容易被封



    time.sleep(30)#sleep,都是爲了請求不要太快,給服務器造成壓力不說還容易被封

guanzhugroup(4075182799395477)

篇幅比較長,其實東西不多,如果沒研究過類似的東西會比較難上手,可以先收藏,再研究。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章