项目开源代码地址:https://github.com/vincenth520/Spider/tree/master/weibo
这个微博从2011年10月26日起,坚持每天都在微博上按干支计时的每个时辰发送“铛”声,时间分秒不差,这样的微博样式一直坚持了一年多!而且所有微博除了“铛”和多个“铛”字外,并无其他内容,页面非常整齐、干净、纯粹。目前,该微博已经有了超过80万的粉丝!
而这样的另类微博自然戳中了广大网友的小店,网友纷纷排气长队献上各种神回复。网友不禁赞叹古城钟楼为“史上最无聊和最有毅力微博”。
但是稍微有点技术的人就应该知道,这并不是人工手法的。今天我们就来利用python3模仿这个古城钟楼
需要发微博,自然需要先登录微博
首先还是得先去分析微博的登录过程,首先访问微博的手机版登录页面https://passport.weibo.cn/signin/login,随便输入用户名密码登录
我们多打开几个窗口随便输入几次,就会发现除了username跟password会变其他都不会变,所以我们只需要直接将用户名密码与这些写死的参数拼接发送给登录地址就行
登录微博
#登录
def login(code=0):
login_data = configparser.ConfigParser()
login_data.read("user.ini") #将用户名密码放在user.ini配置文件
username = login_data.get("LoginInfo", "email")
password = login_data.get("LoginInfo", "password")
login_url = 'https://passport.weibo.cn/sso/login'
# 构造登录参数
params = {
'username':username,
'password':password,
'savestate':'1',
'r':'',
'ec':'0',
'pagerefer':'',
'entry':'mweibo',
'wentry':'',
'loginfrom':'',
'client_id':'',
'code':'',
'qq':'',
'mainpageflag':'1',
'hff':'',
'hfp':''
}
params = parse.urlencode(params).encode('utf-8')
req = request.Request(login_url,params,method="POST")
res = request.urlopen(req)
result = res.read().decode('utf-8')
login_result = json.loads(result)
if login_result['msg'] == '': #如果没有报错信息,说明登录成功
print('登陆成功')
return True
else:
print(login_result['msg'])
return False
获取当前时辰,拼接当前时辰的微博
def get_content():
time_data = ['子时','丑时','寅时','卯时','辰时','巳时','午时','未时','申时','酉时','戌时','亥时']
now = int(time.strftime('%H',time.localtime(time.time())))
now_tm = now%12
res_str = ''
for x in range(now_tm):
res_str += '铛~'
res_str = '【'+time_data[math.floor(now/2)] + '】' + res_str
return res_str
我们接着分析发微博过程我们首先点击发微博打开的地址是:https://m.weibo.cn/compose
然后随便输入微博内容,点击发送,抓包发现,发送微博提交的地址是:https://m.weibo.cn/api/statuses/update,提交的内容为content=sda&st=ba1f65
,其中sda为自己随意输入的微博内容,然后我们再去分析发送发微博的页面,发现源码中存在一个st参数,于是我们需要先去抓取这个st参数才能拼接发送
获取st参数
def get_st():
url = 'https://m.weibo.cn/compose'
req =request.Request(url)
res = request.urlopen(req)
html = res.read().decode('utf-8')
return re.search("st: '(.*)'", html).group(1)
最后是直接将微博内容与st参数拼接发送即可
发微博
def weibo(content):
st = get_st()
add_weibo_url = 'https://m.weibo.cn/api/statuses/update'
# 构造登录参数
params = {
'content':content,
'st':st
}
params = parse.urlencode(params).encode('utf-8')
req =request.Request(add_weibo_url,params,method="POST")
res = request.urlopen(req)
html = res.read().decode('utf-8')
print(html)
然后测试效果
完整代码地址:https://github.com/vincenth520/Spider/tree/master/weibo