一.開發(fā)環(huán)境
python3.6
windows7
chrome谷歌瀏覽器
需要的python的包 requests
親測可運行也切,時間(2019-1-30)
二.找到需要的數(shù)據(jù)
2.1 在電腦上找到微博群
打開chrome瀏覽器
先清緩存碎罚,ctrl+shift +del 博秫,清空cookie等緩存數(shù)據(jù)
按F12葫男,點擊調(diào)試界面左上角的按鈕進入手機模式?
f5刷新進入https://m.weibo.cn,這么做主要是為了能夠在手機上看到自己的微博群。
??
群自己用手機app搜然后添加吧(這是唯一比較麻煩的地方了,trust me!)
2.2 group_id
?
(隨筆=》隨便)手誤剥汤,見諒。
把group_id記錄下來排惨,代碼會用到吭敢。
2.3 關(guān)注,需要的數(shù)據(jù)
首先暮芭,當(dāng)然是群里所有成員的列表了鹿驼,關(guān)注某個人至少需要他的用戶id吧。
??
?
點開更多成員后成員列表往下拉一段辕宏,在右邊的network找到groupmemberslist?group_id=xxx這條消息畜晰。注意在點“更多成員”之前,可以清一下network里的東西瑞筐,比較好找凄鼻。(覺得頭疼不好找?其實我也經(jīng)歷過,多折騰一會就好了)
urluser ="https://m.weibo.cn/groupChat/userChat/groupMembersList?group_id=%s&page=%d"% (groupid, nums)
這里面的page參數(shù)就是第幾頁群成員面哼,不會一次給你下發(fā)所有的成員野宜。(實際需要下拉扫步,才一點一點的展示出來)
返回的數(shù)據(jù)上圖的Response就包含了群成員的信息魔策,很長。
可以復(fù)制下來河胎,百度json找個網(wǎng)站格式化http://www.bejson.com/
?
id就是群用戶的id闯袒,screen_name的值顯示一堆“亂碼”,事實就是群用戶的昵稱(可以百度“編碼”找網(wǎng)站 unicode轉(zhuǎn)中文看看http://tool.chinaz.com/tools/unicode.aspx游岳,可以忽略不影響步驟政敢。)
正則找出respone返回的值里用card_group和后面 用[ ]包裹的json數(shù)據(jù)——用戶的信息, 正則不熟的話胚迫,只能自己研究研究了喷户,這里不多說。
pattern = re.compile('\['+'(.*?)'+']',re.S)json1 = pattern.findall(respone.text)[0]+']}'
?
"card_group"后面的就是可以轉(zhuǎn)化為jsaon數(shù)組的數(shù)據(jù)了访锻。
json_base = json.loads(json1)
card_group = json_base['card_group']
====================中場休息=========================
2.4這篇文章里不打算寫登錄獲取cookie(比較麻煩褪尝,容易有挫敗感。期犬。)
登錄后河哑,隨便找人點個關(guān)注
?
2.5 兩個st參數(shù)
關(guān)注和發(fā)送群信息,各需要一個會變化的st參數(shù)
2.51關(guān)注的需要的st參數(shù)(唯二麻煩的)
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龟虎,我告訴你猜的你會想揍我嗎璃谨。。
其實在電腦上自己手動點關(guān)注的時候,在create里的headers的formdata里看到st的值佳吞,然后搜索拱雏。在一個respone里看到了
?
然后看到一個 叫config的,就比較順眼底扳,看看他的headers 里的urlhttps://m.weibo.cn/api/config古涧,嘗試復(fù)制到瀏覽器地址欄里,馬上就返回我想要的值
{"preferQuickapp":0,"data":{"login":true,"st":"1de4bb","uid":"5156567902"},"ok":1}花盐。
嗯羡滑,冥冥之中自有定數(shù),是它了算芯。
(找不到的話最好在打開群的界面刷新一次柒昏,可能在前面的操作里被你清掉了)
2.51發(fā)群信息需要的st參數(shù)(唯三麻煩的,事不過三)
首先熙揍,自己找個群职祷,發(fā)個消息
?
sendMsg,需要額外獲取的就是st參數(shù)。
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]#在群里發(fā)消息需要的參數(shù)st届囚,注意和關(guān)注的st參數(shù)不一樣
還是搜eec616有梆,不行就再打開群的界面,刷新瀏覽器意系,再搜泥耀。最終發(fā)現(xiàn)只有一條符合的
?
在respone發(fā)現(xiàn) "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):# 這里是模擬頁數(shù)夸溶,在獲取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請求傳的數(shù)據(jù)
? ? ? ? ? ? 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]#在群里發(fā)消息需要的參數(shù)st,注意和關(guān)注的st參數(shù)不一樣
? ? ? ? ? ? ? ? sendmsg_url ='https://m.weibo.cn/groupChat/userChat/sendMsg'
? ? ? ? ? ? ? ? sendmsg_data = {
'content':'@%s 我關(guān)注你了' % member['member']['screen_name'],#這里的@沒有實際的@功能凶硅,電腦上不太好@缝裁,不知道實際的@發(fā)的是什么。還在研究用手機設(shè)置代理或者安卓模擬器抓個包試試
? ? ? ? ? ? ? ? ? ? '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)
簡書好像沒對代碼做處理足绅,復(fù)制過來不太對了捷绑。可以去下載
篇幅比較長,其實東西不多编检,如果沒研究過類似的東西會比較難上手胎食,可以先收藏,再研究允懂。