前言:
听说很多小伙伴因为疫情在家快憋坏了,要不试试一起对着电脑吼两声发泄一下?吼的够大声就可以自动发条微博庆祝一下?废话不多说,让我们愉快地开始吧~
开发工具
Python版本:3.6.4
相关模块:
DecryptLogin模块;
argparse模块;
pyaudio模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
既然要实现自动发微博,首先自然要实现微博模拟登录啦。这里我们还是借助公众号开源的模拟登录包DecryptLogin来实现:
'''利用DecryptLogin模拟登录'''
@staticmethod
def login(username, password):
lg = login.Login()
infos_return, session = lg.weibo(username, password, 'pc')
return infos_return.get('nick'), infos_return.get('uid'), session
接着我们来新建一个文件夹(例如weibo),在这个文件夹里放我们需要发的微博的内容:
weibo文件夹里的内容如下:
其中pictures文件夹里放我们微博的配图:
weibo.md里写我们微博的文字内容:
写个函数来自动解析一下上面的微博内容:
'''待发送微博内容解析'''
def __parseWeibo(self, weibopath):
text = open(os.path.join(weibopath, 'weibo.md'), 'r', encoding='utf-8').read()
pictures = []
for filename in sorted(os.listdir(os.path.join(weibopath, 'pictures'))):
if filename.split('.')[-1].lower() in ['jpg', 'png']:
pictures.append(open(os.path.join(weibopath, 'pictures', filename), 'rb').read())
if len(pictures) > 9:
print('[Warning]: 一条微博最多只能有9张配图, 程序现在将自动剔除多出的图片')
pictures = pictures[:9]
return text, pictures
该函数可以根据传入的微博文件夹路径(例如我们刚刚在当前目录新建了一个名为weibo的文件夹,那么我们可以传入./weibo)来自动解析待发送的微博内容(文字+配图)。
成功解析微博内容后,进入我们的重头戏,对着电脑大吼一声来自动发微博。原理说起来其实很简单,就是利用python的pyaudio包来检测当前电脑麦克风输入的声音音量,当音量足够大时(需要在30s内达到设定的最小音量),就自动把刚刚的微博发送出去:
# 大吼一声确定是该微博
print('微博内容为: %s\n配图数量为: %s' % (text, len(pictures)))
print('如果您确认想发这条微博, 请在30s内对着电脑大吼一声')
stream = pyaudio.PyAudio().open(format=pyaudio.paInt16,
channels=1,
rate=int(pyaudio.PyAudio().get_device_info_by_index(0)['defaultSampleRate']),
input=True,
frames_per_buffer=1024)
is_send_flag = False
start_t = time.time()
while True:
time.sleep(0.1)
audio_data = stream.read(1024)
k = max(struct.unpack('1024h', audio_data))
# --声音足够大, 发送这条微博
if k > 8000:
is_send_flag = True
break
# --时间到了还没有足够大的声音, 不发这条微博
if (time.time() - start_t) > 30:
break
# 发送微博
if is_send_flag:
print('大吼成功! 准备开始发送该条微博~')
if self.__sendWeibo(text, pictures):
print('[INFO]: 微博发送成功!')
有小伙伴可能会问了,咋自动发微博?和网上的教程一样去注册SDK么?当然,不是啦,注册SDK多麻烦(还经常通不过注册T_T)。直接试着发条微博抓个包不就行了么:
我们可以很容易发现,图片上传用的是这个接口:
发微博用的则是这个接口:
于是我们可以很轻松地写出自动发微博的函数来:
'''发微博'''
def __sendWeibo(self, text, pictures):
# 上传图片
pic_id = []
url = 'https://picupload.weibo.com/interface/pic_upload.php'
params = {
'data': '1',
'p': '1',
'url': 'weibo.com/u/%s' % self.uid,
'markpos': '1',
'logo': '1',
'nick': '@%s' % self.nickname,
'marks': '1',
'app': 'miniblog',
's': 'json',
'pri': 'null',
'file_source': '1'
}
for picture in pictures:
res = self.session.post(url, headers=self.headers, params=params, data=picture)
res_json = res.json()
if res_json['code'] == 'A00006':
pid = res_json['data']['pics']['pic_1']['pid']
pic_id.append(pid)
time.sleep(random.random()+0.5)
# 发微博
url = 'https://www.weibo.com/aj/mblog/add?ajwvr=6&__rnd=%d' % int(time.time() * 1000)
data = {
'title': '',
'location': 'v6_content_home',
'text': text,
'appkey': '',
'style_type': '1',
'pic_id': '|'.join(pic_id),
'tid': '',
'pdetail': '',
'mid': '',
'isReEdit': 'false',
'gif_ids': '',
'rank': '0',
'rankid': '',
'pub_source': 'page_2',
'topic_id': '',
'updata_img_num': str(len(pictures)),
'pub_type': 'dialog'
}
headers = self.headers.copy()
headers.update({'Referer': 'http://www.weibo.com/u/%s/home?wvr=5' % self.uid})
res = self.session.post(url, headers=headers, data=data)
is_success = False
if res.status_code == 200:
is_success = True
return is_success
效果展示
运行方式:
python weiboSender.py --username 用户名 --password 密码
文章到这里就结束了,感谢你的观看,Python模拟登录系列系列,下篇文章分享淘宝商品数据并实现数据可视化。
为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
⑥ 两天的Python爬虫训练营直播权限
All done~点赞+评论~详见个人简介或者私信获取完整源代码。。