Python爬虫实战,pyaudio模块,Python模拟登录微博实现大吼一声来发微博

2021年7月21日 4点热度 0条评论 来源: 楚_阳

前言:

听说很多小伙伴因为疫情在家快憋坏了,要不试试一起对着电脑吼两声发泄一下?吼的够大声就可以自动发条微博庆祝一下?废话不多说,让我们愉快地开始吧~

开发工具

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~点赞+评论~详见个人简介或者私信获取完整源代码。。

    原文作者:楚_阳
    原文地址: https://www.cnblogs.com/daimubai/p/15030206.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。