一.开发环境
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)
篇幅比较长,其实东西不多,如果没研究过类似的东西会比较难上手,可以先收藏,再研究。
个人公众号刚刚上线。专注python小白教程,有需要的可以推荐给朋友哦
搜索“猫叔学编程”