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"後面的就是可以轉化為jsaon陣列的資料了。
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引數不一樣
還是搜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驗證的提示,不管也行urllib3.disable_warnings()
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 numsin range(14, 49):# 這裡是模擬頁數,在獲取groupMembersList的返回資訊裡有max_pageprint('***************第幾頁='+str(nums))
print('***************第幾頁='+str(nums))
# urluser = "https://m.weibo.cn/groupChat/userChat/groupMembersList?group_id=4197189808619503&page="+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)
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'])
# print(len(card_group))
for numin range(0, len(card_group)):
member = card_group[num]
print(member['member']['id'])
print(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)
time.sleep(30)
guanzhugroup(4075182799395477)
簡書好像沒對程式碼做處理,複製過來不太對了。 可以去下載
篇幅比較長,其實東西不多,如果沒研究過類似的東西會比較難上手,可以先收藏,再研究。